@effect-app/infra 0.198.1 → 0.199.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.
- package/CHANGELOG.md +26 -0
- package/_cjs/RequestContext.cjs +14 -9
- package/_cjs/RequestContext.cjs.map +1 -1
- package/_cjs/_ext/Array.cjs +3 -7
- package/_cjs/_ext/Array.cjs.map +1 -1
- package/_cjs/api/reportError.cjs +3 -6
- package/_cjs/api/reportError.cjs.map +1 -1
- package/_cjs/api/routing/base.cjs +27 -61
- package/_cjs/api/routing/base.cjs.map +1 -1
- package/_cjs/api/routing/defaultErrorHandler.cjs +14 -21
- package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -1
- package/_cjs/api/routing/makeRequestHandler.cjs +44 -51
- package/_cjs/api/routing/makeRequestHandler.cjs.map +1 -1
- package/_cjs/api/routing/match.cjs +6 -13
- package/_cjs/api/routing/match.cjs.map +1 -1
- package/_cjs/api/{express → routing}/schema/jwt.cjs +3 -4
- package/_cjs/api/routing/schema/jwt.cjs.map +1 -0
- package/_cjs/api/routing/schema/routing.cjs +136 -0
- package/_cjs/api/routing/schema/routing.cjs.map +1 -0
- package/_cjs/api/setupRequest.cjs +16 -22
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/errorReporter.cjs +16 -17
- package/_cjs/errorReporter.cjs.map +1 -1
- package/_cjs/errors.cjs +2 -4
- package/_cjs/errors.cjs.map +1 -1
- package/_cjs/filter/types/path/index.cjs +0 -2
- package/_cjs/filter/types/path/index.cjs.map +1 -1
- package/_cjs/filter.cjs +35 -0
- package/_cjs/filter.cjs.map +1 -1
- package/_cjs/logger/jsonLogger.cjs +9 -15
- package/_cjs/logger/jsonLogger.cjs.map +1 -1
- package/_cjs/logger/logFmtLogger.cjs +7 -11
- package/_cjs/logger/logFmtLogger.cjs.map +1 -1
- package/_cjs/logger/shared.cjs +6 -8
- package/_cjs/logger/shared.cjs.map +1 -1
- package/_cjs/rateLimit.cjs +9 -12
- package/_cjs/rateLimit.cjs.map +1 -1
- package/_cjs/services/Emailer/Sendgrid.cjs +9 -16
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
- package/_cjs/services/Emailer/fake.cjs +5 -8
- package/_cjs/services/Emailer/fake.cjs.map +1 -1
- package/_cjs/services/Emailer/service.cjs +2 -4
- package/_cjs/services/Emailer/service.cjs.map +1 -1
- package/_cjs/services/Operations/live.cjs +29 -42
- package/_cjs/services/Operations/live.cjs.map +1 -1
- package/_cjs/services/Operations/service.cjs +15 -15
- package/_cjs/services/Operations/service.cjs.map +1 -1
- package/_cjs/services/QueueMaker/errors.cjs +8 -12
- package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
- package/_cjs/services/QueueMaker/memQueue.cjs +27 -33
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs +31 -40
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/service.cjs +7 -9
- package/_cjs/services/QueueMaker/service.cjs.map +1 -1
- package/_cjs/services/Repository/dsl.cjs +11 -14
- package/_cjs/services/Repository/dsl.cjs.map +1 -1
- package/_cjs/services/Repository/ext.cjs +62 -71
- package/_cjs/services/Repository/ext.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +171 -169
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/RequestContextContainer.cjs +17 -23
- package/_cjs/services/RequestContextContainer.cjs.map +1 -1
- package/_cjs/services/Store/ContextMapContainer.cjs +10 -16
- package/_cjs/services/Store/ContextMapContainer.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos/query.cjs +5 -9
- package/_cjs/services/Store/Cosmos/query.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos.cjs +58 -68
- package/_cjs/services/Store/Cosmos.cjs.map +1 -1
- package/_cjs/services/Store/Disk.cjs +34 -36
- package/_cjs/services/Store/Disk.cjs.map +1 -1
- package/_cjs/services/Store/Memory.cjs +55 -65
- package/_cjs/services/Store/Memory.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.cjs +2 -4
- package/_cjs/services/Store/codeFilter.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.test.cjs +13 -12
- package/_cjs/services/Store/codeFilter.test.cjs.map +1 -1
- package/_cjs/services/Store/filterApi/query.cjs +2 -4
- package/_cjs/services/Store/filterApi/query.cjs.map +1 -1
- package/_cjs/services/Store/index.cjs +6 -9
- package/_cjs/services/Store/index.cjs.map +1 -1
- package/_cjs/services/Store/service.cjs +5 -7
- package/_cjs/services/Store/service.cjs.map +1 -1
- package/_cjs/services/Store/utils.cjs +16 -20
- package/_cjs/services/Store/utils.cjs.map +1 -1
- package/_cjs/services/query.cjs +4 -2
- package/_cjs/services/query.cjs.map +1 -1
- package/_cjs/test.arbs.cjs +3 -4
- package/_cjs/test.arbs.cjs.map +1 -1
- package/dist/RequestContext.d.ts +20 -20
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +15 -8
- package/dist/_ext/Array.d.ts +2 -3
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +5 -5
- package/dist/api/reportError.d.ts +5 -5
- package/dist/api/reportError.d.ts.map +1 -1
- package/dist/api/reportError.js +6 -6
- package/dist/api/routing/base.d.ts +11 -15
- package/dist/api/routing/base.d.ts.map +1 -1
- package/dist/api/routing/base.js +48 -67
- package/dist/api/routing/defaultErrorHandler.d.ts +4 -6
- package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -1
- package/dist/api/routing/defaultErrorHandler.js +26 -28
- package/dist/api/routing/makeRequestHandler.d.ts +6 -7
- package/dist/api/routing/makeRequestHandler.d.ts.map +1 -1
- package/dist/api/routing/makeRequestHandler.js +69 -59
- package/dist/api/routing/match.d.ts +7 -8
- package/dist/api/routing/match.d.ts.map +1 -1
- package/dist/api/routing/match.js +7 -11
- package/dist/api/routing/schema/jwt.d.ts +4 -0
- package/dist/api/routing/schema/jwt.d.ts.map +1 -0
- package/dist/api/routing/schema/jwt.js +11 -0
- package/dist/api/{express → routing}/schema/routing.d.ts +2 -2
- package/dist/api/routing/schema/routing.d.ts.map +1 -0
- package/dist/api/routing/schema/routing.js +123 -0
- package/dist/api/routing.js +3 -1
- package/dist/api/setupRequest.d.ts +3 -5
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +20 -24
- package/dist/errorReporter.d.ts +4 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +20 -17
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -3
- package/dist/filter/types/path/index.d.ts +2 -2
- package/dist/filter/types/path/index.d.ts.map +1 -1
- package/dist/filter/types/path/index.js +2 -3
- package/dist/filter/types.js +2 -1
- package/dist/filter.d.ts.map +1 -1
- package/dist/filter.js +36 -1
- package/dist/logger/jsonLogger.d.ts +2 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +9 -13
- package/dist/logger/logFmtLogger.d.ts +2 -1
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +9 -11
- package/dist/logger/shared.d.ts +2 -1
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +7 -9
- package/dist/rateLimit.d.ts +7 -10
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +17 -16
- package/dist/services/Emailer/Sendgrid.d.ts +1 -2
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/services/Emailer/Sendgrid.js +16 -20
- package/dist/services/Emailer/fake.d.ts +2 -2
- package/dist/services/Emailer/fake.d.ts.map +1 -1
- package/dist/services/Emailer/fake.js +10 -8
- package/dist/services/Emailer/service.d.ts +7 -10
- package/dist/services/Emailer/service.d.ts.map +1 -1
- package/dist/services/Emailer/service.js +3 -3
- package/dist/services/Operations/live.d.ts +2 -3
- package/dist/services/Operations/live.d.ts.map +1 -1
- package/dist/services/Operations/live.js +44 -51
- package/dist/services/Operations/service.d.ts +14 -19
- package/dist/services/Operations/service.d.ts.map +1 -1
- package/dist/services/Operations/service.js +23 -28
- package/dist/services/QueueMaker/errors.d.ts +5 -7
- package/dist/services/QueueMaker/errors.d.ts.map +1 -1
- package/dist/services/QueueMaker/errors.js +11 -11
- package/dist/services/QueueMaker/memQueue.d.ts +6 -9
- package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/memQueue.js +37 -39
- package/dist/services/QueueMaker/sbqueue.d.ts +6 -9
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +41 -39
- package/dist/services/QueueMaker/service.d.ts +2 -4
- package/dist/services/QueueMaker/service.d.ts.map +1 -1
- package/dist/services/QueueMaker/service.js +8 -8
- package/dist/services/Repository/dsl.d.ts +8 -10
- package/dist/services/Repository/dsl.d.ts.map +1 -1
- package/dist/services/Repository/dsl.js +12 -13
- package/dist/services/Repository/ext.d.ts +34 -62
- package/dist/services/Repository/ext.d.ts.map +1 -1
- package/dist/services/Repository/ext.js +59 -70
- package/dist/services/RepositoryBase.d.ts +41 -47
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +182 -194
- package/dist/services/RequestContextContainer.d.ts +13 -21
- package/dist/services/RequestContextContainer.d.ts.map +1 -1
- package/dist/services/RequestContextContainer.js +21 -25
- package/dist/services/Store/ContextMapContainer.d.ts +11 -18
- package/dist/services/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/services/Store/ContextMapContainer.js +17 -18
- package/dist/services/Store/Cosmos/query.d.ts +3 -2
- package/dist/services/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/services/Store/Cosmos/query.js +10 -11
- package/dist/services/Store/Cosmos.d.ts +2 -3
- package/dist/services/Store/Cosmos.d.ts.map +1 -1
- package/dist/services/Store/Cosmos.js +107 -90
- package/dist/services/Store/Disk.d.ts +4 -4
- package/dist/services/Store/Disk.d.ts.map +1 -1
- package/dist/services/Store/Disk.js +54 -50
- package/dist/services/Store/Memory.d.ts +6 -8
- package/dist/services/Store/Memory.d.ts.map +1 -1
- package/dist/services/Store/Memory.js +93 -89
- package/dist/services/Store/codeFilter.d.ts.map +1 -1
- package/dist/services/Store/codeFilter.js +3 -3
- package/dist/services/Store/codeFilter.test.d.ts.map +1 -1
- package/dist/services/Store/filterApi/query.d.ts +1 -1
- package/dist/services/Store/filterApi/query.d.ts.map +1 -1
- package/dist/services/Store/filterApi/query.js +3 -3
- package/dist/services/Store/index.d.ts +1 -2
- package/dist/services/Store/index.d.ts.map +1 -1
- package/dist/services/Store/index.js +7 -8
- package/dist/services/Store/service.d.ts +20 -23
- package/dist/services/Store/service.d.ts.map +1 -1
- package/dist/services/Store/service.js +6 -6
- package/dist/services/Store/utils.d.ts +3 -3
- package/dist/services/Store/utils.d.ts.map +1 -1
- package/dist/services/Store/utils.js +26 -28
- package/dist/services/query.d.ts +6 -6
- package/dist/services/query.d.ts.map +1 -1
- package/dist/services/query.js +5 -4
- package/dist/test.arbs.d.ts +0 -2
- package/dist/test.arbs.d.ts.map +1 -1
- package/dist/test.arbs.js +3 -4
- package/package.json +28 -168
- package/src/RequestContext.ts +1 -0
- package/src/_ext/Array.ts +5 -2
- package/src/api/reportError.ts +14 -10
- package/src/api/routing/base.ts +77 -110
- package/src/api/routing/defaultErrorHandler.ts +64 -54
- package/src/api/routing/makeRequestHandler.ts +165 -135
- package/src/api/routing/match.ts +14 -8
- package/src/api/{express → routing}/schema/jwt.ts +6 -5
- package/src/api/{express → routing}/schema/routing.ts +2 -1
- package/src/api/setupRequest.ts +30 -24
- package/src/errorReporter.ts +12 -11
- package/src/errors.ts +1 -0
- package/src/filter/types/path/index.ts +2 -2
- package/src/logger/jsonLogger.ts +6 -5
- package/src/logger/logFmtLogger.ts +4 -5
- package/src/logger/shared.ts +4 -3
- package/src/rateLimit.ts +37 -34
- package/src/services/Emailer/Sendgrid.ts +12 -10
- package/src/services/Emailer/fake.ts +7 -4
- package/src/services/Emailer/service.ts +4 -1
- package/src/services/Operations/live.ts +66 -59
- package/src/services/Operations/service.ts +41 -34
- package/src/services/QueueMaker/errors.ts +15 -11
- package/src/services/QueueMaker/memQueue.ts +59 -40
- package/src/services/QueueMaker/sbqueue.ts +54 -33
- package/src/services/QueueMaker/service.ts +7 -6
- package/src/services/Repository/dsl.ts +12 -8
- package/src/services/Repository/ext.ts +52 -44
- package/src/services/RepositoryBase.ts +278 -240
- package/src/services/RequestContextContainer.ts +30 -18
- package/src/services/Store/ContextMapContainer.ts +26 -13
- package/src/services/Store/Cosmos/query.ts +17 -11
- package/src/services/Store/Cosmos.ts +209 -168
- package/src/services/Store/Disk.ts +69 -53
- package/src/services/Store/Memory.ts +138 -97
- package/src/services/Store/{Redis.ts → Redis.ts.bak} +7 -5
- package/src/services/Store/codeFilter.test.ts +61 -36
- package/src/services/Store/codeFilter.ts +1 -0
- package/src/services/Store/filterApi/query.ts +1 -0
- package/src/services/Store/index.ts +7 -6
- package/src/services/Store/service.ts +4 -1
- package/src/services/Store/utils.ts +25 -23
- package/src/services/query.ts +3 -3
- package/src/services/simpledb/{cosmosdb.ts → cosmosdb.ts.bak} +1 -0
- package/src/services/simpledb/{diskdb.ts → diskdb.ts.bak} +2 -1
- package/src/services/simpledb/{memdb.ts → memdb.ts.bak} +3 -2
- package/src/services/simpledb/{mongodb.ts → mongodb.ts.bak} +1 -0
- package/src/services/simpledb/{redisdb.ts → redisdb.ts.bak} +17 -14
- package/src/services/simpledb/{shared.ts → shared.ts.bak} +2 -1
- package/src/services/simpledb/{simpledb.ts → simpledb.ts.bak} +6 -2
- package/tsconfig.json +4 -21
- package/tsconfig.json.bak +0 -4
- package/_cjs/_global.cjs +0 -6
- package/_cjs/_global.cjs.map +0 -1
- package/_cjs/_global.ext.cjs +0 -5
- package/_cjs/_global.ext.cjs.map +0 -1
- package/_cjs/_global.schema.cjs +0 -5
- package/_cjs/_global.schema.cjs.map +0 -1
- package/_cjs/api/defaultErrorHandler.cjs +0 -37
- package/_cjs/api/defaultErrorHandler.cjs.map +0 -1
- package/_cjs/api/express/schema/jwt.cjs.map +0 -1
- package/_cjs/api/express/schema/routing.cjs +0 -23
- package/_cjs/api/express/schema/routing.cjs.map +0 -1
- package/_cjs/api/http.cjs +0 -42
- package/_cjs/api/http.cjs.map +0 -1
- package/_cjs/services/Store/Redis.cjs +0 -73
- package/_cjs/services/Store/Redis.cjs.map +0 -1
- package/_cjs/services/simpledb/cosmosdb.cjs +0 -109
- package/_cjs/services/simpledb/cosmosdb.cjs.map +0 -1
- package/_cjs/services/simpledb/diskdb.cjs +0 -125
- package/_cjs/services/simpledb/diskdb.cjs.map +0 -1
- package/_cjs/services/simpledb/index.cjs +0 -38
- package/_cjs/services/simpledb/index.cjs.map +0 -1
- package/_cjs/services/simpledb/memdb.cjs +0 -72
- package/_cjs/services/simpledb/memdb.cjs.map +0 -1
- package/_cjs/services/simpledb/mongodb.cjs +0 -99
- package/_cjs/services/simpledb/mongodb.cjs.map +0 -1
- package/_cjs/services/simpledb/redisdb.cjs +0 -135
- package/_cjs/services/simpledb/redisdb.cjs.map +0 -1
- package/_cjs/services/simpledb/shared.cjs +0 -79
- package/_cjs/services/simpledb/shared.cjs.map +0 -1
- package/_cjs/services/simpledb/simpledb.cjs +0 -85
- package/_cjs/services/simpledb/simpledb.cjs.map +0 -1
- package/dist/_global.d.ts +0 -10
- package/dist/_global.d.ts.map +0 -1
- package/dist/_global.ext.d.ts +0 -34
- package/dist/_global.ext.d.ts.map +0 -1
- package/dist/_global.ext.js +0 -6
- package/dist/_global.js +0 -12
- package/dist/_global.schema.d.ts +0 -6
- package/dist/_global.schema.d.ts.map +0 -1
- package/dist/_global.schema.js +0 -9
- package/dist/api/defaultErrorHandler.d.ts +0 -6
- package/dist/api/defaultErrorHandler.d.ts.map +0 -1
- package/dist/api/defaultErrorHandler.js +0 -34
- package/dist/api/express/schema/jwt.d.ts +0 -6
- package/dist/api/express/schema/jwt.d.ts.map +0 -1
- package/dist/api/express/schema/jwt.js +0 -11
- package/dist/api/express/schema/routing.d.ts.map +0 -1
- package/dist/api/express/schema/routing.js +0 -10
- package/dist/api/http.d.ts +0 -16
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -12
- package/dist/services/Store/Redis.d.ts +0 -6
- package/dist/services/Store/Redis.d.ts.map +0 -1
- package/dist/services/Store/Redis.js +0 -76
- package/dist/services/simpledb/cosmosdb.d.ts +0 -14
- package/dist/services/simpledb/cosmosdb.d.ts.map +0 -1
- package/dist/services/simpledb/cosmosdb.js +0 -103
- package/dist/services/simpledb/diskdb.d.ts +0 -12
- package/dist/services/simpledb/diskdb.d.ts.map +0 -1
- package/dist/services/simpledb/diskdb.js +0 -109
- package/dist/services/simpledb/index.d.ts +0 -7
- package/dist/services/simpledb/index.d.ts.map +0 -1
- package/dist/services/simpledb/index.js +0 -7
- package/dist/services/simpledb/memdb.d.ts +0 -11
- package/dist/services/simpledb/memdb.d.ts.map +0 -1
- package/dist/services/simpledb/memdb.js +0 -58
- package/dist/services/simpledb/mongodb.d.ts +0 -13
- package/dist/services/simpledb/mongodb.d.ts.map +0 -1
- package/dist/services/simpledb/mongodb.js +0 -68
- package/dist/services/simpledb/redisdb.d.ts +0 -35
- package/dist/services/simpledb/redisdb.d.ts.map +0 -1
- package/dist/services/simpledb/redisdb.js +0 -126
- package/dist/services/simpledb/shared.d.ts +0 -87
- package/dist/services/simpledb/shared.d.ts.map +0 -1
- package/dist/services/simpledb/shared.js +0 -52
- package/dist/services/simpledb/simpledb.d.ts +0 -23
- package/dist/services/simpledb/simpledb.d.ts.map +0 -1
- package/dist/services/simpledb/simpledb.js +0 -69
- package/src/_global.ext.ts +0 -36
- package/src/_global.schema.ts +0 -10
- package/src/_global.ts +0 -14
- package/src/api/defaultErrorHandler.ts +0 -59
- package/src/api/express/makeJsonSchema.test.ts.bak +0 -76
- package/src/api/express/makeJsonSchema.ts.bak +0 -166
- package/src/api/express/makeOpenApiSpecs.ts.bak +0 -62
- package/src/api/http.ts +0 -26
- package/tsplus.config.json +0 -9
- /package/src/services/simpledb/{index.ts → index.ts.bak} +0 -0
package/src/logger/jsonLogger.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Cause, FiberId, HashMap, List, Logger, Option } from "effect-app"
|
|
1
2
|
import { getRequestContext } from "./shared.js"
|
|
2
3
|
|
|
3
4
|
export const jsonLogger = Logger.make<unknown, void>(
|
|
@@ -10,12 +11,12 @@ export const jsonLogger = Logger.make<unknown, void>(
|
|
|
10
11
|
const data = {
|
|
11
12
|
timestamp: now,
|
|
12
13
|
level: logLevel.label,
|
|
13
|
-
fiber:
|
|
14
|
+
fiber: FiberId.threadName(fiberId),
|
|
14
15
|
message,
|
|
15
|
-
request: c
|
|
16
|
-
cause: cause != null && cause != Cause.empty ?
|
|
17
|
-
spans:
|
|
18
|
-
annotations:
|
|
16
|
+
request: Option.getOrUndefined(c),
|
|
17
|
+
cause: cause != null && cause != Cause.empty ? Cause.pretty(cause) : undefined,
|
|
18
|
+
spans: List.map(spans, (_) => ({ label: _.label, timing: nowMillis - _.startTime })).pipe(List.toArray),
|
|
19
|
+
annotations: HashMap.size(annotations) > 0
|
|
19
20
|
? [...annotations].reduce((prev, [k, v]) => {
|
|
20
21
|
prev[k] = v
|
|
21
22
|
return prev
|
|
@@ -1,23 +1,22 @@
|
|
|
1
|
+
import { HashMap, Logger, Option } from "effect-app"
|
|
1
2
|
import { getRequestContext } from "./shared.js"
|
|
2
3
|
|
|
3
4
|
export const logfmtLogger = Logger.make<unknown, void>(
|
|
4
5
|
(_) => {
|
|
5
6
|
let { annotations } = _
|
|
6
7
|
const c = getRequestContext(_.context)
|
|
7
|
-
const requestContext = c
|
|
8
|
+
const requestContext = Option.getOrUndefined(c)
|
|
8
9
|
if (requestContext && requestContext.name !== "_root_") {
|
|
9
10
|
annotations = HashMap.make(...[
|
|
10
11
|
...annotations,
|
|
11
|
-
...{
|
|
12
|
+
...Object.entries({
|
|
12
13
|
"request.root.id": requestContext.rootId,
|
|
13
14
|
"request.id": requestContext.id,
|
|
14
15
|
"request.name": requestContext.name,
|
|
15
16
|
"request.namespace": requestContext.namespace,
|
|
16
17
|
"request.locale": requestContext.locale,
|
|
17
18
|
...(requestContext.userProfile?.sub ? { "request.user.sub": requestContext.userProfile.sub } : {})
|
|
18
|
-
}
|
|
19
|
-
.$$
|
|
20
|
-
.entries
|
|
19
|
+
})
|
|
21
20
|
])
|
|
22
21
|
}
|
|
23
22
|
const formatted = Logger.logfmtLogger.log({ ..._, annotations })
|
package/src/logger/shared.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { RuntimeFlags } from "effect"
|
|
2
|
+
import { Context, FiberRef, Option, Runtime } from "effect-app"
|
|
2
3
|
import * as FiberRefs from "effect/FiberRefs"
|
|
3
4
|
import { RequestContextContainer } from "../services/RequestContextContainer.js"
|
|
4
5
|
|
|
5
6
|
export function getRequestContext(fiberRefs: FiberRefs.FiberRefs) {
|
|
6
7
|
const context = FiberRefs.getOrDefault(fiberRefs, FiberRef.currentContext)
|
|
7
|
-
const a =
|
|
8
|
-
const c =
|
|
8
|
+
const a = Context.getOption(context, RequestContextContainer)
|
|
9
|
+
const c = Option.map(a, (_) => {
|
|
9
10
|
// TODO: perhaps a litle expensive?
|
|
10
11
|
const rt = Runtime.make({ context, fiberRefs, runtimeFlags: RuntimeFlags.none })
|
|
11
|
-
return
|
|
12
|
+
return Runtime.runSync(rt)(_.requestContext)
|
|
12
13
|
})
|
|
13
14
|
return c
|
|
14
15
|
}
|
package/src/rateLimit.ts
CHANGED
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
// }
|
|
24
24
|
// }
|
|
25
25
|
|
|
26
|
+
import type { Semaphore } from "@effect-app/core/Effect"
|
|
27
|
+
import type { Duration, NonEmptyArray } from "effect-app"
|
|
28
|
+
import { Effect, ReadonlyArray } from "effect-app"
|
|
29
|
+
|
|
26
30
|
/**
|
|
27
31
|
* Executes the specified effect, acquiring the specified number of permits
|
|
28
32
|
* immediately before the effect begins execution and releasing them
|
|
@@ -38,14 +42,12 @@ export function SEM_withPermitsDuration(permits: number, duration: Duration) {
|
|
|
38
42
|
Effect.uninterruptibleMask(
|
|
39
43
|
(restore) =>
|
|
40
44
|
restore(self.take(permits))
|
|
41
|
-
.andThen(
|
|
45
|
+
.pipe(Effect.andThen(
|
|
42
46
|
restore(effect)
|
|
43
|
-
.ensuring(
|
|
44
|
-
self
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
)
|
|
48
|
-
)
|
|
47
|
+
.pipe(Effect.ensuring(
|
|
48
|
+
Effect.delay(self.release(permits), duration)
|
|
49
|
+
))
|
|
50
|
+
))
|
|
49
51
|
)
|
|
50
52
|
}
|
|
51
53
|
}
|
|
@@ -60,15 +62,14 @@ export function batchPar<R, E, A, R2, E2, A2, T>(
|
|
|
60
62
|
forEachBatch: (a: NonEmptyArray<A>, i: number) => Effect<A2, E2, R2>
|
|
61
63
|
) {
|
|
62
64
|
return (items: Iterable<T>) =>
|
|
63
|
-
|
|
64
|
-
.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
_
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
)
|
|
65
|
+
Effect.forEach(
|
|
66
|
+
ReadonlyArray.chunk_(items, n),
|
|
67
|
+
(_, i) =>
|
|
68
|
+
Effect
|
|
69
|
+
.forEach(_, (_, j) => forEachItem(_, j, i), { concurrency: "inherit" })
|
|
70
|
+
.pipe(Effect.flatMap((_) => forEachBatch(_ as NonEmptyArray<A>, i))),
|
|
71
|
+
{ concurrency: "inherit" }
|
|
72
|
+
)
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
/**
|
|
@@ -81,13 +82,13 @@ export function batch<R, E, A, R2, E2, A2, T>(
|
|
|
81
82
|
forEachBatch: (a: NonEmptyArray<A>, i: number) => Effect<A2, E2, R2>
|
|
82
83
|
) {
|
|
83
84
|
return (items: Iterable<T>) =>
|
|
84
|
-
|
|
85
|
-
.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
.
|
|
89
|
-
.flatMap((_) => forEachBatch(_ as NonEmptyArray<A>, i))
|
|
90
|
-
|
|
85
|
+
Effect.forEach(
|
|
86
|
+
ReadonlyArray.chunk_(items, n),
|
|
87
|
+
(_, i) =>
|
|
88
|
+
Effect
|
|
89
|
+
.forEach(_, (_, j) => forEachItem(_, j, i), { concurrency: "inherit" })
|
|
90
|
+
.pipe(Effect.flatMap((_) => forEachBatch(_ as NonEmptyArray<A>, i)))
|
|
91
|
+
)
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
// /**
|
|
@@ -117,20 +118,22 @@ export function batch<R, E, A, R2, E2, A2, T>(
|
|
|
117
118
|
|
|
118
119
|
export function naiveRateLimit(
|
|
119
120
|
n: number,
|
|
120
|
-
d:
|
|
121
|
+
d: Duration
|
|
121
122
|
) {
|
|
122
123
|
return <T>(items: Iterable<T>) => (<R, E, A, R2, E2, A2>(
|
|
123
124
|
forEachItem: (i: T) => Effect<A, E, R>,
|
|
124
125
|
forEachBatch: (a: A[]) => Effect<A2, E2, R2>
|
|
125
126
|
) =>
|
|
126
|
-
|
|
127
|
-
.
|
|
128
|
-
|
|
129
|
-
((i === 0)
|
|
130
|
-
.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
127
|
+
Effect.forEach(
|
|
128
|
+
ReadonlyArray.chunk_(items, n),
|
|
129
|
+
(batch, i) =>
|
|
130
|
+
((i === 0)
|
|
131
|
+
? Effect.unit
|
|
132
|
+
: Effect.sleep(d))
|
|
133
|
+
.pipe(Effect.zipRight(
|
|
134
|
+
Effect
|
|
135
|
+
.forEach(batch, forEachItem, { concurrency: n })
|
|
136
|
+
.pipe(Effect.flatMap(forEachBatch))
|
|
137
|
+
))
|
|
138
|
+
))
|
|
136
139
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { dropUndefinedT } from "@effect-app/core/utils"
|
|
2
2
|
import type { EmailData } from "@sendgrid/helpers/classes/email-address.js"
|
|
3
3
|
import sgMail from "@sendgrid/mail"
|
|
4
|
+
import { Effect, Equivalence, ReadonlyArray, Secret } from "effect-app"
|
|
4
5
|
import { inspect } from "util"
|
|
5
6
|
import { Emailer } from "./service.js"
|
|
6
7
|
import type { EmailMsg, EmailMsgOptionalFrom, SendgridConfig } from "./service.js"
|
|
7
8
|
|
|
8
9
|
const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPrefix }: SendgridConfig) =>
|
|
9
10
|
Effect.sync(() => {
|
|
10
|
-
sgMail.setApiKey(
|
|
11
|
+
sgMail.setApiKey(Secret.value(apiKey))
|
|
11
12
|
|
|
12
13
|
return new Emailer({
|
|
13
14
|
sendMail(msg_: EmailMsgOptionalFrom) {
|
|
@@ -21,7 +22,7 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
21
22
|
|
|
22
23
|
const renderedMsg_ = render(msg)
|
|
23
24
|
const renderedMsg = { ...renderedMsg_, subject: `${subjectPrefix}${renderedMsg_.subject}` }
|
|
24
|
-
yield* $(Effect.logDebug("Sending email").annotateLogs("msg", inspect(renderedMsg, false, 5)))
|
|
25
|
+
yield* $(Effect.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5))))
|
|
25
26
|
|
|
26
27
|
const ret = yield* $(
|
|
27
28
|
Effect.async<[sgMail.ClientResponse, Record<string, unknown>], Error | sgMail.ResponseError>(
|
|
@@ -52,8 +53,7 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
52
53
|
* @tsplus static Emailer.Ops SendgridLayer
|
|
53
54
|
*/
|
|
54
55
|
export function Sendgrid(config: SendgridConfig) {
|
|
55
|
-
return makeSendgrid(config)
|
|
56
|
-
.toLayer(Emailer)
|
|
56
|
+
return Emailer.toLayer(makeSendgrid(config))
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -97,18 +97,20 @@ function renderFake(addr: EmailData | EmailData[], makeId: () => number) {
|
|
|
97
97
|
email: `test+${makeId()}@nomizz.com`
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
const eq = Equivalence.
|
|
101
|
-
|
|
100
|
+
const eq = Equivalence.mapInput(
|
|
101
|
+
Equivalence.string,
|
|
102
|
+
(to: { name?: string; email: string } | string) => typeof to === "string" ? to.toLowerCase() : to.email.toLowerCase()
|
|
102
103
|
)
|
|
103
104
|
|
|
104
105
|
// TODO: should just not add any already added email address
|
|
105
106
|
// https://stackoverflow.com/a/53603076/11595834
|
|
106
107
|
function renderFakeIfTest(addr: EmailData | EmailData[], makeId: () => number) {
|
|
107
108
|
return Array.isArray(addr)
|
|
108
|
-
?
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
? ReadonlyArray.dedupeWith(
|
|
110
|
+
addr
|
|
111
|
+
.map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)),
|
|
112
|
+
eq
|
|
113
|
+
)
|
|
112
114
|
: isTestAddress(addr)
|
|
113
115
|
? renderFake(addr, makeId)
|
|
114
116
|
: addr
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
+
import { Effect, Layer } from "effect-app"
|
|
1
2
|
import { pretty } from "effect-app/utils"
|
|
2
3
|
import { Emailer } from "./service.js"
|
|
3
4
|
|
|
4
5
|
const makeFake = Effect
|
|
5
6
|
.logDebug("FAKE Emailer Service enabled")
|
|
6
|
-
.map(() =>
|
|
7
|
+
.pipe(Effect.map(() =>
|
|
7
8
|
new Emailer({
|
|
8
9
|
sendMail(msg) {
|
|
9
|
-
return Effect
|
|
10
|
+
return Effect
|
|
11
|
+
.logDebug(`Fake send mail`)
|
|
12
|
+
.pipe(Effect.annotateLogs("msg", pretty(msg)))
|
|
10
13
|
}
|
|
11
14
|
})
|
|
12
|
-
)
|
|
15
|
+
))
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
18
|
* @tsplus static Emailer.Ops Fake
|
|
16
19
|
*/
|
|
17
|
-
export const FakeSendgrid =
|
|
20
|
+
export const FakeSendgrid = Layer.effect(Emailer, makeFake)
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import type { Email, NonEmptyString255 } from "@effect-app/schema"
|
|
1
2
|
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
|
|
2
3
|
import type { ResponseError } from "@sendgrid/mail"
|
|
3
4
|
import type sgMail from "@sendgrid/mail"
|
|
5
|
+
import type { Effect, NonEmptyReadonlyArray, Secret } from "effect-app"
|
|
6
|
+
import { TagClassId } from "effect-app/service"
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* @tsplus type Emailer
|
|
@@ -15,7 +18,7 @@ export interface SendgridConfig {
|
|
|
15
18
|
subjectPrefix: string
|
|
16
19
|
realMail: boolean
|
|
17
20
|
defaultFrom: Email | { name?: NonEmptyString255; email: Email }
|
|
18
|
-
apiKey: Secret
|
|
21
|
+
apiKey: Secret.Secret
|
|
19
22
|
}
|
|
20
23
|
export type EmailMsg = sgMail.MailDataRequired
|
|
21
24
|
export type EmailTemplateMsg = MailData & { templateId: string }
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { annotateLogscoped } from "@effect-app/core/Effect"
|
|
1
2
|
import { reportError } from "@effect-app/infra/errorReporter"
|
|
3
|
+
import { NonEmptyString2k } from "@effect-app/schema"
|
|
4
|
+
import { subHours } from "date-fns"
|
|
5
|
+
import { Cause, copy, Duration, Effect, Exit, Layer, Option, S, Schedule } from "effect-app"
|
|
2
6
|
import type { OperationProgress } from "effect-app/Operations"
|
|
3
7
|
import { Failure, Operation, OperationId, Success } from "effect-app/Operations"
|
|
4
8
|
import { Operations } from "./service.js"
|
|
@@ -11,18 +15,17 @@ const make = Effect.sync(() => {
|
|
|
11
15
|
|
|
12
16
|
const cleanup = Effect
|
|
13
17
|
.sync(() => {
|
|
14
|
-
const before = new Date()
|
|
15
|
-
ops
|
|
16
|
-
.entries()
|
|
17
|
-
.toChunk
|
|
18
|
+
const before = subHours(new Date(), 1)
|
|
19
|
+
;[...ops
|
|
20
|
+
.entries()]
|
|
18
21
|
.forEach(([id, op]) => {
|
|
19
|
-
const lastChanged = Option.fromNullable(op.updatedAt).getOrElse(() => op.createdAt)
|
|
22
|
+
const lastChanged = Option.fromNullable(op.updatedAt).pipe(Option.getOrElse(() => op.createdAt))
|
|
20
23
|
if (lastChanged < before) {
|
|
21
24
|
ops.delete(id)
|
|
22
25
|
}
|
|
23
26
|
})
|
|
24
27
|
})
|
|
25
|
-
.withSpan("Operations.cleanup")
|
|
28
|
+
.pipe(Effect.withSpan("Operations.cleanup"))
|
|
26
29
|
|
|
27
30
|
function addOp(id: OperationId) {
|
|
28
31
|
return Effect.sync(() => {
|
|
@@ -33,57 +36,56 @@ const make = Effect.sync(() => {
|
|
|
33
36
|
return Effect.sync(() => Option.fromNullable(ops.get(id)))
|
|
34
37
|
}
|
|
35
38
|
function finishOp(id: OperationId, exit: Exit<unknown, unknown>) {
|
|
36
|
-
return findOp(id)
|
|
39
|
+
return Effect.flatMap(findOp(id), (_) =>
|
|
37
40
|
Effect.sync(() => {
|
|
38
|
-
if (
|
|
41
|
+
if (Option.isNone(_)) {
|
|
39
42
|
throw new Error("Not found")
|
|
40
43
|
}
|
|
41
|
-
ops.set(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
44
|
+
ops.set(
|
|
45
|
+
id,
|
|
46
|
+
copy(_.value, {
|
|
47
|
+
updatedAt: new Date(),
|
|
48
|
+
result: Exit.isSuccess(exit)
|
|
49
|
+
? new Success()
|
|
50
|
+
: new Failure({
|
|
51
|
+
message: Cause.isInterrupted(exit.cause)
|
|
52
|
+
? NonEmptyString2k("Interrupted")
|
|
53
|
+
: Cause.isDie(exit.cause)
|
|
54
|
+
? NonEmptyString2k("Unknown error")
|
|
55
|
+
: Cause
|
|
56
|
+
.failureOption(exit.cause)
|
|
57
|
+
.pipe(
|
|
58
|
+
Option.flatMap((_) =>
|
|
59
|
+
typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
|
|
60
|
+
? Option.some(_.message)
|
|
61
|
+
: Option.none()
|
|
62
|
+
),
|
|
63
|
+
Option.getOrNull
|
|
64
|
+
)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
)
|
|
68
|
+
}))
|
|
64
69
|
}
|
|
65
70
|
function update(id: OperationId, progress: OperationProgress) {
|
|
66
|
-
return findOp(id)
|
|
71
|
+
return Effect.flatMap(findOp(id), (_) =>
|
|
67
72
|
Effect.sync(() => {
|
|
68
|
-
if (
|
|
73
|
+
if (Option.isNone(_)) {
|
|
69
74
|
throw new Error("Not found")
|
|
70
75
|
}
|
|
71
|
-
ops.set(id,
|
|
72
|
-
})
|
|
73
|
-
)
|
|
76
|
+
ops.set(id, copy(_.value, { updatedAt: new Date(), progress }))
|
|
77
|
+
}))
|
|
74
78
|
}
|
|
75
79
|
return new Operations({
|
|
76
80
|
cleanup,
|
|
77
|
-
register:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
)
|
|
86
|
-
),
|
|
81
|
+
register: Effect.tap(
|
|
82
|
+
makeOp,
|
|
83
|
+
(id) =>
|
|
84
|
+
Effect.andThen(
|
|
85
|
+
annotateLogscoped("operationId", id),
|
|
86
|
+
Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit))
|
|
87
|
+
)
|
|
88
|
+
),
|
|
87
89
|
|
|
88
90
|
find: findOp,
|
|
89
91
|
update
|
|
@@ -91,21 +93,26 @@ const make = Effect.sync(() => {
|
|
|
91
93
|
})
|
|
92
94
|
|
|
93
95
|
const cleanupLoop = Operations
|
|
94
|
-
.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
96
|
+
.pipe(
|
|
97
|
+
Effect.flatMap((_) => _.cleanup),
|
|
98
|
+
Effect.exit,
|
|
99
|
+
Effect
|
|
100
|
+
.flatMap((_) => {
|
|
101
|
+
if (Exit.isSuccess(_)) {
|
|
102
|
+
return Effect.unit
|
|
103
|
+
} else {
|
|
104
|
+
return reportAppError(_.cause)
|
|
105
|
+
}
|
|
106
|
+
}),
|
|
107
|
+
Effect.schedule(Schedule.fixed(Duration.minutes(1))),
|
|
108
|
+
Effect.forkScoped
|
|
109
|
+
)
|
|
105
110
|
|
|
106
111
|
/**
|
|
107
112
|
* @tsplus static Operations.Ops Live
|
|
108
113
|
*/
|
|
109
114
|
export const Live = cleanupLoop
|
|
110
|
-
.
|
|
111
|
-
|
|
115
|
+
.pipe(
|
|
116
|
+
Layer.scopedDiscard,
|
|
117
|
+
Layer.provideMerge(Layer.effect(Operations, make))
|
|
118
|
+
)
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import type { Option } from "effect-app"
|
|
2
|
+
import { Effect } from "effect-app"
|
|
1
3
|
import type { Operation, OperationId, OperationProgress } from "effect-app/Operations"
|
|
4
|
+
import { TagClassId } from "effect-app/service"
|
|
2
5
|
import * as Scope from "effect/Scope"
|
|
6
|
+
import { forkDaemonReportRequestUnexpected } from "../../api/reportError.js"
|
|
3
7
|
|
|
4
8
|
/**
|
|
5
9
|
* @tsplus type Operations
|
|
@@ -21,41 +25,43 @@ export class Operations extends TagClassId("effect-app/Operations")<Operations,
|
|
|
21
25
|
* @tsplus getter effect/io/Effect forkOperation
|
|
22
26
|
*/
|
|
23
27
|
export function forkOperation<R, E, A>(self: Effect<A, E, R>) {
|
|
24
|
-
return
|
|
25
|
-
(
|
|
26
|
-
Scope
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.extend(scope)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
return Effect.flatMap(Operations, (Operations) =>
|
|
29
|
+
Effect.flatMap(
|
|
30
|
+
Scope.make(),
|
|
31
|
+
(scope) =>
|
|
32
|
+
Operations
|
|
33
|
+
.register
|
|
34
|
+
.pipe(
|
|
35
|
+
Scope.extend(scope),
|
|
36
|
+
Effect
|
|
37
|
+
.tap(() => forkDaemonReportRequestUnexpected(Scope.use(self, scope)))
|
|
38
|
+
)
|
|
39
|
+
))
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
/**
|
|
38
43
|
* @tsplus getter function forkOperation
|
|
39
44
|
*/
|
|
40
45
|
export function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect<A, E, R>) {
|
|
41
|
-
return (inp: Inp) => fnc(inp).forkOperation
|
|
46
|
+
return (inp: Inp) => fnc(inp).pipe(forkOperation)
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
/**
|
|
45
50
|
* @tsplus static effect/io/Effect.Ops forkOperation
|
|
46
51
|
*/
|
|
47
52
|
export function forkOperation2<R, E, A>(self: (opId: OperationId) => Effect<A, E, R>) {
|
|
48
|
-
return
|
|
49
|
-
(
|
|
50
|
-
Scope
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
.extend(scope)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
return Effect.flatMap(Operations, (Operations) =>
|
|
54
|
+
Effect.flatMap(
|
|
55
|
+
Scope.make(),
|
|
56
|
+
(scope) =>
|
|
57
|
+
Operations
|
|
58
|
+
.register
|
|
59
|
+
.pipe(
|
|
60
|
+
Scope.extend(scope),
|
|
61
|
+
Effect
|
|
62
|
+
.tap((id) => forkDaemonReportRequestUnexpected(Scope.use(self(id), scope)))
|
|
63
|
+
)
|
|
64
|
+
))
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
/**
|
|
@@ -65,16 +71,17 @@ export function forkOperationWithEffect<R, R2, E, E2, A, A2>(
|
|
|
65
71
|
self: (id: OperationId) => Effect<A, E, R>,
|
|
66
72
|
fnc: (id: OperationId) => Effect<A2, E2, R2>
|
|
67
73
|
) {
|
|
68
|
-
return
|
|
69
|
-
(
|
|
74
|
+
return Effect.flatMap(Operations, (Operations) =>
|
|
75
|
+
Effect.flatMap(
|
|
70
76
|
Scope
|
|
71
|
-
.make()
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
.
|
|
77
|
-
.tap((opId) =>
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
.make(),
|
|
78
|
+
(scope) =>
|
|
79
|
+
Operations
|
|
80
|
+
.register
|
|
81
|
+
.pipe(
|
|
82
|
+
Scope.extend(scope),
|
|
83
|
+
Effect.tap((opId) => forkDaemonReportRequestUnexpected(Scope.use(self(opId), scope))),
|
|
84
|
+
Effect.tap((opId) => Effect.interruptible(fnc(opId)).pipe(Effect.forkScoped, Scope.extend(scope)))
|
|
85
|
+
)
|
|
86
|
+
))
|
|
80
87
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { reportError } from "@effect-app/infra/errorReporter"
|
|
2
|
+
import { Cause, Effect, Exit } from "effect-app"
|
|
2
3
|
|
|
3
4
|
const reportQueueError_ = reportError("Queue")
|
|
4
5
|
|
|
@@ -15,7 +16,7 @@ export const reportQueueError = <E>(cause: Cause<E>, extras?: Record<string, unk
|
|
|
15
16
|
* @tsplus getter effect/io/Effect forkDaemonReportQueue
|
|
16
17
|
*/
|
|
17
18
|
export function forkDaemonReportQueue<R, E, A>(self: Effect<A, E, R>) {
|
|
18
|
-
return self.tapErrorCause(reportNonInterruptedFailureCause({})).fork.daemonChildren
|
|
19
|
+
return self.pipe(Effect.tapErrorCause(reportNonInterruptedFailureCause({})), Effect.fork, Effect.daemonChildren)
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
export const reportFatalQueueError = reportError(
|
|
@@ -25,20 +26,23 @@ export const reportFatalQueueError = reportError(
|
|
|
25
26
|
export function reportNonInterruptedFailure(context?: Record<string, unknown>) {
|
|
26
27
|
const report = reportNonInterruptedFailureCause(context)
|
|
27
28
|
return <R, E, A>(inp: Effect<A, E, R>): Effect<Exit<A, E>, never, R> =>
|
|
28
|
-
inp
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
inp.pipe(
|
|
30
|
+
Effect
|
|
31
|
+
.exit,
|
|
32
|
+
Effect
|
|
33
|
+
.flatMap((result) =>
|
|
34
|
+
Exit.match(result, {
|
|
35
|
+
onFailure: (cause) => Effect.map(report(cause), () => result),
|
|
36
|
+
onSuccess: () => Effect.sync(() => result)
|
|
37
|
+
})
|
|
38
|
+
)
|
|
39
|
+
)
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
export function reportNonInterruptedFailureCause(context?: Record<string, unknown>) {
|
|
39
43
|
return <E>(cause: Cause<E>): Effect<void> => {
|
|
40
|
-
if (
|
|
41
|
-
return (cause as Cause<never>)
|
|
44
|
+
if (Cause.isInterrupted(cause)) {
|
|
45
|
+
return Effect.failCause(cause as Cause<never>)
|
|
42
46
|
}
|
|
43
47
|
return reportQueueError(cause, context)
|
|
44
48
|
}
|