@effect-app/infra 0.198.2 → 0.199.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 +32 -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 +212 -197
- 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 -1
- 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 +11 -13
- 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 +101 -71
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +229 -226
- 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 -3
- 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 +18 -14
- package/src/services/Repository/ext.ts +58 -50
- package/src/services/RepositoryBase.ts +478 -351
- 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 -2
- 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
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { MemQueue } from "@effect-app/infra-adapters/memQueue"
|
|
2
2
|
import { RequestContext } from "@effect-app/infra/RequestContext"
|
|
3
|
+
import { NonEmptyString255, struct } from "@effect-app/schema"
|
|
3
4
|
import { Tracer } from "effect"
|
|
4
|
-
import
|
|
5
|
+
import { Effect, Fiber, flow, S } from "effect-app"
|
|
5
6
|
import { RequestId } from "effect-app/ids"
|
|
7
|
+
import { pretty } from "effect-app/utils"
|
|
8
|
+
import { setupRequestContext } from "../../api/setupRequest.js"
|
|
6
9
|
import { RequestContextContainer } from "../RequestContextContainer.js"
|
|
7
|
-
import { reportNonInterruptedFailure } from "./errors.js"
|
|
10
|
+
import { forkDaemonReportQueue, reportNonInterruptedFailure } from "./errors.js"
|
|
8
11
|
import { type QueueBase, QueueMeta } from "./service.js"
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* @tsplus static QueueMaker.Ops makeMem
|
|
12
15
|
*/
|
|
13
16
|
export function makeMemQueue<
|
|
14
|
-
Evt extends { id: StringId; _tag: string },
|
|
15
|
-
DrainEvt extends { id: StringId; _tag: string },
|
|
17
|
+
Evt extends { id: S.StringId; _tag: string },
|
|
18
|
+
DrainEvt extends { id: S.StringId; _tag: string },
|
|
16
19
|
EvtE,
|
|
17
20
|
DrainEvtE
|
|
18
21
|
>(
|
|
@@ -29,27 +32,28 @@ export function makeMemQueue<
|
|
|
29
32
|
|
|
30
33
|
const wireSchema = struct({ body: schema, meta: QueueMeta })
|
|
31
34
|
const drainW = struct({ body: drainSchema, meta: QueueMeta })
|
|
32
|
-
const parseDrain = flow(
|
|
35
|
+
const parseDrain = flow(S.decodeUnknown(drainW), Effect.orDie)
|
|
33
36
|
|
|
34
37
|
return {
|
|
35
38
|
publish: (...messages) =>
|
|
36
39
|
Effect.gen(function*($) {
|
|
37
40
|
const requestContext = yield* $(rcc.requestContext)
|
|
38
|
-
const currentSpan = yield* $(Effect.currentSpan.orDie)
|
|
41
|
+
const currentSpan = yield* $(Effect.currentSpan.pipe(Effect.orDie))
|
|
39
42
|
const span = Tracer.externalSpan(currentSpan)
|
|
40
43
|
return yield* $(
|
|
41
|
-
|
|
42
|
-
.
|
|
44
|
+
Effect
|
|
45
|
+
.forEach(messages, (m) =>
|
|
43
46
|
// we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
44
|
-
wireSchema
|
|
45
|
-
.
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
S.encode(wireSchema)({ body: m, meta: { requestContext, span } }).pipe(
|
|
48
|
+
Effect.orDie,
|
|
49
|
+
Effect
|
|
50
|
+
.andThen(JSON.stringify),
|
|
48
51
|
// .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
|
|
49
|
-
.flatMap((_) => q.offer(_))
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
Effect.flatMap((_) => q.offer(_)),
|
|
53
|
+
Effect
|
|
54
|
+
.asUnit
|
|
55
|
+
))
|
|
56
|
+
.pipe(forkDaemonReportQueue)
|
|
53
57
|
)
|
|
54
58
|
}),
|
|
55
59
|
makeDrain: <DrainE, DrainR>(
|
|
@@ -61,35 +65,50 @@ export function makeMemQueue<
|
|
|
61
65
|
// we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
62
66
|
Effect
|
|
63
67
|
.sync(() => JSON.parse(msg))
|
|
64
|
-
.
|
|
65
|
-
|
|
66
|
-
.flatMap(({ body, meta }) =>
|
|
68
|
+
.pipe(
|
|
69
|
+
Effect.flatMap(parseDrain),
|
|
67
70
|
Effect
|
|
68
|
-
.
|
|
69
|
-
|
|
70
|
-
.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
71
|
+
.orDie,
|
|
72
|
+
Effect
|
|
73
|
+
.flatMap(({ body, meta }) =>
|
|
74
|
+
Effect
|
|
75
|
+
.logDebug(`$$ [${queueDrainName}] Processing incoming message`)
|
|
76
|
+
.pipe(
|
|
77
|
+
Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
|
|
78
|
+
Effect.zipRight(handleEvent(body)),
|
|
79
|
+
silenceAndReportError,
|
|
80
|
+
(_) =>
|
|
81
|
+
setupRequestContext(
|
|
82
|
+
_,
|
|
83
|
+
RequestContext.inherit(meta.requestContext, {
|
|
84
|
+
id: RequestId(body.id),
|
|
85
|
+
locale: "en" as const,
|
|
86
|
+
name: NonEmptyString255(body._tag)
|
|
87
|
+
})
|
|
88
|
+
),
|
|
89
|
+
Effect
|
|
90
|
+
.withSpan("queue.drain", {
|
|
91
|
+
attributes: { "queue.name": queueDrainName },
|
|
92
|
+
parent: meta.span
|
|
93
|
+
? Tracer.externalSpan(meta.span)
|
|
94
|
+
: undefined
|
|
95
|
+
})
|
|
96
|
+
)
|
|
97
|
+
)
|
|
83
98
|
)
|
|
84
99
|
return yield* $(
|
|
85
100
|
qDrain
|
|
86
101
|
.take
|
|
87
|
-
.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
102
|
+
.pipe(
|
|
103
|
+
Effect.flatMap((x) =>
|
|
104
|
+
processMessage(x).pipe(Effect.uninterruptible, Effect.fork, Effect.flatMap(Fiber.join))
|
|
105
|
+
),
|
|
106
|
+
// TODO: normally a failed item would be returned to the queue and retried up to X times.
|
|
107
|
+
// .flatMap(_ => _._tag === "Failure" && !isInterrupted ? qDrain.offer(x) : Effect.unit) // TODO: retry count tracking and max retries.
|
|
108
|
+
silenceAndReportError,
|
|
109
|
+
Effect.forever,
|
|
110
|
+
Effect.forkScoped
|
|
111
|
+
)
|
|
93
112
|
)
|
|
94
113
|
})
|
|
95
114
|
} satisfies QueueBase<Evt, DrainEvt>
|
|
@@ -10,11 +10,14 @@ import type {} from "@azure/service-bus"
|
|
|
10
10
|
import { captureException } from "@effect-app/infra/errorReporter"
|
|
11
11
|
import { RequestContext } from "@effect-app/infra/RequestContext"
|
|
12
12
|
import { Tracer } from "effect"
|
|
13
|
-
import
|
|
13
|
+
import { Effect, flow, Layer, S } from "effect-app"
|
|
14
14
|
import { RequestId } from "effect-app/ids"
|
|
15
|
-
import {
|
|
15
|
+
import type { StringId } from "effect-app/schema"
|
|
16
|
+
import { NonEmptyString255, struct } from "effect-app/schema"
|
|
17
|
+
import { pretty } from "effect-app/utils"
|
|
18
|
+
import { setupRequestContext } from "../../api/setupRequest.js"
|
|
16
19
|
import { RequestContextContainer } from "../RequestContextContainer.js"
|
|
17
|
-
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
|
|
20
|
+
import { forkDaemonReportQueue, reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
|
|
18
21
|
import { type QueueBase, QueueMeta } from "./service.js"
|
|
19
22
|
|
|
20
23
|
/**
|
|
@@ -36,12 +39,12 @@ export function makeServiceBusQueue<
|
|
|
36
39
|
meta: QueueMeta
|
|
37
40
|
})
|
|
38
41
|
const drainW = struct({ body: drainSchema, meta: QueueMeta })
|
|
39
|
-
const parseDrain = flow(
|
|
42
|
+
const parseDrain = flow(S.decodeUnknown(drainW), Effect.orDie)
|
|
40
43
|
|
|
41
44
|
return Effect.gen(function*($) {
|
|
42
45
|
const s = yield* $(Sender)
|
|
43
46
|
const receiver = yield* $(Receiver)
|
|
44
|
-
const receiverLayer =
|
|
47
|
+
const receiverLayer = Layer.succeed(Receiver, receiver)
|
|
45
48
|
const silenceAndReportError = reportNonInterruptedFailure({ name: "ServiceBusQueue.drain." + queueDrainName })
|
|
46
49
|
const reportError = reportNonInterruptedFailureCause({ name: "ServiceBusQueue.drain." + queueDrainName })
|
|
47
50
|
const rcc = yield* $(RequestContextContainer)
|
|
@@ -55,45 +58,63 @@ export function makeServiceBusQueue<
|
|
|
55
58
|
function processMessage(messageBody: any) {
|
|
56
59
|
return Effect
|
|
57
60
|
.sync(() => JSON.parse(messageBody))
|
|
58
|
-
.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
.pipe(
|
|
62
|
+
Effect.flatMap((x) => parseDrain(x)),
|
|
63
|
+
Effect.orDie,
|
|
61
64
|
Effect
|
|
62
|
-
.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
.flatMap(({ body, meta }) =>
|
|
66
|
+
Effect
|
|
67
|
+
.logDebug(`$$ [${queueDrainName}] Processing incoming message`)
|
|
68
|
+
.pipe(
|
|
69
|
+
Effect.annotateLogs({
|
|
70
|
+
body: pretty(body),
|
|
71
|
+
meta: pretty(meta)
|
|
72
|
+
}),
|
|
73
|
+
Effect
|
|
74
|
+
.zipRight(handleEvent(body)),
|
|
75
|
+
Effect
|
|
76
|
+
.orDie
|
|
77
|
+
)
|
|
78
|
+
// we silenceAndReportError here, so that the error is reported, and moves into the Exit.
|
|
79
|
+
.pipe(
|
|
80
|
+
silenceAndReportError,
|
|
81
|
+
(_) =>
|
|
82
|
+
setupRequestContext(
|
|
83
|
+
_,
|
|
84
|
+
RequestContext.inherit(meta.requestContext, {
|
|
85
|
+
id: RequestId(body.id),
|
|
86
|
+
locale: "en" as const,
|
|
87
|
+
name: NonEmptyString255(body._tag)
|
|
88
|
+
})
|
|
89
|
+
),
|
|
90
|
+
Effect
|
|
91
|
+
.withSpan("queue.drain", {
|
|
92
|
+
attributes: { "queue.name": queueDrainName },
|
|
93
|
+
parent: meta.span
|
|
94
|
+
? Tracer.externalSpan(meta.span)
|
|
95
|
+
: undefined
|
|
96
|
+
})
|
|
97
|
+
)
|
|
98
|
+
),
|
|
99
|
+
Effect
|
|
100
|
+
// we reportError here, so that we report the error only, and keep flowing
|
|
101
|
+
.tapErrorCause(reportError)
|
|
79
102
|
)
|
|
80
|
-
// we reportError here, so that we report the error only, and keep flowing
|
|
81
|
-
.tapErrorCause(reportError)
|
|
82
103
|
}
|
|
83
104
|
|
|
84
105
|
return yield* $(
|
|
85
106
|
subscribe({
|
|
86
|
-
processMessage: (x) => processMessage(x.body).uninterruptible,
|
|
107
|
+
processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
|
|
87
108
|
processError: (err) => Effect.sync(() => captureException(err.error))
|
|
88
109
|
})
|
|
89
|
-
.provide(receiverLayer)
|
|
110
|
+
.pipe(Effect.provide(receiverLayer))
|
|
90
111
|
)
|
|
91
112
|
}),
|
|
92
113
|
|
|
93
114
|
publish: (...messages) =>
|
|
94
115
|
Effect.gen(function*($) {
|
|
95
116
|
const requestContext = yield* $(rcc.requestContext)
|
|
96
|
-
const currentSpan = yield* $(Effect.currentSpan.orDie)
|
|
117
|
+
const currentSpan = yield* $(Effect.currentSpan.pipe(Effect.orDie))
|
|
97
118
|
const span = Tracer.externalSpan(currentSpan)
|
|
98
119
|
return yield* $(
|
|
99
120
|
Effect
|
|
@@ -101,14 +122,14 @@ export function makeServiceBusQueue<
|
|
|
101
122
|
s.sendMessages(
|
|
102
123
|
messages.map((m) => ({
|
|
103
124
|
body: JSON.stringify(
|
|
104
|
-
|
|
125
|
+
S.encodeSync(wireSchema)({ body: m, meta: { requestContext, span } })
|
|
105
126
|
),
|
|
106
127
|
messageId: m.id, /* correllationid: requestId */
|
|
107
128
|
contentType: "application/json"
|
|
108
129
|
}))
|
|
109
130
|
)
|
|
110
131
|
)
|
|
111
|
-
.forkDaemonReportQueue
|
|
132
|
+
.pipe(forkDaemonReportQueue)
|
|
112
133
|
)
|
|
113
134
|
})
|
|
114
135
|
} satisfies QueueBase<Evt, DrainEvt>
|
|
@@ -119,5 +140,5 @@ export function makeServiceBusQueue<
|
|
|
119
140
|
* @tsplus static QueueMaker.Ops makeServiceBusLayers
|
|
120
141
|
*/
|
|
121
142
|
export function makeServiceBusLayers(url: string, queueName: string, queueDrainName: string) {
|
|
122
|
-
return Layer.merge(LiveReceiver(queueDrainName), LiveSender(queueName)).provide(LiveServiceBusClient(url))
|
|
143
|
+
return Layer.merge(LiveReceiver(queueDrainName), LiveSender(queueName)).pipe(Layer.provide(LiveServiceBusClient(url)))
|
|
123
144
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { struct } from "@effect-app/schema"
|
|
2
|
+
import { type Effect, type NonEmptyReadonlyArray, S, type Scope } from "effect-app"
|
|
1
3
|
import { RequestContext } from "../../RequestContext.js"
|
|
2
4
|
import type { RequestContextContainer } from "../RequestContextContainer.js"
|
|
3
5
|
import type { ContextMapContainer } from "../Store/ContextMapContainer.js"
|
|
@@ -19,10 +21,9 @@ export const QueueMaker: QueueMakerOps = {}
|
|
|
19
21
|
|
|
20
22
|
export const QueueMeta = struct({
|
|
21
23
|
requestContext: RequestContext,
|
|
22
|
-
span: struct({
|
|
23
|
-
spanId: string,
|
|
24
|
-
traceId: string,
|
|
25
|
-
sampled:
|
|
26
|
-
})
|
|
27
|
-
.optional()
|
|
24
|
+
span: S.optional(struct({
|
|
25
|
+
spanId: S.string,
|
|
26
|
+
traceId: S.string,
|
|
27
|
+
sampled: S.optional(S.boolean)
|
|
28
|
+
}))
|
|
28
29
|
})
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { toNonEmptyArray } from "@effect-app/core/Array"
|
|
2
|
+
import type { NonEmptyReadonlyArray } from "effect-app"
|
|
3
|
+
import { Effect } from "effect-app"
|
|
4
|
+
import { get, logMany, set } from "effect-app/Pure"
|
|
5
|
+
import type { FixEnv, Pure, PureEnvEnv, PureLogT } from "effect-app/Pure"
|
|
2
6
|
|
|
3
7
|
export interface PureDSL<S, S2, W> {
|
|
4
8
|
get: Pure<never, S, S, never, never, S>
|
|
@@ -7,9 +11,9 @@ export interface PureDSL<S, S2, W> {
|
|
|
7
11
|
}
|
|
8
12
|
|
|
9
13
|
export const AnyPureDSL: PureDSL<any, any, any> = {
|
|
10
|
-
get:
|
|
11
|
-
set:
|
|
12
|
-
log: (...evt: any[]) =>
|
|
14
|
+
get: get(),
|
|
15
|
+
set: set as any,
|
|
16
|
+
log: (...evt: any[]) => logMany(evt)
|
|
13
17
|
}
|
|
14
18
|
|
|
15
19
|
const anyDSL = makeDSL<any, any, any>()
|
|
@@ -25,14 +29,14 @@ export type AllDSL<T, Evt> =
|
|
|
25
29
|
*/
|
|
26
30
|
export interface AllDSLExt<T, Evt> {
|
|
27
31
|
modify: <R, E, A, S1 extends T, S2 extends T>(
|
|
28
|
-
pure: (items: S1[], dsl: PureDSL<S1[], S2[], Evt>) => Effect<A, E, R>
|
|
29
|
-
) => Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>
|
|
32
|
+
pure: (items: readonly S1[], dsl: PureDSL<readonly S1[], readonly S2[], Evt>) => Effect<A, E, R>
|
|
33
|
+
) => Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
|
|
30
34
|
update: <R, E, S1 extends T, S2 extends T>(
|
|
31
|
-
pure: (items: S1[], log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<S2[], E, R>
|
|
32
|
-
) => Effect<S2[], E, FixEnv<R, Evt, S1[], S2[]>>
|
|
35
|
+
pure: (items: readonly S1[], log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<readonly S2[], E, R>
|
|
36
|
+
) => Effect<readonly S2[], E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
|
|
33
37
|
updateWith: <S1 extends T, S2 extends T>(
|
|
34
|
-
upd: (item: S1[]) => S2[]
|
|
35
|
-
) => Effect<S2[], never, PureEnvEnv<Evt, S1[], S2[]>>
|
|
38
|
+
upd: (item: readonly S1[]) => readonly S2[]
|
|
39
|
+
) => Effect<readonly S2[], never, PureEnvEnv<Evt, readonly S1[], readonly S2[]>>
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
export function makeAllDSL<T, Evt>() {
|
|
@@ -78,7 +82,7 @@ export function makeDSL<S1, S2, Evt>() {
|
|
|
78
82
|
dsl: PureDSL<S1, S2, Evt>
|
|
79
83
|
) => Effect<A, E, R>
|
|
80
84
|
): Effect<A, E, FixEnv<R, Evt, S1, S2>> {
|
|
81
|
-
return dsl.get.flatMap((items) => pure(items, dsl)) as any
|
|
85
|
+
return dsl.get.pipe(Effect.flatMap((items) => pure(items, dsl))) as any
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
function update<
|
|
@@ -90,7 +94,7 @@ export function makeDSL<S1, S2, Evt>() {
|
|
|
90
94
|
log: (...evt: Evt[]) => PureLogT<Evt>
|
|
91
95
|
) => Effect<S2, E, R>
|
|
92
96
|
): Effect<S2, E, FixEnv<R, Evt, S1, S2>> {
|
|
93
|
-
return dsl.get.flatMap((items) => pure(items, dsl.log).tap(dsl.set)) as any
|
|
97
|
+
return dsl.get.pipe(Effect.flatMap((items) => pure(items, dsl.log).pipe(Effect.tap(dsl.set)))) as any
|
|
94
98
|
}
|
|
95
99
|
|
|
96
100
|
function withDSL<
|
|
@@ -120,12 +124,12 @@ export function makeDSL<S1, S2, Evt>() {
|
|
|
120
124
|
export interface DSLExt<S1, S2, Evt> extends ReturnType<typeof makeDSL<S1, S2, Evt>> {}
|
|
121
125
|
|
|
122
126
|
export function ifAny<T, R, E, A>(fn: (items: NonEmptyReadonlyArray<T>) => Effect<A, E, R>) {
|
|
123
|
-
return (items: Iterable<T>) => Effect.sync(() => items
|
|
127
|
+
return (items: Iterable<T>) => Effect.flatMapOption(Effect.sync(() => toNonEmptyArray([...items])), fn)
|
|
124
128
|
}
|
|
125
129
|
|
|
126
130
|
/**
|
|
127
131
|
* @tsplus fluent Iterable ifAny
|
|
128
132
|
*/
|
|
129
133
|
export function ifAny_<T, R, E, A>(items: Iterable<T>, fn: (items: NonEmptyReadonlyArray<T>) => Effect<A, E, R>) {
|
|
130
|
-
return Effect.sync(() => items
|
|
134
|
+
return Effect.flatMapOption(Effect.sync(() => toNonEmptyArray([...items])), fn)
|
|
131
135
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
// Update = Must return updated items
|
|
3
3
|
// Modify = Must `set` updated items, and can return anything.
|
|
4
|
-
import
|
|
4
|
+
import { toNonEmptyArray } from "@effect-app/core/Array"
|
|
5
|
+
import { NonNegativeInt } from "@effect-app/schema"
|
|
6
|
+
import { Effect, ReadonlyArray } from "effect-app"
|
|
7
|
+
import type { NonEmptyArray, NonEmptyReadonlyArray, Option } from "effect-app"
|
|
8
|
+
import { type FixEnv, type PureEnv, runTerm } from "effect-app/Pure"
|
|
5
9
|
import type { InvalidStateError, OptimisticConcurrencyException } from "../../errors.js"
|
|
6
10
|
import { NotFoundError } from "../../errors.js"
|
|
7
11
|
import type { Filter, PersistenceModelType } from "../../services/Store.js"
|
|
@@ -23,7 +27,7 @@ export function get<
|
|
|
23
27
|
) {
|
|
24
28
|
return self
|
|
25
29
|
.find(id)
|
|
26
|
-
.flatMap((_) =>
|
|
30
|
+
.pipe(Effect.flatMap((_) => Effect.mapError(_, () => new NotFoundError<ItemType>({ type: self.itemType, id }))))
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
/**
|
|
@@ -109,12 +113,11 @@ export function projectEffect<
|
|
|
109
113
|
>
|
|
110
114
|
): Effect<S[], E, R> {
|
|
111
115
|
// TODO: a projection that gets sent to the db instead.
|
|
112
|
-
return
|
|
116
|
+
return Effect.flatMap(map, (f) =>
|
|
113
117
|
self
|
|
114
118
|
.utils
|
|
115
119
|
.filter(f)
|
|
116
|
-
.map((_) => f.collect ?
|
|
117
|
-
)
|
|
120
|
+
.pipe(Effect.map((_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown as S[])))
|
|
118
121
|
}
|
|
119
122
|
|
|
120
123
|
/**
|
|
@@ -168,7 +171,7 @@ export function project<
|
|
|
168
171
|
skip?: number
|
|
169
172
|
}
|
|
170
173
|
): Effect<S[]> {
|
|
171
|
-
return
|
|
174
|
+
return projectEffect(self, Effect.sync(() => map))
|
|
172
175
|
}
|
|
173
176
|
|
|
174
177
|
/**
|
|
@@ -184,9 +187,8 @@ export function count<
|
|
|
184
187
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
185
188
|
filter?: Filter<PM>
|
|
186
189
|
) {
|
|
187
|
-
return self
|
|
188
|
-
.
|
|
189
|
-
.map((_) => NonNegativeInt(_.length))
|
|
190
|
+
return projectEffect(self, Effect.sync(() => ({ filter })))
|
|
191
|
+
.pipe(Effect.map((_) => NonNegativeInt(_.length)))
|
|
190
192
|
}
|
|
191
193
|
|
|
192
194
|
/**
|
|
@@ -205,11 +207,12 @@ export function queryEffect<
|
|
|
205
207
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
206
208
|
map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
|
|
207
209
|
) {
|
|
208
|
-
return
|
|
210
|
+
return Effect.flatMap(map, (f) =>
|
|
209
211
|
(f.filter ? self.utils.filter(f) : self.utils.all)
|
|
210
|
-
.
|
|
211
|
-
|
|
212
|
-
|
|
212
|
+
.pipe(
|
|
213
|
+
Effect.flatMap((_) => self.utils.parseMany(_)),
|
|
214
|
+
Effect.map((_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown[] as S[])
|
|
215
|
+
))
|
|
213
216
|
}
|
|
214
217
|
|
|
215
218
|
/**
|
|
@@ -253,16 +256,24 @@ export function queryOneEffect<
|
|
|
253
256
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
254
257
|
map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S> }, E, R>
|
|
255
258
|
): Effect<S, E | NotFoundError<ItemType>, R> {
|
|
256
|
-
return
|
|
259
|
+
return Effect.flatMap(map, (f) =>
|
|
257
260
|
(f.filter ? self.utils.filter({ filter: f.filter, limit: 1 }) : self.utils.all)
|
|
258
|
-
.
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
.
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
261
|
+
.pipe(
|
|
262
|
+
Effect.flatMap((_) => self.utils.parseMany(_)),
|
|
263
|
+
Effect
|
|
264
|
+
.flatMap((_) =>
|
|
265
|
+
toNonEmptyArray(
|
|
266
|
+
f.collect
|
|
267
|
+
? ReadonlyArray.filterMap(_, f.collect)
|
|
268
|
+
: _ as unknown[] as S[]
|
|
269
|
+
)
|
|
270
|
+
.pipe(
|
|
271
|
+
Effect.mapError(() => new NotFoundError<ItemType>({ type: self.itemType, id: f.filter })),
|
|
272
|
+
Effect
|
|
273
|
+
.map((_) => _[0])
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
))
|
|
266
277
|
}
|
|
267
278
|
|
|
268
279
|
/**
|
|
@@ -279,7 +290,7 @@ export function query<
|
|
|
279
290
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
280
291
|
map: { filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }
|
|
281
292
|
) {
|
|
282
|
-
return
|
|
293
|
+
return queryEffect(self, Effect.sync(() => map))
|
|
283
294
|
}
|
|
284
295
|
|
|
285
296
|
/**
|
|
@@ -314,7 +325,7 @@ export function queryOne<
|
|
|
314
325
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
315
326
|
map: { filter?: Filter<PM>; collect?: (t: T) => Option<S> }
|
|
316
327
|
) {
|
|
317
|
-
return
|
|
328
|
+
return queryOneEffect(self, Effect.sync(() => map))
|
|
318
329
|
}
|
|
319
330
|
|
|
320
331
|
/**
|
|
@@ -367,7 +378,7 @@ export function queryAndSaveOnePureEffect(
|
|
|
367
378
|
) {
|
|
368
379
|
return (pure: any) =>
|
|
369
380
|
queryOneEffect(self, map)
|
|
370
|
-
.flatMap((_) => saveWithPure_(self, _, pure))
|
|
381
|
+
.pipe(Effect.flatMap((_) => saveWithPure_(self, _, pure)))
|
|
371
382
|
}
|
|
372
383
|
|
|
373
384
|
/**
|
|
@@ -426,9 +437,9 @@ export function queryAndSavePureEffect<
|
|
|
426
437
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
427
438
|
map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
|
|
428
439
|
) {
|
|
429
|
-
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
|
|
440
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, readonly S[], readonly S2[]>>) =>
|
|
430
441
|
queryEffect(self, map)
|
|
431
|
-
.flatMap((_) =>
|
|
442
|
+
.pipe(Effect.flatMap((_) => saveManyWithPure_(self, _, pure)))
|
|
432
443
|
}
|
|
433
444
|
|
|
434
445
|
/**
|
|
@@ -444,7 +455,7 @@ export function queryAndSavePure<
|
|
|
444
455
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
445
456
|
map: { filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }
|
|
446
457
|
) {
|
|
447
|
-
return
|
|
458
|
+
return queryAndSavePureEffect(self, Effect.sync(() => map))
|
|
448
459
|
}
|
|
449
460
|
|
|
450
461
|
/**
|
|
@@ -456,7 +467,7 @@ export function saveManyWithPure<
|
|
|
456
467
|
Evt,
|
|
457
468
|
ItemType extends string
|
|
458
469
|
>(self: RepositoryBaseC<T, PM, Evt, ItemType>) {
|
|
459
|
-
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>) =>
|
|
470
|
+
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>) =>
|
|
460
471
|
(items: Iterable<S1>) => saveManyWithPure_(self, items, pure)
|
|
461
472
|
}
|
|
462
473
|
|
|
@@ -470,7 +481,7 @@ export function byIdAndSaveWithPure<
|
|
|
470
481
|
ItemType extends string
|
|
471
482
|
>(self: RepositoryBaseC<T, PM, Evt, ItemType>, id: T["id"]) {
|
|
472
483
|
return <R, A, E, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) =>
|
|
473
|
-
get(self, id).flatMap((item) => saveWithPure_(self, item, pure))
|
|
484
|
+
get(self, id).pipe(Effect.flatMap((item) => saveWithPure_(self, item, pure)))
|
|
474
485
|
}
|
|
475
486
|
|
|
476
487
|
/**
|
|
@@ -505,11 +516,11 @@ export function saveManyWithPure_<
|
|
|
505
516
|
>(
|
|
506
517
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
507
518
|
items: Iterable<S1>,
|
|
508
|
-
pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>
|
|
519
|
+
pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
|
|
509
520
|
) {
|
|
510
521
|
return saveAllWithEffectInt(
|
|
511
522
|
self,
|
|
512
|
-
|
|
523
|
+
runTerm(pure, [...items])
|
|
513
524
|
)
|
|
514
525
|
}
|
|
515
526
|
|
|
@@ -533,9 +544,9 @@ export function saveWithPure_<
|
|
|
533
544
|
) {
|
|
534
545
|
return saveAllWithEffectInt(
|
|
535
546
|
self,
|
|
536
|
-
pure
|
|
537
|
-
.
|
|
538
|
-
|
|
547
|
+
runTerm(pure, item)
|
|
548
|
+
.pipe(Effect
|
|
549
|
+
.map(([item, events, a]) => [[item], events, a]))
|
|
539
550
|
)
|
|
540
551
|
}
|
|
541
552
|
|
|
@@ -552,10 +563,7 @@ export function saveAllWithEffectInt<
|
|
|
552
563
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
553
564
|
gen: Effect<readonly [Iterable<P>, Iterable<Evt>, A], E, R>
|
|
554
565
|
) {
|
|
555
|
-
return gen
|
|
556
|
-
.flatMap(
|
|
557
|
-
([items, events, a]) => self.saveAndPublish(items, events).map(() => a)
|
|
558
|
-
)
|
|
566
|
+
return Effect.flatMap(gen, ([items, events, a]) => self.saveAndPublish(items, events).pipe(Effect.map(() => a)))
|
|
559
567
|
}
|
|
560
568
|
|
|
561
569
|
/**
|
|
@@ -575,9 +583,9 @@ export function queryAndSavePureEffectBatched<
|
|
|
575
583
|
map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>,
|
|
576
584
|
batchSize = 100
|
|
577
585
|
) {
|
|
578
|
-
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
|
|
586
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, readonly S[], readonly S2[]>>) =>
|
|
579
587
|
queryEffect(self, map)
|
|
580
|
-
.flatMap((_) =>
|
|
588
|
+
.pipe(Effect.flatMap((_) => saveManyWithPureBatched_(self, _, pure, batchSize)))
|
|
581
589
|
}
|
|
582
590
|
|
|
583
591
|
/**
|
|
@@ -595,7 +603,7 @@ export function queryAndSavePureBatched<
|
|
|
595
603
|
map: { filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number },
|
|
596
604
|
batchSize = 100
|
|
597
605
|
) {
|
|
598
|
-
return
|
|
606
|
+
return queryAndSavePureEffectBatched(self, Effect.sync(() => map), batchSize)
|
|
599
607
|
}
|
|
600
608
|
|
|
601
609
|
/**
|
|
@@ -607,7 +615,7 @@ export function saveManyWithPureBatched<
|
|
|
607
615
|
Evt,
|
|
608
616
|
ItemType extends string
|
|
609
617
|
>(self: RepositoryBaseC<T, PM, Evt, ItemType>, batchSize = 100) {
|
|
610
|
-
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>) =>
|
|
618
|
+
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>) =>
|
|
611
619
|
(items: Iterable<S1>) => saveManyWithPureBatched_(self, items, pure, batchSize)
|
|
612
620
|
}
|
|
613
621
|
|
|
@@ -627,17 +635,17 @@ export function saveManyWithPureBatched_<
|
|
|
627
635
|
>(
|
|
628
636
|
self: RepositoryBaseC<T, PM, Evt, ItemType>,
|
|
629
637
|
items: Iterable<S1>,
|
|
630
|
-
pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>,
|
|
638
|
+
pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>,
|
|
631
639
|
batchSize = 100
|
|
632
640
|
) {
|
|
633
|
-
return
|
|
634
|
-
.
|
|
635
|
-
|
|
641
|
+
return Effect.forEach(
|
|
642
|
+
ReadonlyArray.chunk_(items, batchSize),
|
|
643
|
+
(batch) =>
|
|
636
644
|
saveAllWithEffectInt(
|
|
637
645
|
self,
|
|
638
|
-
|
|
646
|
+
runTerm(pure, batch)
|
|
639
647
|
)
|
|
640
|
-
|
|
648
|
+
)
|
|
641
649
|
}
|
|
642
650
|
|
|
643
651
|
/**
|
|
@@ -683,7 +691,7 @@ export function itemUpdateWithEffect<
|
|
|
683
691
|
id: T["id"],
|
|
684
692
|
mod: (item: T) => Effect<T, E, R>
|
|
685
693
|
) {
|
|
686
|
-
return
|
|
694
|
+
return get(repo, id).pipe(Effect.andThen(mod), Effect.andThen(save(repo)))
|
|
687
695
|
}
|
|
688
696
|
|
|
689
697
|
/**
|