@effect-app/infra 0.84.0 → 0.85.0-next.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 +18 -7
- package/_cjs/_ext/Array.cjs +3 -2
- package/_cjs/_ext/Array.cjs.map +1 -1
- package/_cjs/api/defaultErrorHandler.cjs +11 -10
- package/_cjs/api/defaultErrorHandler.cjs.map +1 -1
- package/_cjs/api/express/makeJsonSchema.cjs +3 -2
- package/_cjs/api/express/makeJsonSchema.cjs.map +1 -1
- package/_cjs/api/express/makeJsonSchema.test.cjs +2 -2
- package/_cjs/api/express/makeJsonSchema.test.cjs.map +1 -1
- package/_cjs/api/express/makeOpenApiSpecs.cjs +6 -4
- package/_cjs/api/express/makeOpenApiSpecs.cjs.map +1 -1
- package/_cjs/api/express/schema/requestHandler.cjs +25 -23
- package/_cjs/api/express/schema/requestHandler.cjs.map +1 -1
- package/_cjs/api/express/schema/routing.cjs +22 -20
- package/_cjs/api/express/schema/routing.cjs.map +1 -1
- package/_cjs/api/reportError.cjs +2 -2
- package/_cjs/api/routing.cjs +56 -53
- package/_cjs/api/routing.cjs.map +1 -1
- package/_cjs/api/setupRequest.cjs +3 -2
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/api/writeDocs.cjs +6 -4
- package/_cjs/api/writeDocs.cjs.map +1 -1
- package/_cjs/errorReporter.cjs +12 -11
- package/_cjs/errorReporter.cjs.map +1 -1
- package/_cjs/errors.cjs +8 -8
- package/_cjs/errors.cjs.map +1 -1
- package/_cjs/instrument.cjs +2 -1
- package/_cjs/instrument.cjs.map +1 -1
- package/_cjs/logger/jsonLogger.cjs +11 -10
- package/_cjs/logger/jsonLogger.cjs.map +1 -1
- package/_cjs/logger/logFmtLogger.cjs +5 -5
- package/_cjs/logger/logFmtLogger.cjs.map +1 -1
- package/_cjs/logger/shared.cjs +4 -4
- package/_cjs/logger/shared.cjs.map +1 -1
- package/_cjs/rateLimit.cjs +8 -7
- package/_cjs/rateLimit.cjs.map +1 -1
- package/_cjs/services/Emailer/Sendgrid.cjs +14 -12
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
- package/_cjs/services/Emailer/fake.cjs +5 -4
- package/_cjs/services/Emailer/fake.cjs.map +1 -1
- package/_cjs/services/Operations/live.cjs +31 -29
- package/_cjs/services/Operations/live.cjs.map +1 -1
- package/_cjs/services/Operations/service.cjs +6 -5
- package/_cjs/services/Operations/service.cjs.map +1 -1
- package/_cjs/services/QueueMaker/errors.cjs +7 -6
- package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
- package/_cjs/services/QueueMaker/memQueue.cjs +18 -17
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs +16 -15
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/Repository.cjs +17 -16
- package/_cjs/services/Repository.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +35 -33
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/RequestContextContainer.cjs +12 -10
- package/_cjs/services/RequestContextContainer.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos.cjs +49 -46
- package/_cjs/services/Store/Cosmos.cjs.map +1 -1
- package/_cjs/services/Store/Disk.cjs +19 -18
- package/_cjs/services/Store/Disk.cjs.map +1 -1
- package/_cjs/services/Store/Memory.cjs +43 -39
- package/_cjs/services/Store/Memory.cjs.map +1 -1
- package/_cjs/services/Store/Redis.cjs +16 -14
- package/_cjs/services/Store/Redis.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.test.cjs +1 -1
- package/_cjs/services/Store/index.cjs +7 -6
- package/_cjs/services/Store/index.cjs.map +1 -1
- package/_cjs/services/Store/service.cjs +1 -1
- package/_cjs/services/Store/service.cjs.map +1 -1
- package/_cjs/services/Store/utils.cjs +13 -13
- package/_cjs/services/Store/utils.cjs.map +1 -1
- package/_cjs/services/simpledb/cosmosdb.cjs +19 -17
- package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -1
- package/_cjs/services/simpledb/diskdb.cjs +9 -8
- package/_cjs/services/simpledb/diskdb.cjs.map +1 -1
- package/_cjs/services/simpledb/memdb.cjs +11 -9
- package/_cjs/services/simpledb/memdb.cjs.map +1 -1
- package/_cjs/services/simpledb/mongodb.cjs +20 -18
- package/_cjs/services/simpledb/mongodb.cjs.map +1 -1
- package/_cjs/services/simpledb/redisdb.cjs +11 -10
- package/_cjs/services/simpledb/redisdb.cjs.map +1 -1
- package/_cjs/services/simpledb/shared.cjs +5 -5
- package/_cjs/services/simpledb/shared.cjs.map +1 -1
- package/_cjs/services/simpledb/simpledb.cjs +18 -17
- package/_cjs/services/simpledb/simpledb.cjs.map +1 -1
- package/_src/api/authorization.jwt.ts +1 -1
- package/_src/api/defaultErrorHandler.ts +2 -2
- package/_src/api/express/routing.ts.bak +8 -8
- package/_src/api/express/schema/requestHandler.ts +12 -12
- package/_src/api/express/schema/routing.ts +11 -11
- package/_src/api/routing.ts +14 -13
- package/_src/errorReporter.ts +1 -1
- package/_src/services/Emailer/Sendgrid.ts +1 -1
- package/_src/services/Operations/live.ts +5 -5
- package/_src/services/QueueMaker/errors.ts +1 -1
- package/_src/services/QueueMaker/memQueue.ts +2 -2
- package/_src/services/QueueMaker/sbqueue.ts +1 -1
- package/_src/services/Repository.ts +9 -9
- package/_src/services/RepositoryBase.ts +8 -6
- package/_src/services/RequestContextContainer.ts +1 -1
- package/_src/services/Store/Cosmos.ts +17 -12
- package/_src/services/Store/Disk.ts +4 -4
- package/_src/services/Store/Memory.ts +4 -4
- package/_src/services/Store/Redis.ts +1 -1
- package/_src/services/Store/index.test.ts.bak +5 -5
- package/_src/services/Store/index.ts +1 -1
- package/_src/services/Store/utils.ts +16 -16
- package/_src/services/simpledb/diskdb.ts +1 -1
- package/_src/services/simpledb/memdb.ts +1 -1
- package/_src/services/simpledb/redisdb.ts +1 -1
- package/_src/services/simpledb/shared.ts +1 -1
- package/_src/services/simpledb/simpledb.ts +3 -3
- package/dist/RequestContext.d.ts +20 -20
- package/dist/_ext/Array.d.ts +1 -1
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +4 -3
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/codec.d.ts.map +1 -1
- package/dist/api/defaultErrorHandler.d.ts +2 -2
- package/dist/api/defaultErrorHandler.d.ts.map +1 -1
- package/dist/api/defaultErrorHandler.js +13 -11
- package/dist/api/express/makeJsonSchema.d.ts +2 -2
- package/dist/api/express/makeJsonSchema.d.ts.map +1 -1
- package/dist/api/express/makeJsonSchema.js +4 -3
- package/dist/api/express/makeOpenApiSpecs.d.ts +1 -1
- package/dist/api/express/makeOpenApiSpecs.js +7 -5
- package/dist/api/express/schema/requestHandler.d.ts +8 -8
- package/dist/api/express/schema/requestHandler.d.ts.map +1 -1
- package/dist/api/express/schema/requestHandler.js +36 -34
- package/dist/api/express/schema/routing.d.ts +2 -2
- package/dist/api/express/schema/routing.js +23 -21
- package/dist/api/reportError.d.ts +5 -5
- package/dist/api/reportError.d.ts.map +1 -1
- package/dist/api/reportError.js +2 -2
- package/dist/api/routing.d.ts +6 -6
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +60 -57
- package/dist/api/setupRequest.d.ts +2 -2
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +4 -3
- package/dist/api/writeDocs.d.ts +1 -1
- package/dist/api/writeDocs.d.ts.map +1 -1
- package/dist/api/writeDocs.js +7 -5
- package/dist/errorReporter.d.ts +3 -3
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +13 -12
- package/dist/errors.d.ts +7 -7
- package/dist/errors.js +9 -9
- package/dist/instrument.d.ts +1 -1
- package/dist/instrument.d.ts.map +1 -1
- package/dist/instrument.js +3 -2
- package/dist/logger/jsonLogger.d.ts +2 -2
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +12 -11
- package/dist/logger/logFmtLogger.d.ts +2 -2
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +6 -6
- package/dist/logger/shared.d.ts +1 -1
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +5 -5
- package/dist/rateLimit.d.ts +3 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +9 -8
- package/dist/services/Emailer/Sendgrid.d.ts +1 -1
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/services/Emailer/Sendgrid.js +17 -15
- package/dist/services/Emailer/fake.d.ts +1 -1
- package/dist/services/Emailer/fake.d.ts.map +1 -1
- package/dist/services/Emailer/fake.js +6 -5
- package/dist/services/Emailer/service.d.ts +4 -4
- package/dist/services/Operations/live.d.ts +1 -1
- package/dist/services/Operations/live.d.ts.map +1 -1
- package/dist/services/Operations/live.js +39 -37
- package/dist/services/Operations/service.d.ts +9 -9
- package/dist/services/Operations/service.d.ts.map +1 -1
- package/dist/services/Operations/service.js +13 -12
- package/dist/services/QueueMaker/errors.d.ts +3 -3
- package/dist/services/QueueMaker/errors.d.ts.map +1 -1
- package/dist/services/QueueMaker/errors.js +7 -6
- package/dist/services/QueueMaker/memQueue.d.ts +3 -3
- package/dist/services/QueueMaker/memQueue.js +17 -16
- package/dist/services/QueueMaker/sbqueue.d.ts +4 -4
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +16 -15
- package/dist/services/Repository.d.ts +31 -31
- package/dist/services/Repository.d.ts.map +1 -1
- package/dist/services/Repository.js +18 -17
- package/dist/services/RepositoryBase.d.ts +14 -15
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +37 -35
- package/dist/services/RequestContextContainer.d.ts +9 -9
- package/dist/services/RequestContextContainer.d.ts.map +1 -1
- package/dist/services/RequestContextContainer.js +15 -13
- package/dist/services/Store/Cosmos.d.ts +3 -3
- package/dist/services/Store/Cosmos.d.ts.map +1 -1
- package/dist/services/Store/Cosmos.js +54 -51
- package/dist/services/Store/Disk.d.ts +3 -3
- package/dist/services/Store/Disk.d.ts.map +1 -1
- package/dist/services/Store/Disk.js +20 -19
- package/dist/services/Store/Memory.d.ts +5 -5
- package/dist/services/Store/Memory.d.ts.map +1 -1
- package/dist/services/Store/Memory.js +45 -41
- package/dist/services/Store/Redis.d.ts +3 -3
- package/dist/services/Store/Redis.d.ts.map +1 -1
- package/dist/services/Store/Redis.js +17 -15
- package/dist/services/Store/index.d.ts +1 -1
- package/dist/services/Store/index.d.ts.map +1 -1
- package/dist/services/Store/index.js +8 -7
- package/dist/services/Store/service.d.ts +10 -10
- package/dist/services/Store/service.d.ts.map +1 -1
- package/dist/services/Store/service.js +2 -2
- 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 +21 -21
- package/dist/services/simpledb/cosmosdb.d.ts +5 -5
- package/dist/services/simpledb/cosmosdb.js +19 -17
- package/dist/services/simpledb/diskdb.d.ts +4 -4
- package/dist/services/simpledb/diskdb.js +10 -9
- package/dist/services/simpledb/memdb.d.ts +4 -4
- package/dist/services/simpledb/memdb.js +13 -11
- package/dist/services/simpledb/mongodb.d.ts +5 -5
- package/dist/services/simpledb/mongodb.js +16 -14
- package/dist/services/simpledb/redisdb.d.ts +10 -10
- package/dist/services/simpledb/redisdb.js +12 -11
- package/dist/services/simpledb/shared.d.ts +13 -13
- package/dist/services/simpledb/shared.js +6 -6
- package/dist/services/simpledb/simpledb.d.ts +7 -7
- package/dist/services/simpledb/simpledb.d.ts.map +1 -1
- package/dist/services/simpledb/simpledb.js +16 -15
- package/package.json +8 -8
|
@@ -77,7 +77,7 @@ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
|
|
|
77
77
|
.flatMap((_) =>
|
|
78
78
|
_.isFailure() && !_.cause.isFailure()
|
|
79
79
|
? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
|
|
80
|
-
: Effect(
|
|
80
|
+
: Effect.sync(() =>
|
|
81
81
|
_.isSuccess()
|
|
82
82
|
? { _tag: "Success" as const, value: _.value }
|
|
83
83
|
: { _tag: "Failure", errors: _.cause.failures }
|
|
@@ -89,7 +89,7 @@ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
|
|
|
89
89
|
.flatMap((_) =>
|
|
90
90
|
_.isFailure() && !_.cause.isFailure()
|
|
91
91
|
? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
|
|
92
|
-
: Effect(
|
|
92
|
+
: Effect.sync(() =>
|
|
93
93
|
_.isSuccess()
|
|
94
94
|
? { _tag: "Success" as const, value: _.value }
|
|
95
95
|
: { _tag: "Failure", errors: _.cause.failures }
|
|
@@ -101,7 +101,7 @@ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
|
|
|
101
101
|
.flatMap((_) =>
|
|
102
102
|
_.isFailure() && !_.cause.isFailure()
|
|
103
103
|
? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
|
|
104
|
-
: Effect(
|
|
104
|
+
: Effect.sync(() =>
|
|
105
105
|
_.isSuccess()
|
|
106
106
|
? { _tag: "Success" as const, value: _.value }
|
|
107
107
|
: { _tag: "Failure", errors: _.cause.failures }
|
|
@@ -113,7 +113,7 @@ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
|
|
|
113
113
|
.flatMap((_) =>
|
|
114
114
|
_.isFailure() && !_.cause.isFailure()
|
|
115
115
|
? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
|
|
116
|
-
: Effect(
|
|
116
|
+
: Effect.sync(() =>
|
|
117
117
|
_.isSuccess()
|
|
118
118
|
? { _tag: "Success" as const, value: _.value }
|
|
119
119
|
: { _tag: "Failure", errors: _.cause.failures }
|
|
@@ -125,7 +125,7 @@ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
|
|
|
125
125
|
.flatMap((_) =>
|
|
126
126
|
_.isFailure() && !_.cause.isFailure()
|
|
127
127
|
? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
|
|
128
|
-
: Effect(
|
|
128
|
+
: Effect.sync(() =>
|
|
129
129
|
_.isSuccess()
|
|
130
130
|
? { _tag: "Success" as const, value: _.value }
|
|
131
131
|
: { _tag: "Failure", errors: _.cause.failures }
|
|
@@ -152,13 +152,13 @@ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
|
|
|
152
152
|
if (errors.length) {
|
|
153
153
|
return new ValidationError({ errors })
|
|
154
154
|
}
|
|
155
|
-
return Effect({
|
|
155
|
+
return Effect.sync(() => ({
|
|
156
156
|
body: body.value!,
|
|
157
157
|
cookie: cookie.value!,
|
|
158
158
|
headers: headers.value!,
|
|
159
159
|
path: path.value!,
|
|
160
160
|
query: query.value!
|
|
161
|
-
})
|
|
161
|
+
}))
|
|
162
162
|
})
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -307,7 +307,7 @@ export function makeRequestParsers<
|
|
|
307
307
|
Errors
|
|
308
308
|
>["Request"]
|
|
309
309
|
): RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA> {
|
|
310
|
-
const ph = Effect(
|
|
310
|
+
const ph = Effect.sync(() =>
|
|
311
311
|
Option
|
|
312
312
|
.fromNullable(Request.Headers)
|
|
313
313
|
.map((s) => s)
|
|
@@ -316,7 +316,7 @@ export function makeRequestParsers<
|
|
|
316
316
|
)
|
|
317
317
|
const parseHeaders = (u: unknown) => ph.flatMapOpt((d) => d(u))
|
|
318
318
|
|
|
319
|
-
const pq = Effect(
|
|
319
|
+
const pq = Effect.sync(() =>
|
|
320
320
|
Option
|
|
321
321
|
.fromNullable(Request.Query)
|
|
322
322
|
.map((s) => s)
|
|
@@ -325,7 +325,7 @@ export function makeRequestParsers<
|
|
|
325
325
|
)
|
|
326
326
|
const parseQuery = (u: unknown) => pq.flatMapOpt((d) => d(u))
|
|
327
327
|
|
|
328
|
-
const pb = Effect(
|
|
328
|
+
const pb = Effect.sync(() =>
|
|
329
329
|
Option
|
|
330
330
|
.fromNullable(Request.Body)
|
|
331
331
|
.map((s) => s)
|
|
@@ -334,7 +334,7 @@ export function makeRequestParsers<
|
|
|
334
334
|
)
|
|
335
335
|
const parseBody = (u: unknown) => pb.flatMapOpt((d) => d(u))
|
|
336
336
|
|
|
337
|
-
const pp = Effect(
|
|
337
|
+
const pp = Effect.sync(() =>
|
|
338
338
|
Option
|
|
339
339
|
.fromNullable(Request.Path)
|
|
340
340
|
.map((s) => s)
|
|
@@ -343,7 +343,7 @@ export function makeRequestParsers<
|
|
|
343
343
|
)
|
|
344
344
|
const parsePath = (u: unknown) => pp.flatMapOpt((d) => d(u))
|
|
345
345
|
|
|
346
|
-
const pc = Effect(
|
|
346
|
+
const pc = Effect.sync(() =>
|
|
347
347
|
Option
|
|
348
348
|
.fromNullable(Request.Cookie)
|
|
349
349
|
.map((s) => s)
|
|
@@ -99,33 +99,33 @@ export function makeFromSchema<ResA>(
|
|
|
99
99
|
const Res = r ? MO.extractSchema(r) : MO.Void
|
|
100
100
|
// TODO EffectOption.fromNullable(Req.Headers).flatMapOpt(jsonSchema)
|
|
101
101
|
// TODO: use the path vs body etc serialisation also in the Client.
|
|
102
|
-
const makeReqQuerySchema = Effect(Option.fromNullable(Req.Query)).flatMap((_) =>
|
|
102
|
+
const makeReqQuerySchema = Effect.sync(() => Option.fromNullable(Req.Query)).flatMap((_) =>
|
|
103
103
|
_.match({
|
|
104
|
-
onNone: () => Effect(Option.none),
|
|
104
|
+
onNone: () => Effect.sync(() => Option.none()),
|
|
105
105
|
onSome: (_) => jsonSchema(_).map(Option.some)
|
|
106
106
|
})
|
|
107
107
|
)
|
|
108
|
-
const makeReqHeadersSchema = Effect(Option.fromNullable(Req.Headers)).flatMap((_) =>
|
|
108
|
+
const makeReqHeadersSchema = Effect.sync(() => Option.fromNullable(Req.Headers)).flatMap((_) =>
|
|
109
109
|
_.match({
|
|
110
|
-
onNone: () => Effect(Option.none),
|
|
110
|
+
onNone: () => Effect.sync(() => Option.none()),
|
|
111
111
|
onSome: (_) => jsonSchema(_).map(Option.some)
|
|
112
112
|
})
|
|
113
113
|
)
|
|
114
|
-
const makeReqCookieSchema = Effect(Option.fromNullable(Req.Cookie)).flatMap((_) =>
|
|
114
|
+
const makeReqCookieSchema = Effect.sync(() => Option.fromNullable(Req.Cookie)).flatMap((_) =>
|
|
115
115
|
_.match({
|
|
116
|
-
onNone: () => Effect(Option.none),
|
|
116
|
+
onNone: () => Effect.sync(() => Option.none()),
|
|
117
117
|
onSome: (_) => jsonSchema(_).map(Option.some)
|
|
118
118
|
})
|
|
119
119
|
)
|
|
120
|
-
const makeReqPathSchema = Effect(Option.fromNullable(Req.Path)).flatMap((_) =>
|
|
120
|
+
const makeReqPathSchema = Effect.sync(() => Option.fromNullable(Req.Path)).flatMap((_) =>
|
|
121
121
|
_.match({
|
|
122
|
-
onNone: () => Effect(Option.none),
|
|
122
|
+
onNone: () => Effect.sync(() => Option.none()),
|
|
123
123
|
onSome: (_) => jsonSchema(_).map(Option.some)
|
|
124
124
|
})
|
|
125
125
|
)
|
|
126
|
-
const makeReqBodySchema = Effect(Option.fromNullable(Req.Body)).flatMap((_) =>
|
|
126
|
+
const makeReqBodySchema = Effect.sync(() => Option.fromNullable(Req.Body)).flatMap((_) =>
|
|
127
127
|
_.match({
|
|
128
|
-
onNone: () => Effect(Option.none),
|
|
128
|
+
onNone: () => Effect.sync(() => Option.none()),
|
|
129
129
|
onSome: (_) => jsonSchema(_).map(Option.some)
|
|
130
130
|
})
|
|
131
131
|
)
|
|
@@ -136,7 +136,7 @@ export function makeFromSchema<ResA>(
|
|
|
136
136
|
function makeParameters(inn: ParameterLocation) {
|
|
137
137
|
return (a: Option<JSONSchema | SubSchema>) => {
|
|
138
138
|
return a
|
|
139
|
-
.flatMap((o) => (isObjectSchema(o) ? Option(o) : Option.none))
|
|
139
|
+
.flatMap((o) => (isObjectSchema(o) ? Option.some(o) : Option.none()))
|
|
140
140
|
.map((x) => {
|
|
141
141
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
142
142
|
return Object.keys(x.properties!).map((p) => {
|
package/_src/api/routing.ts
CHANGED
|
@@ -47,7 +47,7 @@ export function makeRequestParsers<
|
|
|
47
47
|
Errors
|
|
48
48
|
>["Request"]
|
|
49
49
|
): RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA> {
|
|
50
|
-
const ph = Effect(
|
|
50
|
+
const ph = Effect.sync(() =>
|
|
51
51
|
Option
|
|
52
52
|
.fromNullable(Request.Headers)
|
|
53
53
|
.map((s) => s)
|
|
@@ -56,7 +56,7 @@ export function makeRequestParsers<
|
|
|
56
56
|
)
|
|
57
57
|
const parseHeaders = (u: unknown) => ph.flatMapOpt((d) => d(u))
|
|
58
58
|
|
|
59
|
-
const pq = Effect(
|
|
59
|
+
const pq = Effect.sync(() =>
|
|
60
60
|
Option
|
|
61
61
|
.fromNullable(Request.Query)
|
|
62
62
|
.map((s) => s)
|
|
@@ -65,7 +65,7 @@ export function makeRequestParsers<
|
|
|
65
65
|
)
|
|
66
66
|
const parseQuery = (u: unknown) => pq.flatMapOpt((d) => d(u))
|
|
67
67
|
|
|
68
|
-
const pb = Effect(
|
|
68
|
+
const pb = Effect.sync(() =>
|
|
69
69
|
Option
|
|
70
70
|
.fromNullable(Request.Body)
|
|
71
71
|
.map((s) => s)
|
|
@@ -74,7 +74,7 @@ export function makeRequestParsers<
|
|
|
74
74
|
)
|
|
75
75
|
const parseBody = (u: unknown) => pb.flatMapOpt((d) => d(u))
|
|
76
76
|
|
|
77
|
-
const pp = Effect(
|
|
77
|
+
const pp = Effect.sync(() =>
|
|
78
78
|
Option
|
|
79
79
|
.fromNullable(Request.Path)
|
|
80
80
|
.map((s) => s)
|
|
@@ -83,7 +83,7 @@ export function makeRequestParsers<
|
|
|
83
83
|
)
|
|
84
84
|
const parsePath = (u: unknown) => pp.flatMapOpt((d) => d(u))
|
|
85
85
|
|
|
86
|
-
const pc = Effect(
|
|
86
|
+
const pc = Effect.sync(() =>
|
|
87
87
|
Option
|
|
88
88
|
.fromNullable(Request.Cookie)
|
|
89
89
|
.map((s) => s)
|
|
@@ -185,7 +185,7 @@ export function match<
|
|
|
185
185
|
)
|
|
186
186
|
)
|
|
187
187
|
.zipRight(
|
|
188
|
-
Effect(
|
|
188
|
+
Effect.sync(() =>
|
|
189
189
|
makeRouteDescriptor(
|
|
190
190
|
requestHandler.Request.path,
|
|
191
191
|
requestHandler.Request.method,
|
|
@@ -199,7 +199,8 @@ export function respondSuccess<ReqA, A, E>(
|
|
|
199
199
|
encodeResponse: (req: ReqA) => Encode<A, E>
|
|
200
200
|
) {
|
|
201
201
|
return (req: ReqA, res: express.Response, a: A) =>
|
|
202
|
-
Effect
|
|
202
|
+
Effect
|
|
203
|
+
.sync(() => encodeResponse(req)(a))
|
|
203
204
|
.flatMap((r) =>
|
|
204
205
|
Effect.sync(() => {
|
|
205
206
|
r === undefined
|
|
@@ -258,13 +259,13 @@ export function makeRequestHandler<
|
|
|
258
259
|
const respond = respondSuccess(encodeResponse)
|
|
259
260
|
|
|
260
261
|
function getParams(req: express.Request) {
|
|
261
|
-
return Effect({
|
|
262
|
+
return Effect.sync(() => ({
|
|
262
263
|
path: req.params,
|
|
263
264
|
query: req.query,
|
|
264
265
|
body: req.body,
|
|
265
266
|
headers: req.headers,
|
|
266
267
|
cookies: req.cookies
|
|
267
|
-
})
|
|
268
|
+
}))
|
|
268
269
|
}
|
|
269
270
|
|
|
270
271
|
function makeContext(req: express.Request) {
|
|
@@ -380,8 +381,8 @@ export function makeRequestHandler<
|
|
|
380
381
|
Effect
|
|
381
382
|
.all(
|
|
382
383
|
[
|
|
383
|
-
Effect(res.status(500).send()),
|
|
384
|
-
Effect(
|
|
384
|
+
Effect.sync(() => res.status(500).send()),
|
|
385
|
+
Effect.sync(() =>
|
|
385
386
|
reportRequestError(cause, {
|
|
386
387
|
path: req.originalUrl,
|
|
387
388
|
method: req.method
|
|
@@ -418,7 +419,7 @@ export function makeRequestHandler<
|
|
|
418
419
|
],
|
|
419
420
|
{ concurrency: "inherit" }
|
|
420
421
|
)
|
|
421
|
-
.tapErrorCause((cause) => Effect(console.error("Error occurred while reporting error", cause)))
|
|
422
|
+
.tapErrorCause((cause) => Effect.sync(() => console.error("Error occurred while reporting error", cause)))
|
|
422
423
|
)
|
|
423
424
|
.tap(() =>
|
|
424
425
|
RequestSettings
|
|
@@ -618,7 +619,7 @@ export interface ReqHandler<
|
|
|
618
619
|
* class SayHelloResponse extends Model<SayHelloRequest>()({ message: prop(LongString) }) {}
|
|
619
620
|
*
|
|
620
621
|
* export const SayHelloControllers = matchResource({ SayHello: { SayHelloRequest, SayHelloResponse } })({
|
|
621
|
-
* SayHello: (req) => Effect({ message: `Hi ${req.name}` })
|
|
622
|
+
* SayHello: (req) => Effect.sync(() => { message: `Hi ${req.name}` })
|
|
622
623
|
* })
|
|
623
624
|
* ```
|
|
624
625
|
*/
|
package/_src/errorReporter.ts
CHANGED
|
@@ -8,7 +8,7 @@ const reportAppError = reportError((cause) => new RequestException(cause))
|
|
|
8
8
|
|
|
9
9
|
const make = Effect.sync((): Operations => {
|
|
10
10
|
const ops = new Map<OperationId, Operation>()
|
|
11
|
-
const makeOp = Effect(OperationId.make())
|
|
11
|
+
const makeOp = Effect.sync(() => OperationId.make())
|
|
12
12
|
|
|
13
13
|
const cleanup = Effect.sync(() => {
|
|
14
14
|
const before = new Date().subHours(1)
|
|
@@ -29,7 +29,7 @@ const make = Effect.sync((): Operations => {
|
|
|
29
29
|
})
|
|
30
30
|
}
|
|
31
31
|
function findOp(id: OperationId) {
|
|
32
|
-
return Effect(Option.fromNullable(ops.get(id)))
|
|
32
|
+
return Effect.sync(() => Option.fromNullable(ops.get(id)))
|
|
33
33
|
}
|
|
34
34
|
function finishOp(id: OperationId, exit: Exit<unknown, unknown>) {
|
|
35
35
|
return findOp(id).flatMap((_) =>
|
|
@@ -52,8 +52,8 @@ const make = Effect.sync((): Operations => {
|
|
|
52
52
|
.failureOption
|
|
53
53
|
.flatMap((_) =>
|
|
54
54
|
typeof _ === "object" && _ !== null && "message" in _ && LongString.Guard(_.message)
|
|
55
|
-
? Option(_.message)
|
|
56
|
-
: Option.none
|
|
55
|
+
? Option.some(_.message)
|
|
56
|
+
: Option.none()
|
|
57
57
|
)
|
|
58
58
|
.value ?? null
|
|
59
59
|
})
|
|
@@ -75,7 +75,7 @@ const make = Effect.sync((): Operations => {
|
|
|
75
75
|
cleanup,
|
|
76
76
|
register: makeOp
|
|
77
77
|
.tap((id) =>
|
|
78
|
-
|
|
78
|
+
EffectX.annotateLogscoped("operationId", id)
|
|
79
79
|
> addOp(id).acquireRelease(
|
|
80
80
|
(_, exit) => finishOp(id, exit)
|
|
81
81
|
)
|
|
@@ -42,7 +42,7 @@ export function reportNonInterruptedFailure(context?: Record<string, unknown>) {
|
|
|
42
42
|
.exit
|
|
43
43
|
.flatMap((result) =>
|
|
44
44
|
result.match(
|
|
45
|
-
{ onFailure: (cause) => report(cause).map(() => result), onSuccess: () => Effect(result) }
|
|
45
|
+
{ onFailure: (cause) => report(cause).map(() => result), onSuccess: () => Effect.sync(() => result) }
|
|
46
46
|
)
|
|
47
47
|
)
|
|
48
48
|
}
|
|
@@ -43,7 +43,7 @@ export function makeMemQueue<
|
|
|
43
43
|
messages
|
|
44
44
|
.forEachEffect((m) =>
|
|
45
45
|
// we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
46
|
-
Effect(
|
|
46
|
+
Effect.sync(() =>
|
|
47
47
|
JSON.stringify(
|
|
48
48
|
encoder({ body: m, meta: requestContext })
|
|
49
49
|
)
|
|
@@ -60,7 +60,7 @@ export function makeMemQueue<
|
|
|
60
60
|
const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
|
|
61
61
|
const processMessage = (msg: string) =>
|
|
62
62
|
// we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
63
|
-
Effect(JSON.parse(msg))
|
|
63
|
+
Effect.sync(() => JSON.parse(msg))
|
|
64
64
|
.flatMap(parseDrain)
|
|
65
65
|
.orDie
|
|
66
66
|
.flatMap(({ body, meta }) =>
|
|
@@ -81,7 +81,7 @@ export function makeServiceBusQueue<
|
|
|
81
81
|
return yield* $(
|
|
82
82
|
subscribe({
|
|
83
83
|
processMessage: (x) => processMessage(x.body).uninterruptible,
|
|
84
|
-
processError: (err) => Effect(captureException(err.error))
|
|
84
|
+
processError: (err) => Effect.sync(() => captureException(err.error))
|
|
85
85
|
})
|
|
86
86
|
.provide(receiverLayer)
|
|
87
87
|
)
|
|
@@ -155,7 +155,7 @@ export function project<
|
|
|
155
155
|
self: Repository<T, PM, Evt, ItemType>,
|
|
156
156
|
map: { filter?: Filter<PM>; collect?: (t: PM) => Option<S>; limit?: number; skip?: number }
|
|
157
157
|
) {
|
|
158
|
-
return self.projectEffect(Effect(map))
|
|
158
|
+
return self.projectEffect(Effect.sync(() => map))
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
/**
|
|
@@ -235,7 +235,7 @@ export function query<
|
|
|
235
235
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
236
236
|
map: { filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }
|
|
237
237
|
) {
|
|
238
|
-
return self.queryEffect(Effect(map))
|
|
238
|
+
return self.queryEffect(Effect.sync(() => map))
|
|
239
239
|
}
|
|
240
240
|
|
|
241
241
|
/**
|
|
@@ -252,7 +252,7 @@ export function queryOne<
|
|
|
252
252
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
253
253
|
map: { filter?: Filter<PM>; collect?: (t: T) => Option<S> }
|
|
254
254
|
) {
|
|
255
|
-
return self.queryOneEffect(Effect(map))
|
|
255
|
+
return self.queryOneEffect(Effect.sync(() => map))
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
/**
|
|
@@ -290,7 +290,7 @@ export function queryAndSavePure<
|
|
|
290
290
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
291
291
|
map: { filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }
|
|
292
292
|
) {
|
|
293
|
-
return self.queryAndSavePureEffect(Effect(map))
|
|
293
|
+
return self.queryAndSavePureEffect(Effect.sync(() => map))
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
/**
|
|
@@ -443,7 +443,7 @@ export function queryAndSavePureBatched<
|
|
|
443
443
|
map: { filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number },
|
|
444
444
|
batchSize = 100
|
|
445
445
|
) {
|
|
446
|
-
return self.queryAndSavePureEffectBatched(Effect(map), batchSize)
|
|
446
|
+
return self.queryAndSavePureEffectBatched(Effect.sync(() => map), batchSize)
|
|
447
447
|
}
|
|
448
448
|
|
|
449
449
|
/**
|
|
@@ -536,7 +536,7 @@ export interface OneDSLExt<T, Evt> {
|
|
|
536
536
|
* @tsplus fluent DSLExt updateWith
|
|
537
537
|
*/
|
|
538
538
|
export function updateWithOne<T, Evt, S1 extends T, S2 extends T>(self: OneDSL<T, Evt>, upd: (item: S1) => S2) {
|
|
539
|
-
return self.update((_: S1) => Effect(upd(_)))
|
|
539
|
+
return self.update((_: S1) => Effect.sync(() => upd(_)))
|
|
540
540
|
}
|
|
541
541
|
|
|
542
542
|
/**
|
|
@@ -546,7 +546,7 @@ export function updateWith<T, Evt, S1 extends T, S2 extends T>(
|
|
|
546
546
|
self: AllDSL<T, Evt>,
|
|
547
547
|
upd: (item: S1[]) => S2[]
|
|
548
548
|
) {
|
|
549
|
-
return self.update((_: S1[]) => Effect(upd(_)))
|
|
549
|
+
return self.update((_: S1[]) => Effect.sync(() => upd(_)))
|
|
550
550
|
}
|
|
551
551
|
|
|
552
552
|
export function makeOneDSL<T, Evt>(): OneDSL<T, Evt> {
|
|
@@ -603,14 +603,14 @@ export function makeDSL<S1, S2, Evt>() {
|
|
|
603
603
|
export interface DSLExt<S1, S2, Evt> extends ReturnType<typeof makeDSL<S1, S2, Evt>> {}
|
|
604
604
|
|
|
605
605
|
export function ifAny<T, R, E, A>(fn: (items: NonEmptyReadonlyArray<T>) => Effect<R, E, A>) {
|
|
606
|
-
return (items: Iterable<T>) => Effect(items.toNonEmptyArray).flatMapOpt(fn)
|
|
606
|
+
return (items: Iterable<T>) => Effect.sync(() => items.toNonEmptyArray).flatMapOpt(fn)
|
|
607
607
|
}
|
|
608
608
|
|
|
609
609
|
/**
|
|
610
610
|
* @tsplus fluent Iterable ifAny
|
|
611
611
|
*/
|
|
612
612
|
export function ifAny_<T, R, E, A>(items: Iterable<T>, fn: (items: NonEmptyReadonlyArray<T>) => Effect<R, E, A>) {
|
|
613
|
-
return Effect(items.toNonEmptyArray).flatMapOpt(fn)
|
|
613
|
+
return Effect.sync(() => items.toNonEmptyArray).flatMapOpt(fn)
|
|
614
614
|
}
|
|
615
615
|
|
|
616
616
|
/**
|
|
@@ -5,10 +5,9 @@ import { ContextMap, StoreMaker } from "./Store.js"
|
|
|
5
5
|
import type { Filter, StoreConfig, Where } from "./Store.js"
|
|
6
6
|
import type {} from "effect/Equal"
|
|
7
7
|
import type {} from "effect/Hash"
|
|
8
|
-
import type { Opt } from "@effect-app/core/Option"
|
|
9
8
|
import { makeCodec } from "@effect-app/infra/api/codec"
|
|
10
9
|
import { makeFilters } from "@effect-app/infra/filter"
|
|
11
|
-
import type { Schema } from "@effect-app/prelude"
|
|
10
|
+
import type { Option, Schema } from "@effect-app/prelude"
|
|
12
11
|
import { EParserFor } from "@effect-app/prelude/schema"
|
|
13
12
|
import type { InvalidStateError, OptimisticConcurrencyException } from "../errors.js"
|
|
14
13
|
|
|
@@ -21,7 +20,7 @@ export const RepositoryBase = <Service>() => {
|
|
|
21
20
|
) => {
|
|
22
21
|
abstract class RepositoryBaseC implements Repository<T, PM, Evt, ItemType> {
|
|
23
22
|
itemType: ItemType = itemType
|
|
24
|
-
abstract find: (id: T["id"]) => Effect<ContextMap | RequestContextContainer, never,
|
|
23
|
+
abstract find: (id: T["id"]) => Effect<ContextMap | RequestContextContainer, never, Option<T>>
|
|
25
24
|
abstract all: Effect<ContextMap, never, T[]>
|
|
26
25
|
abstract saveAndPublish: (
|
|
27
26
|
items: Iterable<T>,
|
|
@@ -130,7 +129,8 @@ export function makeRepo<
|
|
|
130
129
|
}
|
|
131
130
|
|
|
132
131
|
const saveAllE = (a: Iterable<E>) =>
|
|
133
|
-
Effect
|
|
132
|
+
Effect
|
|
133
|
+
.sync(() => a.toNonEmptyArray)
|
|
134
134
|
.flatMapOpt((a) =>
|
|
135
135
|
Do(($) => {
|
|
136
136
|
const { get, set } = $(ContextMap)
|
|
@@ -145,7 +145,8 @@ export function makeRepo<
|
|
|
145
145
|
|
|
146
146
|
const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) =>
|
|
147
147
|
saveAll(items)
|
|
148
|
-
> Effect
|
|
148
|
+
> Effect
|
|
149
|
+
.sync(() => events.toNonEmptyArray)
|
|
149
150
|
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
150
151
|
.flatMapOpt(publishEvents)
|
|
151
152
|
|
|
@@ -159,7 +160,8 @@ export function makeRepo<
|
|
|
159
160
|
set(e.id, undefined)
|
|
160
161
|
}
|
|
161
162
|
yield* $(
|
|
162
|
-
Effect
|
|
163
|
+
Effect
|
|
164
|
+
.sync(() => events.toNonEmptyArray)
|
|
163
165
|
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
164
166
|
.flatMapOpt(publishEvents)
|
|
165
167
|
)
|
|
@@ -15,7 +15,7 @@ export abstract class RequestContextContainer extends TagClass<RequestContextCon
|
|
|
15
15
|
.flatMap((requestContext) =>
|
|
16
16
|
requestContext.isSome()
|
|
17
17
|
? requestContext.value.requestContext.map(Option.some)
|
|
18
|
-
: Effect(Option.none)
|
|
18
|
+
: Effect.sync(() => Option.none())
|
|
19
19
|
)
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -84,7 +84,7 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
84
84
|
([i, batch]) =>
|
|
85
85
|
Effect
|
|
86
86
|
.promise(() => bulk(batch.map(([, op]) => op)))
|
|
87
|
-
.delay(Duration.
|
|
87
|
+
.delay(Duration.millis(i === 0 ? 0 : 1100))
|
|
88
88
|
.flatMap((responses) =>
|
|
89
89
|
Effect.gen(function*($) {
|
|
90
90
|
const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404)
|
|
@@ -188,10 +188,11 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
const s: Store<PM, Id> = {
|
|
191
|
-
all: Effect
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
191
|
+
all: Effect
|
|
192
|
+
.sync(() => ({
|
|
193
|
+
query: `SELECT * FROM ${name} f WHERE f.id != @id`,
|
|
194
|
+
parameters: [{ name: "@id", value: importedMarkerId }]
|
|
195
|
+
}))
|
|
195
196
|
.tap((q) => logQuery(q))
|
|
196
197
|
.flatMap((q) =>
|
|
197
198
|
Effect.promise(() =>
|
|
@@ -211,7 +212,8 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
211
212
|
filter
|
|
212
213
|
.keys
|
|
213
214
|
.forEachEffect((k) =>
|
|
214
|
-
Effect
|
|
215
|
+
Effect
|
|
216
|
+
.sync(() => buildFilterJoinSelectCosmosQuery(filter, k, name, cursor?.skip, cursor?.limit))
|
|
215
217
|
.tap((q) => logQuery(q))
|
|
216
218
|
.flatMap((q) =>
|
|
217
219
|
Effect.promise(() =>
|
|
@@ -249,7 +251,8 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
249
251
|
? filter
|
|
250
252
|
.keys
|
|
251
253
|
.forEachEffect((k) =>
|
|
252
|
-
Effect
|
|
254
|
+
Effect
|
|
255
|
+
.sync(() => buildFindJoinCosmosQuery(filter, k, name, skip, limit))
|
|
253
256
|
.tap((q) => logQuery(q))
|
|
254
257
|
.flatMap((q) =>
|
|
255
258
|
Effect.promise(() =>
|
|
@@ -262,7 +265,8 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
262
265
|
)
|
|
263
266
|
)
|
|
264
267
|
.map((_) => _.flatMap((_) => _))
|
|
265
|
-
: Effect
|
|
268
|
+
: Effect
|
|
269
|
+
.sync(() => buildCosmosQuery(filter, name, importedMarkerId, skip, limit))
|
|
266
270
|
.tap((q) => logQuery(q))
|
|
267
271
|
.flatMap((q) =>
|
|
268
272
|
Effect.promise(() =>
|
|
@@ -325,10 +329,10 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
325
329
|
)
|
|
326
330
|
)
|
|
327
331
|
}
|
|
328
|
-
return Effect({
|
|
332
|
+
return Effect.sync(() => ({
|
|
329
333
|
...e,
|
|
330
334
|
_etag: x.etag
|
|
331
|
-
})
|
|
335
|
+
}))
|
|
332
336
|
})
|
|
333
337
|
.instrument("cosmos.set")
|
|
334
338
|
.annotateLogs("cosmos.db", containerId),
|
|
@@ -356,13 +360,14 @@ export function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
356
360
|
if (seed) {
|
|
357
361
|
const m = yield* $(seed)
|
|
358
362
|
yield* $(
|
|
359
|
-
Effect
|
|
363
|
+
Effect
|
|
364
|
+
.sync(() => m.toNonEmptyArray)
|
|
360
365
|
.flatMapOpt((a) =>
|
|
361
366
|
s
|
|
362
367
|
.bulkSet(a)
|
|
363
368
|
.orDie
|
|
364
369
|
// we delay extra here, so that initial creation between Companies/POs also have an interval between them.
|
|
365
|
-
.delay(Duration.
|
|
370
|
+
.delay(Duration.millis(1100))
|
|
366
371
|
)
|
|
367
372
|
)
|
|
368
373
|
}
|
|
@@ -39,7 +39,7 @@ function makeDiskStoreInt<Id extends string, PM extends PersistenceModelType<Id>
|
|
|
39
39
|
const withPermit = sem.withPermits(1)
|
|
40
40
|
const flushToDisk = store.all.flatMap(fsStore.setRaw).apply(withPermit)
|
|
41
41
|
const flushToDiskInBackground = flushToDisk
|
|
42
|
-
.tapErrorCause((err) => Effect(console.error(err)))
|
|
42
|
+
.tapErrorCause((err) => Effect.sync(() => console.error(err)))
|
|
43
43
|
.uninterruptible
|
|
44
44
|
.forkDaemon
|
|
45
45
|
|
|
@@ -84,10 +84,10 @@ export function makeDiskStore({ prefix }: StorageConfig, dir: string) {
|
|
|
84
84
|
const storesSem = Semaphore.unsafeMake(1)
|
|
85
85
|
const primary = yield* $(makeDiskStoreInt(prefix, "primary", dir, name, seed))
|
|
86
86
|
const stores = new Map<string, Store<PM, Id>>([["primary", primary]])
|
|
87
|
-
const getStore = !config?.allowNamespace ? Effect.
|
|
87
|
+
const getStore = !config?.allowNamespace ? Effect.sync(() => primary) : storeId.get.flatMap((namespace) => {
|
|
88
88
|
const store = stores.get(namespace)
|
|
89
89
|
if (store) {
|
|
90
|
-
return Effect.
|
|
90
|
+
return Effect.sync(() => store)
|
|
91
91
|
}
|
|
92
92
|
if (!config.allowNamespace!(namespace)) {
|
|
93
93
|
throw new Error(`Namespace ${namespace} not allowed!`)
|
|
@@ -95,7 +95,7 @@ export function makeDiskStore({ prefix }: StorageConfig, dir: string) {
|
|
|
95
95
|
return storesSem.withPermits(1)(
|
|
96
96
|
Effect.suspend(() => {
|
|
97
97
|
const existing = stores.get(namespace)
|
|
98
|
-
if (existing) return Effect(existing)
|
|
98
|
+
if (existing) return Effect.sync(() => existing)
|
|
99
99
|
return makeDiskStoreInt<Id, PM>(prefix, namespace, dir, name, seed).tap((store) =>
|
|
100
100
|
Effect.sync(() => stores.set(namespace, store))
|
|
101
101
|
)
|
|
@@ -47,7 +47,7 @@ export function makeMemoryStoreInt<Id extends string, PM extends PersistenceMode
|
|
|
47
47
|
) {
|
|
48
48
|
return Effect.gen(function*($) {
|
|
49
49
|
const updateETag = makeUpdateETag(name)
|
|
50
|
-
const items_ = yield* $(seed ?? Effect([]))
|
|
50
|
+
const items_ = yield* $(seed ?? Effect.sync(() => []))
|
|
51
51
|
const items = new Map(items_.toChunk.map((_) => [_.id, _] as const))
|
|
52
52
|
const makeStore = (): ReadonlyMap<Id, PM> => new Map([...items.entries()].map(([id, e]) => [id, makeETag(e)]))
|
|
53
53
|
const store = Ref.unsafeMake(makeStore())
|
|
@@ -108,17 +108,17 @@ export const makeMemoryStore = () => ({
|
|
|
108
108
|
const storesSem = Semaphore.unsafeMake(1)
|
|
109
109
|
const primary = yield* $(makeMemoryStoreInt<Id, PM>(name, seed))
|
|
110
110
|
const stores = new Map([["primary", primary]])
|
|
111
|
-
const getStore = !config?.allowNamespace ? Effect.
|
|
111
|
+
const getStore = !config?.allowNamespace ? Effect.sync(() => primary) : storeId.get.flatMap((namespace) => {
|
|
112
112
|
const store = stores.get(namespace)
|
|
113
113
|
if (store) {
|
|
114
|
-
return Effect.
|
|
114
|
+
return Effect.sync(() => store)
|
|
115
115
|
}
|
|
116
116
|
if (!config.allowNamespace!(namespace)) {
|
|
117
117
|
throw new Error(`Namespace ${namespace} not allowed!`)
|
|
118
118
|
}
|
|
119
119
|
return storesSem.withPermits(1)(Effect.suspend(() => {
|
|
120
120
|
const store = stores.get(namespace)
|
|
121
|
-
if (store) return Effect(store)
|
|
121
|
+
if (store) return Effect.sync(() => store)
|
|
122
122
|
return makeMemoryStoreInt(name, seed).tap((store) => Effect.sync(() => stores.set(namespace, store)))
|
|
123
123
|
}))
|
|
124
124
|
})
|
|
@@ -22,7 +22,7 @@ export function makeRedisStore({ prefix }: StorageConfig) {
|
|
|
22
22
|
const key = `${prefix}${name}`
|
|
23
23
|
const current = yield* $(redis.get(key).orDie.provideService(RedisClient, redis))
|
|
24
24
|
if (!current.isSome()) {
|
|
25
|
-
const m = yield* $(seed ?? Effect([]))
|
|
25
|
+
const m = yield* $(seed ?? Effect.sync(() => []))
|
|
26
26
|
yield* $(
|
|
27
27
|
redis
|
|
28
28
|
.set(key, JSON.stringify({ data: [...m].map((e) => makeETag(e)) }))
|