@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,7 +1,10 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
|
|
3
|
+
import { toNonEmptyArray } from "@effect-app/core/Array"
|
|
3
4
|
import { CosmosClient, CosmosClientLayer } from "@effect-app/infra-adapters/cosmos-client"
|
|
4
|
-
import {
|
|
5
|
+
import { Chunk, Duration, Effect, Layer, Option, ReadonlyArray, Secret } from "effect-app"
|
|
6
|
+
import type { NonEmptyReadonlyArray } from "effect-app"
|
|
7
|
+
import { dropUndefinedT, omit, pick, spread } from "effect-app/utils"
|
|
5
8
|
import { OptimisticConcurrencyException } from "../../errors.js"
|
|
6
9
|
import {
|
|
7
10
|
buildCosmosQuery,
|
|
@@ -60,7 +63,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
60
63
|
(x) =>
|
|
61
64
|
[
|
|
62
65
|
x,
|
|
63
|
-
Option.fromNullable(x._etag)
|
|
66
|
+
Option.match(Option.fromNullable(x._etag), {
|
|
64
67
|
onNone: () =>
|
|
65
68
|
dropUndefinedT({
|
|
66
69
|
operationType: "Create" as const,
|
|
@@ -84,54 +87,58 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
84
87
|
})
|
|
85
88
|
] as const
|
|
86
89
|
)
|
|
87
|
-
const batches =
|
|
90
|
+
const batches = Chunk.toReadonlyArray(ReadonlyArray.chunk_(b, config?.maxBulkSize ?? 10))
|
|
88
91
|
|
|
89
92
|
const batchResult = yield* $(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
93
|
+
Effect.forEach(
|
|
94
|
+
batches
|
|
95
|
+
.map((x, i) => [i, x] as const),
|
|
96
|
+
([i, batch]) =>
|
|
97
|
+
Effect
|
|
98
|
+
.promise(() => bulk(batch.map(([, op]) => op)))
|
|
99
|
+
.pipe(
|
|
100
|
+
Effect
|
|
101
|
+
.delay(Duration.millis(i === 0 ? 0 : 1100)),
|
|
102
|
+
Effect
|
|
103
|
+
.flatMap((responses) =>
|
|
104
|
+
Effect.gen(function*($) {
|
|
105
|
+
const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404)
|
|
106
|
+
if (r) {
|
|
107
|
+
return yield* $(
|
|
108
|
+
Effect.fail(
|
|
109
|
+
new OptimisticConcurrencyException(
|
|
110
|
+
{ type: name, id: JSON.stringify(r.resourceBody?.["id"]) }
|
|
111
|
+
)
|
|
105
112
|
)
|
|
106
113
|
)
|
|
114
|
+
}
|
|
115
|
+
const r2 = responses.find(
|
|
116
|
+
(x) => x.statusCode > 299 || x.statusCode < 200
|
|
107
117
|
)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
Effect.die(
|
|
115
|
-
new CosmosDbOperationError(
|
|
116
|
-
"not able to update record: " + r2.statusCode
|
|
118
|
+
if (r2) {
|
|
119
|
+
return yield* $(
|
|
120
|
+
Effect.die(
|
|
121
|
+
new CosmosDbOperationError(
|
|
122
|
+
"not able to update record: " + r2.statusCode
|
|
123
|
+
)
|
|
117
124
|
)
|
|
118
125
|
)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
}
|
|
127
|
+
return batch.map(([e], i) => ({
|
|
128
|
+
...e,
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
130
|
+
_etag: responses[i]!.eTag
|
|
131
|
+
}))
|
|
132
|
+
})
|
|
133
|
+
)
|
|
134
|
+
)
|
|
135
|
+
)
|
|
129
136
|
)
|
|
130
137
|
return batchResult.flat() as unknown as NonEmptyReadonlyArray<PM>
|
|
131
138
|
})
|
|
132
|
-
.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
|
|
139
|
+
.pipe(Effect.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
|
|
133
140
|
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
134
|
-
})
|
|
141
|
+
}))
|
|
135
142
|
|
|
136
143
|
const batchSet = (items: NonEmptyReadonlyArray<PM>) => {
|
|
137
144
|
return Effect
|
|
@@ -140,13 +147,13 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
140
147
|
(x) =>
|
|
141
148
|
[
|
|
142
149
|
x,
|
|
143
|
-
Option.fromNullable(x._etag)
|
|
150
|
+
Option.match(Option.fromNullable(x._etag), {
|
|
144
151
|
onNone: () => ({
|
|
145
152
|
operationType: "Create" as const,
|
|
146
153
|
resourceBody: {
|
|
147
154
|
...omit(x, "_etag"),
|
|
148
155
|
_partitionKey: config?.partitionValue(x)
|
|
149
|
-
}
|
|
156
|
+
}
|
|
150
157
|
}),
|
|
151
158
|
onSome: (eTag) => ({
|
|
152
159
|
operationType: "Replace" as const,
|
|
@@ -154,7 +161,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
154
161
|
resourceBody: {
|
|
155
162
|
...omit(x, "_etag"),
|
|
156
163
|
_partitionKey: config?.partitionValue(x)
|
|
157
|
-
}
|
|
164
|
+
},
|
|
158
165
|
ifMatch: eTag
|
|
159
166
|
})
|
|
160
167
|
})
|
|
@@ -165,7 +172,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
165
172
|
|
|
166
173
|
return Effect
|
|
167
174
|
.promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey))
|
|
168
|
-
.flatMap((x) =>
|
|
175
|
+
.pipe(Effect.flatMap((x) =>
|
|
169
176
|
Effect.gen(function*($) {
|
|
170
177
|
const result = x.result ?? []
|
|
171
178
|
const firstFailed = result.find(
|
|
@@ -191,11 +198,12 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
191
198
|
_etag: result[i]?.eTag
|
|
192
199
|
})) as unknown as NonEmptyReadonlyArray<PM>
|
|
193
200
|
})
|
|
194
|
-
)
|
|
195
|
-
})
|
|
196
|
-
.withSpan("Cosmos.batchSet [effect-app/infra/Store]", {
|
|
197
|
-
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
201
|
+
))
|
|
198
202
|
})
|
|
203
|
+
.pipe(Effect
|
|
204
|
+
.withSpan("Cosmos.batchSet [effect-app/infra/Store]", {
|
|
205
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
206
|
+
}))
|
|
199
207
|
}
|
|
200
208
|
|
|
201
209
|
const s: Store<PM, Id> = {
|
|
@@ -204,53 +212,65 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
204
212
|
query: `SELECT * FROM ${name} f WHERE f.id != @id`,
|
|
205
213
|
parameters: [{ name: "@id", value: importedMarkerId }]
|
|
206
214
|
}))
|
|
207
|
-
.
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
215
|
+
.pipe(
|
|
216
|
+
Effect
|
|
217
|
+
.tap((q) => logQuery(q)),
|
|
218
|
+
Effect.flatMap((q) =>
|
|
219
|
+
Effect.promise(() =>
|
|
220
|
+
container
|
|
221
|
+
.items
|
|
222
|
+
.query<PM>(q)
|
|
223
|
+
.fetchAll()
|
|
224
|
+
.then(({ resources }) => resources)
|
|
225
|
+
)
|
|
226
|
+
),
|
|
227
|
+
Effect
|
|
228
|
+
.withSpan("Cosmos.all [effect-app/infra/Store]", {
|
|
229
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
230
|
+
})
|
|
231
|
+
),
|
|
220
232
|
filterJoinSelect: <T extends object>(
|
|
221
233
|
filter: FilterJoinSelect,
|
|
222
234
|
cursor?: { skip?: number; limit?: number }
|
|
223
235
|
) =>
|
|
224
|
-
|
|
225
|
-
.
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
.
|
|
234
|
-
|
|
235
|
-
.
|
|
236
|
-
|
|
236
|
+
Effect
|
|
237
|
+
.forEach(
|
|
238
|
+
filter
|
|
239
|
+
.keys,
|
|
240
|
+
(k) =>
|
|
241
|
+
Effect
|
|
242
|
+
.sync(() => buildFilterJoinSelectCosmosQuery(filter, k, name, cursor?.skip, cursor?.limit))
|
|
243
|
+
.pipe(
|
|
244
|
+
Effect
|
|
245
|
+
.tap((q) => logQuery(q)),
|
|
246
|
+
Effect.flatMap((q) =>
|
|
247
|
+
Effect.promise(() =>
|
|
248
|
+
container
|
|
249
|
+
.items
|
|
250
|
+
.query<T>(q)
|
|
251
|
+
.fetchAll()
|
|
252
|
+
.then(({ resources }) => resources.map((_) => ({ ...defaultValues, ..._ })))
|
|
253
|
+
)
|
|
254
|
+
)
|
|
237
255
|
)
|
|
238
|
-
)
|
|
239
256
|
)
|
|
240
|
-
.
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
257
|
+
.pipe(
|
|
258
|
+
Effect.map((a) => {
|
|
259
|
+
const v = a
|
|
260
|
+
.flatMap((_) => _)
|
|
261
|
+
.map((x) =>
|
|
262
|
+
spread(
|
|
263
|
+
x,
|
|
264
|
+
({ r, ...rest }: any) => ({ ...rest, ...r } as T & { _rootId: string })
|
|
265
|
+
)
|
|
247
266
|
)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
267
|
+
return v
|
|
268
|
+
}),
|
|
269
|
+
Effect
|
|
270
|
+
.withSpan("Cosmos.filterJoinSelect [effect-app/infra/Store]", {
|
|
271
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
272
|
+
})
|
|
273
|
+
),
|
|
254
274
|
/**
|
|
255
275
|
* May return duplicate results for "join_find", when matching more than once.
|
|
256
276
|
*/
|
|
@@ -265,23 +285,28 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
265
285
|
// This is a problem if one of the multiple joined arrays can be empty!
|
|
266
286
|
// https://stackoverflow.com/questions/60320780/azure-cosmosdb-sql-join-not-returning-results-when-the-child-contains-empty-arra
|
|
267
287
|
// so we use multiple queries instead.
|
|
268
|
-
?
|
|
269
|
-
.
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
.
|
|
279
|
-
|
|
280
|
-
|
|
288
|
+
? Effect
|
|
289
|
+
.forEach(
|
|
290
|
+
filter
|
|
291
|
+
.keys,
|
|
292
|
+
(k) =>
|
|
293
|
+
Effect
|
|
294
|
+
.sync(() => buildFindJoinCosmosQuery(filter, k, name, skip, limit))
|
|
295
|
+
.pipe(
|
|
296
|
+
Effect.tap((q) => logQuery(q)),
|
|
297
|
+
Effect
|
|
298
|
+
.flatMap((q) =>
|
|
299
|
+
Effect.promise(() =>
|
|
300
|
+
container
|
|
301
|
+
.items
|
|
302
|
+
.query<M>(q)
|
|
303
|
+
.fetchAll()
|
|
304
|
+
.then(({ resources }) => resources.map((_) => ({ ...defaultValues, ..._ })))
|
|
305
|
+
)
|
|
306
|
+
)
|
|
281
307
|
)
|
|
282
|
-
)
|
|
283
308
|
)
|
|
284
|
-
.map((_) => _.flatMap((_) => _))
|
|
309
|
+
.pipe(Effect.map((_) => _.flatMap((_) => _)))
|
|
285
310
|
: (filter.type === "new-kid"
|
|
286
311
|
? Effect
|
|
287
312
|
.sync(() =>
|
|
@@ -296,39 +321,45 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
296
321
|
limit
|
|
297
322
|
)
|
|
298
323
|
)
|
|
299
|
-
.
|
|
300
|
-
|
|
301
|
-
Effect
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
.
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
324
|
+
.pipe(
|
|
325
|
+
Effect.tap((q) => logQuery(q)),
|
|
326
|
+
Effect
|
|
327
|
+
.flatMap((q) =>
|
|
328
|
+
Effect.promise(() =>
|
|
329
|
+
f.select
|
|
330
|
+
? container
|
|
331
|
+
.items
|
|
332
|
+
.query<M>(q)
|
|
333
|
+
.fetchAll()
|
|
334
|
+
.then(({ resources }) =>
|
|
335
|
+
resources.map((_) => ({ ...pick(defaultValues, f.select!), ..._ }))
|
|
336
|
+
)
|
|
337
|
+
: container
|
|
338
|
+
.items
|
|
339
|
+
.query<{ f: M }>(q)
|
|
340
|
+
.fetchAll()
|
|
341
|
+
.then(({ resources }) => resources.map((_) => ({ ...defaultValues, ..._.f })))
|
|
342
|
+
)
|
|
343
|
+
)
|
|
316
344
|
)
|
|
317
345
|
: Effect
|
|
318
346
|
.sync(() => buildCosmosQuery(filter, name, importedMarkerId, defaultValues, skip, limit))
|
|
319
|
-
.
|
|
320
|
-
|
|
321
|
-
Effect
|
|
322
|
-
|
|
323
|
-
.
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
347
|
+
.pipe(
|
|
348
|
+
Effect.tap((q) => logQuery(q)),
|
|
349
|
+
Effect
|
|
350
|
+
.flatMap((q) =>
|
|
351
|
+
Effect.promise(() =>
|
|
352
|
+
container
|
|
353
|
+
.items
|
|
354
|
+
.query<{ f: M }>(q)
|
|
355
|
+
.fetchAll()
|
|
356
|
+
.then(({ resources }) => resources.map((_) => ({ ...defaultValues, ..._.f })))
|
|
357
|
+
)
|
|
358
|
+
)
|
|
328
359
|
)))
|
|
329
|
-
.withSpan("Cosmos.filter [effect-app/infra/Store]", {
|
|
360
|
+
.pipe(Effect.withSpan("Cosmos.filter [effect-app/infra/Store]", {
|
|
330
361
|
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
331
|
-
})
|
|
362
|
+
}))
|
|
332
363
|
},
|
|
333
364
|
find: (id) =>
|
|
334
365
|
Effect
|
|
@@ -336,15 +367,19 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
336
367
|
container
|
|
337
368
|
.item(id, config?.partitionValue({ id } as PM))
|
|
338
369
|
.read<PM>()
|
|
339
|
-
.then(({ resource }) =>
|
|
370
|
+
.then(({ resource }) =>
|
|
371
|
+
Option.fromNullable(resource).pipe(Option.map((_) => ({ ...defaultValues, ..._ })))
|
|
372
|
+
)
|
|
340
373
|
)
|
|
341
|
-
.
|
|
342
|
-
|
|
343
|
-
|
|
374
|
+
.pipe(Effect
|
|
375
|
+
.withSpan("Cosmos.find [effect-app/infra/Store]", {
|
|
376
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
377
|
+
})),
|
|
344
378
|
set: (e) =>
|
|
345
379
|
Option
|
|
346
|
-
.fromNullable(e._etag)
|
|
347
380
|
.match(
|
|
381
|
+
Option
|
|
382
|
+
.fromNullable(e._etag),
|
|
348
383
|
{
|
|
349
384
|
onNone: () =>
|
|
350
385
|
Effect.promise(() =>
|
|
@@ -367,33 +402,38 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
367
402
|
)
|
|
368
403
|
}
|
|
369
404
|
)
|
|
370
|
-
.
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
405
|
+
.pipe(
|
|
406
|
+
Effect
|
|
407
|
+
.flatMap((x) => {
|
|
408
|
+
if (x.statusCode === 412 || x.statusCode === 404) {
|
|
409
|
+
return new OptimisticConcurrencyException({ type: name, id: e.id })
|
|
410
|
+
}
|
|
411
|
+
if (x.statusCode > 299 || x.statusCode < 200) {
|
|
412
|
+
return Effect.die(
|
|
413
|
+
new CosmosDbOperationError(
|
|
414
|
+
"not able to update record: " + x.statusCode
|
|
415
|
+
)
|
|
416
|
+
)
|
|
417
|
+
}
|
|
418
|
+
return Effect.sync(() => ({
|
|
419
|
+
...e,
|
|
420
|
+
_etag: x.etag
|
|
421
|
+
}))
|
|
422
|
+
}),
|
|
423
|
+
Effect
|
|
424
|
+
.withSpan("Cosmos.set [effect-app/infra/Store]", {
|
|
425
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
426
|
+
})
|
|
427
|
+
),
|
|
389
428
|
batchSet,
|
|
390
429
|
bulkSet,
|
|
391
430
|
remove: (e: PM) =>
|
|
392
431
|
Effect
|
|
393
432
|
.promise(() => container.item(e.id, config?.partitionValue(e)).delete())
|
|
394
|
-
.
|
|
395
|
-
|
|
396
|
-
|
|
433
|
+
.pipe(Effect
|
|
434
|
+
.withSpan("Cosmos.remove [effect-app/infra/Store]", {
|
|
435
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
436
|
+
}))
|
|
397
437
|
}
|
|
398
438
|
|
|
399
439
|
// handle mock data
|
|
@@ -406,20 +446,21 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
406
446
|
)
|
|
407
447
|
)
|
|
408
448
|
|
|
409
|
-
if (!
|
|
449
|
+
if (!Option.isSome(marker)) {
|
|
410
450
|
console.log("Creating mock data for " + name)
|
|
411
451
|
if (seed) {
|
|
412
452
|
const m = yield* $(seed)
|
|
413
453
|
yield* $(
|
|
414
|
-
Effect
|
|
415
|
-
.succeed(m
|
|
416
|
-
|
|
417
|
-
s
|
|
418
|
-
.
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
454
|
+
Effect.flatMapOption(
|
|
455
|
+
Effect.succeed(toNonEmptyArray([...m])),
|
|
456
|
+
(a) =>
|
|
457
|
+
s.bulkSet(a).pipe(
|
|
458
|
+
Effect.orDie,
|
|
459
|
+
Effect
|
|
460
|
+
// we delay extra here, so that initial creation between Companies/POs also have an interval between them.
|
|
461
|
+
.delay(Duration.millis(1100))
|
|
462
|
+
)
|
|
463
|
+
)
|
|
423
464
|
)
|
|
424
465
|
}
|
|
425
466
|
// Mark as imported
|
|
@@ -441,5 +482,5 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
441
482
|
export function CosmosStoreLayer(cfg: StorageConfig) {
|
|
442
483
|
return StoreMaker
|
|
443
484
|
.toLayer(makeCosmosStore(cfg))
|
|
444
|
-
.provide(CosmosClientLayer(cfg.url
|
|
485
|
+
.pipe(Layer.provide(CosmosClientLayer(Secret.value(cfg.url), cfg.dbName)))
|
|
445
486
|
}
|