@effect-app/infra 4.0.0-beta.7 → 4.0.0-beta.70
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 +447 -0
- package/dist/CUPS.d.ts +3 -3
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +3 -3
- package/dist/Emailer/Sendgrid.js +1 -1
- package/dist/Emailer/service.d.ts +3 -3
- package/dist/Emailer/service.d.ts.map +1 -1
- package/dist/Emailer/service.js +3 -3
- package/dist/MainFiberSet.d.ts +2 -2
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +3 -3
- package/dist/Model/Repository/internal/internal.d.ts +3 -3
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +11 -7
- package/dist/Model/Repository/makeRepo.d.ts +2 -2
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.js +1 -1
- package/dist/Model/query/dsl.d.ts +9 -9
- package/dist/Operations.d.ts +2 -2
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Operations.js +3 -3
- package/dist/OperationsRepo.d.ts +2 -2
- package/dist/OperationsRepo.d.ts.map +1 -1
- package/dist/OperationsRepo.js +3 -3
- package/dist/QueueMaker/SQLQueue.d.ts +3 -5
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/QueueMaker/SQLQueue.js +9 -7
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +10 -9
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +11 -9
- package/dist/RequestContext.d.ts +5 -5
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +4 -4
- package/dist/RequestFiberSet.d.ts +2 -2
- package/dist/RequestFiberSet.d.ts.map +1 -1
- package/dist/RequestFiberSet.js +5 -5
- package/dist/Store/ContextMapContainer.d.ts +3 -3
- package/dist/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/Store/ContextMapContainer.js +3 -3
- package/dist/Store/Cosmos.js +1 -1
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +3 -4
- package/dist/Store/Memory.d.ts +2 -2
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +4 -4
- package/dist/Store/service.d.ts +3 -3
- package/dist/Store/service.d.ts.map +1 -1
- package/dist/Store/service.js +4 -4
- package/dist/adapters/SQL/Model.d.ts +2 -5
- package/dist/adapters/SQL/Model.d.ts.map +1 -1
- package/dist/adapters/SQL/Model.js +21 -13
- package/dist/adapters/ServiceBus.d.ts +6 -6
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +9 -9
- package/dist/adapters/cosmos-client.d.ts +2 -2
- package/dist/adapters/cosmos-client.d.ts.map +1 -1
- package/dist/adapters/cosmos-client.js +3 -3
- package/dist/adapters/logger.d.ts.map +1 -1
- package/dist/adapters/memQueue.d.ts +2 -2
- package/dist/adapters/memQueue.d.ts.map +1 -1
- package/dist/adapters/memQueue.js +3 -3
- package/dist/adapters/mongo-client.d.ts +2 -2
- package/dist/adapters/mongo-client.d.ts.map +1 -1
- package/dist/adapters/mongo-client.js +3 -3
- package/dist/adapters/redis-client.d.ts +3 -3
- package/dist/adapters/redis-client.d.ts.map +1 -1
- package/dist/adapters/redis-client.js +3 -3
- package/dist/api/ContextProvider.d.ts +6 -6
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +6 -6
- package/dist/api/internal/auth.d.ts +1 -1
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/internal/events.js +7 -5
- package/dist/api/layerUtils.d.ts +5 -5
- package/dist/api/layerUtils.d.ts.map +1 -1
- package/dist/api/layerUtils.js +5 -5
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +3 -3
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/schema/jwt.d.ts +1 -1
- package/dist/api/routing/schema/jwt.d.ts.map +1 -1
- package/dist/api/routing/schema/jwt.js +1 -1
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +1 -1
- package/dist/errorReporter.d.ts +1 -1
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +1 -1
- package/dist/fileUtil.js +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/rateLimit.js +1 -1
- package/examples/query.ts +28 -24
- package/package.json +16 -16
- package/src/CUPS.ts +2 -2
- package/src/Emailer/Sendgrid.ts +1 -1
- package/src/Emailer/service.ts +2 -2
- package/src/MainFiberSet.ts +2 -2
- package/src/Model/Repository/internal/internal.ts +11 -8
- package/src/Model/Repository/makeRepo.ts +2 -2
- package/src/Operations.ts +2 -2
- package/src/OperationsRepo.ts +2 -2
- package/src/QueueMaker/SQLQueue.ts +10 -10
- package/src/QueueMaker/memQueue.ts +41 -42
- package/src/QueueMaker/sbqueue.ts +65 -62
- package/src/RequestContext.ts +3 -3
- package/src/RequestFiberSet.ts +4 -4
- package/src/Store/ContextMapContainer.ts +2 -2
- package/src/Store/Cosmos.ts +10 -10
- package/src/Store/Disk.ts +2 -3
- package/src/Store/Memory.ts +4 -6
- package/src/Store/service.ts +3 -3
- package/src/adapters/SQL/Model.ts +76 -71
- package/src/adapters/ServiceBus.ts +8 -8
- package/src/adapters/cosmos-client.ts +2 -2
- package/src/adapters/memQueue.ts +2 -2
- package/src/adapters/mongo-client.ts +2 -2
- package/src/adapters/redis-client.ts +2 -2
- package/src/api/ContextProvider.ts +11 -11
- package/src/api/internal/events.ts +5 -4
- package/src/api/layerUtils.ts +8 -8
- package/src/api/routing/middleware/RouterMiddleware.ts +4 -4
- package/src/api/routing/schema/jwt.ts +2 -3
- package/src/api/routing.ts +4 -3
- package/src/errorReporter.ts +1 -1
- package/src/fileUtil.ts +1 -1
- package/src/rateLimit.ts +2 -2
- package/test/contextProvider.test.ts +5 -5
- package/test/controller.test.ts +9 -7
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +16 -7
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +11 -9
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/fixtures.ts +10 -8
- package/test/query.test.ts +156 -10
- package/test/rawQuery.test.ts +19 -17
- package/test/requires.test.ts +6 -5
- package/test/rpc-multi-middleware.test.ts +73 -4
- package/tsconfig.json +0 -1
package/dist/fileUtil.js
CHANGED
|
@@ -73,4 +73,4 @@ export function withFileLock(filePath, action) {
|
|
|
73
73
|
})
|
|
74
74
|
.pipe(Effect.scoped);
|
|
75
75
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmlsZVV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFHbkMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQTtBQUNuQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUE7QUFHdEMsTUFBTSxVQUFVLFFBQVEsQ0FBQyxRQUFnQjtJQUN2QyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQ3ZELENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtBQUMxRSxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxRQUFnQjtJQUN2QyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNsSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsTUFBYztJQUVkLE9BQU8sQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLENB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
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW;iBACiO,GAAG;eAAkF,GAAG;eAAkF,GAAG;cAAiF,GAAG;eAAkF,GAAG;8DAA+G,GAAI;CADnoB,CAAA"}
|
package/dist/rateLimit.js
CHANGED
|
@@ -66,4 +66,4 @@ export function naiveRateLimit(n, d) {
|
|
|
66
66
|
.forEach(batch, forEachItem, { concurrency: n })
|
|
67
67
|
.pipe(Effect.flatMap(forEachBatch))))));
|
|
68
68
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZUxpbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JhdGVMaW1pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNO0FBQ04sOEVBQThFO0FBQzlFLHVFQUF1RTtBQUN2RSxtRkFBbUY7QUFDbkYsK0JBQStCO0FBQy9CLE1BQU07QUFDTiw2RUFBNkU7QUFDN0Usd0dBQXdHO0FBQ3hHLHVCQUF1QjtBQUN2QixvQ0FBb0M7QUFDcEMscUJBQXFCO0FBQ3JCLG1EQUFtRDtBQUNuRCxnQ0FBZ0M7QUFDaEMsMkJBQTJCO0FBQzNCLHlDQUF5QztBQUN6Qyw0QkFBNEI7QUFDNUIscUNBQXFDO0FBQ3JDLGtCQUFrQjtBQUNsQixVQUFVO0FBQ1YsTUFBTTtBQUNOLElBQUk7QUFFSixPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLEVBQXNCLE1BQU0sWUFBWSxDQUFBO0FBRzdFOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQWUsRUFBRSxRQUEyQjtJQUNsRixPQUFPLENBQUMsSUFBZSxFQUF1RSxFQUFFO1FBQzlGLE9BQU8sQ0FBVSxNQUE4QixFQUFFLEVBQUUsQ0FDakQsTUFBTSxDQUFDLG1CQUFtQixDQUN4QixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ2xCLE9BQU8sQ0FBQyxNQUFNLENBQUM7YUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUM5QyxDQUFDLENBQ0wsQ0FBQyxDQUNQLENBQUE7SUFDTCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsQ0FBUyxFQUNULFdBQXNGLEVBQ3RG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
|
package/examples/query.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { expectTypeOf } from "@effect/vitest"
|
|
2
|
+
import { Effect, Layer, ManagedRuntime, S } from "effect-app"
|
|
2
3
|
import { makeRepo } from "../src/Model.js"
|
|
3
|
-
import { and, make, one, or, order, page, project, QueryWhere, where } from "../src/Model/query.js"
|
|
4
|
+
import { and, make, one, or, order, page, project, type QueryWhere, where } from "../src/Model/query.js"
|
|
4
5
|
import { MemoryStoreLive } from "../src/Store/Memory.js"
|
|
5
|
-
import { expectTypeOf } from "@effect/vitest"
|
|
6
6
|
|
|
7
7
|
const str = S.Struct({ _tag: S.Literal("string"), value: S.String })
|
|
8
|
-
const num = S.Struct({ _tag: S.Literal("number"), value: S.
|
|
8
|
+
const num = S.Struct({ _tag: S.Literal("number"), value: S.Finite })
|
|
9
9
|
const someUnion = S.Union(str, num)
|
|
10
10
|
|
|
11
11
|
export class Something extends S.TaggedClass<Something>()("Something", {
|
|
@@ -100,31 +100,35 @@ const rt = ManagedRuntime.make(SomethingRepo.Test)
|
|
|
100
100
|
rt.runFork(program)
|
|
101
101
|
|
|
102
102
|
const test1 = make<Union.Encoded>().pipe(
|
|
103
|
-
where("union._tag", "string")
|
|
103
|
+
where("union._tag", "string")
|
|
104
104
|
)
|
|
105
105
|
|
|
106
|
-
expectTypeOf(test1).toEqualTypeOf<
|
|
107
|
-
|
|
108
|
-
readonly
|
|
109
|
-
readonly
|
|
110
|
-
readonly
|
|
106
|
+
expectTypeOf(test1).toEqualTypeOf<
|
|
107
|
+
QueryWhere<Union.Encoded, {
|
|
108
|
+
readonly _tag: "Something"
|
|
109
|
+
readonly id: string
|
|
110
|
+
readonly displayName: string
|
|
111
|
+
readonly n: string
|
|
111
112
|
readonly union: {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
}
|
|
113
|
+
readonly _tag: "string"
|
|
114
|
+
readonly value: string
|
|
115
|
+
}
|
|
116
|
+
}>
|
|
117
|
+
>()
|
|
116
118
|
|
|
117
119
|
const testneq1 = make<Union.Encoded>().pipe(
|
|
118
|
-
where("union._tag", "neq", "string")
|
|
120
|
+
where("union._tag", "neq", "string")
|
|
119
121
|
)
|
|
120
122
|
|
|
121
|
-
expectTypeOf(testneq1).toEqualTypeOf<
|
|
122
|
-
|
|
123
|
-
readonly
|
|
124
|
-
readonly
|
|
125
|
-
readonly
|
|
123
|
+
expectTypeOf(testneq1).toEqualTypeOf<
|
|
124
|
+
QueryWhere<Union.Encoded, {
|
|
125
|
+
readonly _tag: "Something"
|
|
126
|
+
readonly id: string
|
|
127
|
+
readonly displayName: string
|
|
128
|
+
readonly n: string
|
|
126
129
|
readonly union: {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
}
|
|
130
|
+
readonly _tag: "number"
|
|
131
|
+
readonly value: number
|
|
132
|
+
}
|
|
133
|
+
}>
|
|
134
|
+
>()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.70",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -8,46 +8,46 @@
|
|
|
8
8
|
"change-case": "^5.4.4",
|
|
9
9
|
"cross-fetch": "^4.1.0",
|
|
10
10
|
"express-oauth2-jwt-bearer": "^1.7.4",
|
|
11
|
-
"fast-check": "~4.
|
|
11
|
+
"fast-check": "~4.6.0",
|
|
12
12
|
"path-parser": "^6.1.0",
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "7.0.1",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.70"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@azure/cosmos": "^4.9.
|
|
19
|
+
"@azure/cosmos": "^4.9.2",
|
|
20
20
|
"@azure/service-bus": "^7.9.5",
|
|
21
|
-
"@sentry/node": "10.
|
|
22
|
-
"@sentry/opentelemetry": "10.
|
|
21
|
+
"@sentry/node": "10.47.0",
|
|
22
|
+
"@sentry/opentelemetry": "10.47.0",
|
|
23
23
|
"@types/express": "^5.0.6",
|
|
24
|
-
"@types/node": "25.
|
|
24
|
+
"@types/node": "25.5.2",
|
|
25
25
|
"@types/proper-lockfile": "^4.1.4",
|
|
26
26
|
"@types/redis": "^2.8.32",
|
|
27
27
|
"@types/redlock": "^4.0.8",
|
|
28
28
|
"express": "^5.2.1",
|
|
29
29
|
"jwks-rsa": "2.1.4",
|
|
30
30
|
"jwt-decode": "^4.0.0",
|
|
31
|
-
"mongodb": "7.1.
|
|
31
|
+
"mongodb": "7.1.1",
|
|
32
32
|
"redis": "^3.1.2",
|
|
33
33
|
"redlock": "^4.2.0",
|
|
34
34
|
"strip-ansi": "^7.2.0",
|
|
35
|
-
"typescript": "~
|
|
36
|
-
"vitest": "^4.
|
|
37
|
-
"@effect-app/eslint-shared-config": "0.5.7-beta.
|
|
35
|
+
"typescript": "~6.0.2",
|
|
36
|
+
"vitest": "^4.1.3",
|
|
37
|
+
"@effect-app/eslint-shared-config": "0.5.7-beta.7"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@azure/cosmos": "^4.9.
|
|
40
|
+
"@azure/cosmos": "^4.9.2",
|
|
41
41
|
"@azure/service-bus": "^7.9.5",
|
|
42
|
-
"@effect/vitest": "^4.0.0-beta.
|
|
42
|
+
"@effect/vitest": "^4.0.0-beta.46",
|
|
43
43
|
"@sendgrid/helpers": "^8.0.0",
|
|
44
44
|
"@sendgrid/mail": "^8.1.6",
|
|
45
|
-
"@sentry/node": "10.
|
|
46
|
-
"@sentry/opentelemetry": "10.
|
|
45
|
+
"@sentry/node": "10.47.0",
|
|
46
|
+
"@sentry/opentelemetry": "10.47.0",
|
|
47
47
|
"jwt-decode": "^4.0.0",
|
|
48
48
|
"redis": "^3.1.2",
|
|
49
49
|
"redlock": "^4.2.0",
|
|
50
|
-
"effect": "^4.0.0-beta.
|
|
50
|
+
"effect": "^4.0.0-beta.46",
|
|
51
51
|
"express": "^5.2.1"
|
|
52
52
|
},
|
|
53
53
|
"typesVersions": {
|
package/src/CUPS.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type FileOptions, tempFile } from "@effect-app/infra/fileUtil"
|
|
2
2
|
import cp from "child_process"
|
|
3
|
-
import { Config, Effect, Layer, Option, Predicate, S
|
|
3
|
+
import { Config, Context, Effect, Layer, Option, Predicate, S } from "effect-app"
|
|
4
4
|
import { pretty } from "effect-app/utils"
|
|
5
5
|
import fs from "fs"
|
|
6
6
|
import os from "os"
|
|
@@ -100,7 +100,7 @@ export const CUPSConfig = Config.all({
|
|
|
100
100
|
)
|
|
101
101
|
})
|
|
102
102
|
|
|
103
|
-
export class CUPS extends
|
|
103
|
+
export class CUPS extends Context.Service<CUPS>()("effect-app/CUPS", {
|
|
104
104
|
make: Effect.gen(function*() {
|
|
105
105
|
const config = yield* CUPSConfig
|
|
106
106
|
const serverUrl = Option.getOrUndefined(config.server)
|
package/src/Emailer/Sendgrid.ts
CHANGED
|
@@ -42,7 +42,7 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
42
42
|
(err, result) =>
|
|
43
43
|
err
|
|
44
44
|
? resume(Effect.fail(err))
|
|
45
|
-
: resume(Effect.sync(() => result
|
|
45
|
+
: resume(Effect.sync(() => result))
|
|
46
46
|
)
|
|
47
47
|
)
|
|
48
48
|
.pipe(Effect.mapError((raw) => new SendMailError({ raw })))
|
package/src/Emailer/service.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
|
|
2
2
|
import type { ResponseError } from "@sendgrid/mail"
|
|
3
|
-
import { Data, type Effect, type NonEmptyReadonlyArray, type Redacted
|
|
3
|
+
import { Context, Data, type Effect, type NonEmptyReadonlyArray, type Redacted } from "effect-app"
|
|
4
4
|
import type { Email } from "effect-app/Schema"
|
|
5
5
|
|
|
6
6
|
export class SendMailError extends Data.TaggedError("SendMailError")<{
|
|
7
7
|
readonly raw: Error | ResponseError
|
|
8
8
|
}> {}
|
|
9
9
|
|
|
10
|
-
export class Emailer extends
|
|
10
|
+
export class Emailer extends Context.Opaque<Emailer, {
|
|
11
11
|
sendMail: (msg: EmailMsgOptionalFrom) => Effect.Effect<void, SendMailError>
|
|
12
12
|
}>()("effect-app/Emailer") {}
|
|
13
13
|
|
package/src/MainFiberSet.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect, Fiber, FiberSet, Layer
|
|
1
|
+
import { Context, Effect, Fiber, FiberSet, Layer } from "effect-app"
|
|
2
2
|
import type {} from "effect/Scope"
|
|
3
3
|
import { InfraLogger } from "./logger.js"
|
|
4
4
|
import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.js"
|
|
@@ -62,7 +62,7 @@ const make = Effect.gen(function*() {
|
|
|
62
62
|
* you should register these long running fibers in a FiberSet, and join them at the end of your main program.
|
|
63
63
|
* This way any errors will blow up the main program instead of fibers dying unknowingly.
|
|
64
64
|
*/
|
|
65
|
-
export class MainFiberSet extends
|
|
65
|
+
export class MainFiberSet extends Context.Service<MainFiberSet>()("MainFiberSet", { make }) {
|
|
66
66
|
static readonly Live = Layer.effect(this, this.make)
|
|
67
67
|
static readonly JoinLive = this.asEffect().pipe(
|
|
68
68
|
Effect.andThen((_) => _.join),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import type {} from "effect/Equal"
|
|
3
3
|
import type {} from "effect/Hash"
|
|
4
|
-
import { Array, Chunk, Effect, Equivalence, flow, type NonEmptyReadonlyArray, Option, pipe, Pipeable, PubSub, Result, S, SchemaAST,
|
|
4
|
+
import { Array, Chunk, Context, Effect, Equivalence, flow, type NonEmptyReadonlyArray, Option, pipe, Pipeable, PubSub, Result, S, SchemaAST, Unify } from "effect-app"
|
|
5
5
|
import { toNonEmptyArray } from "effect-app/Array"
|
|
6
6
|
import { NotFoundError } from "effect-app/client/errors"
|
|
7
7
|
import { flatMapOption } from "effect-app/Effect"
|
|
@@ -55,14 +55,14 @@ export function makeRepoInternal<
|
|
|
55
55
|
|
|
56
56
|
function make<RInitial = never, E = never, RPublish = never, RCtx = never>(
|
|
57
57
|
args: [Evt] extends [never] ? {
|
|
58
|
-
schemaContext?:
|
|
58
|
+
schemaContext?: Context.Context<RCtx>
|
|
59
59
|
makeInitial?: Effect.Effect<readonly T[], E, RInitial> | undefined
|
|
60
60
|
config?: Omit<StoreConfig<Encoded>, "partitionValue"> & {
|
|
61
61
|
partitionValue?: (e?: Encoded) => string
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
: {
|
|
65
|
-
schemaContext?:
|
|
65
|
+
schemaContext?: Context.Context<RCtx>
|
|
66
66
|
publishEvents: (evt: NonEmptyReadonlyArray<Evt>) => Effect.Effect<void, never, RPublish>
|
|
67
67
|
makeInitial?: Effect.Effect<readonly T[], E, RInitial> | undefined
|
|
68
68
|
config?: Omit<StoreConfig<Encoded>, "partitionValue"> & {
|
|
@@ -72,7 +72,7 @@ export function makeRepoInternal<
|
|
|
72
72
|
) {
|
|
73
73
|
return Effect
|
|
74
74
|
.gen(function*() {
|
|
75
|
-
const rctx:
|
|
75
|
+
const rctx: Context.Context<RCtx> = args.schemaContext ?? Context.empty() as any
|
|
76
76
|
const provideRctx = Effect.provide(rctx)
|
|
77
77
|
const encodeMany = flow(
|
|
78
78
|
S.encodeEffect(S.Array(schema)),
|
|
@@ -113,11 +113,14 @@ export function makeRepoInternal<
|
|
|
113
113
|
let ast = _.ast
|
|
114
114
|
if (ast._tag === "Declaration") ast = ast.typeParameters[0]!
|
|
115
115
|
|
|
116
|
-
// In v4, to get the encoded (from) side of a schema, use SchemaAST.toEncoded
|
|
117
116
|
const pickIdFromAst = (a: SchemaAST.AST) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
117
|
+
// Unwrap Declaration (e.g. TaggedClass) to get the underlying Objects AST
|
|
118
|
+
let inner = a
|
|
119
|
+
if (inner._tag === "Declaration") inner = inner.typeParameters[0]!
|
|
120
|
+
// Pick from the original AST to preserve the full encoding chain (e.g. decodeTo transformations).
|
|
121
|
+
// Using toEncoded would lose transformation info needed to encode Type -> Encoded.
|
|
122
|
+
if (SchemaAST.isObjects(inner)) {
|
|
123
|
+
const field = inner.propertySignatures.find((_) => _.name === idKey)
|
|
121
124
|
if (field) {
|
|
122
125
|
return S.Struct({ [idKey]: S.make(field.type) }) as unknown as Codec<T, Encoded>
|
|
123
126
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// import type { ParserEnv } from "effect-app/Schema/custom/Parser"
|
|
8
8
|
import type {} from "effect/Equal"
|
|
9
9
|
import type {} from "effect/Hash"
|
|
10
|
-
import { Effect, type NonEmptyReadonlyArray, type S
|
|
10
|
+
import { type Context, Effect, type NonEmptyReadonlyArray, type S } from "effect-app"
|
|
11
11
|
import type { StoreConfig, StoreMaker } from "../../Store.js"
|
|
12
12
|
import type { FieldValues } from "../filter/types.js"
|
|
13
13
|
import { type ExtendedRepository, extendRepo } from "./ext.js"
|
|
@@ -52,7 +52,7 @@ export interface RepositoryOptions<
|
|
|
52
52
|
* Optional context to be provided to Schema decode/encode.
|
|
53
53
|
* Useful for effectful transformations like XWithItems, where items is a transformation retrieving elements from another database table or other source.
|
|
54
54
|
*/
|
|
55
|
-
schemaContext?:
|
|
55
|
+
schemaContext?: Context.Context<RCtx>
|
|
56
56
|
|
|
57
57
|
overrides?: (
|
|
58
58
|
repo: Repository<T, Encoded, Evt, ItemType, IdKey, Exclude<RSchema, RCtx>, RPublish>
|
package/src/Operations.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { reportError } from "@effect-app/infra/errorReporter"
|
|
2
2
|
import { subHours } from "date-fns"
|
|
3
|
-
import { Cause, copy, Duration, Effect, Exit, type Fiber, Layer, Option, S, Schedule
|
|
3
|
+
import { Cause, Context, copy, Duration, Effect, Exit, type Fiber, Layer, Option, S, Schedule } from "effect-app"
|
|
4
4
|
import { annotateLogscoped } from "effect-app/Effect"
|
|
5
5
|
import { dual, pipe } from "effect-app/Function"
|
|
6
6
|
import { Operation, OperationFailure, OperationId, type OperationProgress, OperationSuccess } from "effect-app/Operations"
|
|
@@ -189,7 +189,7 @@ const make = Effect.gen(function*() {
|
|
|
189
189
|
}
|
|
190
190
|
})
|
|
191
191
|
|
|
192
|
-
export class Operations extends
|
|
192
|
+
export class Operations extends Context.Opaque<Operations>()("effect-app/Operations", { make }) {
|
|
193
193
|
private static readonly CleanupLive = this
|
|
194
194
|
.use((_) =>
|
|
195
195
|
_.cleanup.pipe(
|
package/src/OperationsRepo.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Context, Effect } from "effect-app"
|
|
2
2
|
import { Operation } from "effect-app/Operations"
|
|
3
3
|
import { makeRepo } from "./Model.js"
|
|
4
4
|
|
|
5
|
-
export class OperationsRepo extends
|
|
5
|
+
export class OperationsRepo extends Context.Service<OperationsRepo>()(
|
|
6
6
|
"OperationRepo",
|
|
7
7
|
{
|
|
8
8
|
make: Effect.gen(function*() {
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { getRequestContext, setupRequestContextWithCustomSpan } from "@effect-app/infra/api/setupRequest"
|
|
2
2
|
import { reportNonInterruptedFailure } from "@effect-app/infra/QueueMaker/errors"
|
|
3
3
|
import { type QueueBase, QueueMeta } from "@effect-app/infra/QueueMaker/service"
|
|
4
|
-
import { SqlClient } from "effect/unstable/sql"
|
|
5
4
|
import { subMinutes } from "date-fns"
|
|
6
|
-
import { Effect, Fiber, Option, S, Tracer } from "effect-app"
|
|
7
|
-
import type
|
|
5
|
+
import { Effect, Fiber, type NonEmptyReadonlyArray, Option, S, Tracer } from "effect-app"
|
|
6
|
+
import { type NonEmptyString255 } from "effect-app/Schema"
|
|
8
7
|
import { pretty } from "effect-app/utils"
|
|
9
|
-
import
|
|
8
|
+
import { SqlClient } from "effect/unstable/sql"
|
|
10
9
|
import { SQLModel } from "../adapters/SQL.js"
|
|
11
10
|
import { InfraLogger } from "../logger.js"
|
|
12
11
|
|
|
13
|
-
export const QueueId = S.
|
|
12
|
+
export const QueueId = S.Finite.pipe(S.brand("QueueId"))
|
|
14
13
|
export type QueueId = typeof QueueId.Type
|
|
15
14
|
|
|
16
15
|
// TODO: let the model track and Auto Generate versionColumn on every update instead
|
|
@@ -79,14 +78,14 @@ export function makeSQLQueue<
|
|
|
79
78
|
|
|
80
79
|
const q = {
|
|
81
80
|
offer: Effect.fnUntraced(function*(body: Evt, meta: typeof QueueMeta.Type) {
|
|
82
|
-
yield* queueRepo.insertVoid({
|
|
81
|
+
yield* queueRepo.insertVoid(Queue.insert.make({
|
|
83
82
|
body,
|
|
84
83
|
meta,
|
|
85
84
|
name: queueName,
|
|
86
85
|
processingAt: Option.none(),
|
|
87
86
|
finishedAt: Option.none(),
|
|
88
87
|
etag: crypto.randomUUID()
|
|
89
|
-
})
|
|
88
|
+
}))
|
|
90
89
|
}),
|
|
91
90
|
take: Effect.gen(function*() {
|
|
92
91
|
while (true) {
|
|
@@ -95,15 +94,16 @@ export function makeSQLQueue<
|
|
|
95
94
|
const dec = yield* decodeDrain(first)
|
|
96
95
|
const { createdAt, updatedAt, ...rest } = dec
|
|
97
96
|
return yield* drainRepo.update(
|
|
98
|
-
{ ...rest, processingAt: Option.some(new Date()) } // auto in lib , etag: crypto.randomUUID()
|
|
97
|
+
Drain.update.make({ ...rest, processingAt: Option.some(new Date()) }) // auto in lib , etag: crypto.randomUUID()
|
|
99
98
|
)
|
|
100
99
|
}
|
|
101
100
|
if (first) return first
|
|
102
101
|
yield* Effect.sleep(250)
|
|
103
102
|
}
|
|
104
103
|
}),
|
|
105
|
-
finish: ({ createdAt, updatedAt, ...q }: Drain)
|
|
106
|
-
drainRepo.updateVoid({ ...q, finishedAt: Option.some(new Date()) }) // auto in lib , etag: crypto.randomUUID()
|
|
104
|
+
finish: Effect.fn(function*({ createdAt, updatedAt, ...q }: Drain) {
|
|
105
|
+
return yield* drainRepo.updateVoid(Drain.update.make({ ...q, finishedAt: Option.some(new Date()) })) // auto in lib , etag: crypto.randomUUID()
|
|
106
|
+
})
|
|
107
107
|
}
|
|
108
108
|
const queue = {
|
|
109
109
|
publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Cause, Tracer } from "effect"
|
|
2
|
-
import { Effect, Fiber, flow, S } from "effect-app"
|
|
3
|
-
import * as Q from "effect/Queue"
|
|
2
|
+
import { Effect, Fiber, flow, type NonEmptyReadonlyArray, S } from "effect-app"
|
|
4
3
|
import { pretty } from "effect-app/utils"
|
|
4
|
+
import * as Q from "effect/Queue"
|
|
5
5
|
import { MemQueue } from "../adapters/memQueue.js"
|
|
6
6
|
import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
|
|
7
7
|
import { InfraLogger } from "../logger.js"
|
|
8
8
|
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
|
|
9
|
-
import type { NonEmptyReadonlyArray } from "effect-app"
|
|
10
9
|
import { type QueueBase, QueueMeta } from "./service.js"
|
|
11
10
|
|
|
12
11
|
export function makeMemQueue<
|
|
@@ -26,8 +25,12 @@ export function makeMemQueue<
|
|
|
26
25
|
const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
|
|
27
26
|
|
|
28
27
|
const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
|
|
28
|
+
const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
|
|
29
|
+
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
29
30
|
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
30
|
-
const
|
|
31
|
+
const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
|
|
32
|
+
|
|
33
|
+
const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
|
|
31
34
|
|
|
32
35
|
const queue = {
|
|
33
36
|
publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
|
|
@@ -37,10 +40,8 @@ export function makeMemQueue<
|
|
|
37
40
|
Effect
|
|
38
41
|
.forEach(messages, (m) =>
|
|
39
42
|
// we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
40
|
-
|
|
43
|
+
encodePublish({ body: m, meta: requestContext }).pipe(
|
|
41
44
|
Effect.orDie,
|
|
42
|
-
Effect
|
|
43
|
-
.map(JSON.stringify),
|
|
44
45
|
// .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
|
|
45
46
|
Effect.flatMap((_) => Q.offer(q, _))
|
|
46
47
|
), { discard: true })
|
|
@@ -58,42 +59,40 @@ export function makeMemQueue<
|
|
|
58
59
|
const reportError = reportNonInterruptedFailureCause({ name: "MemQueue.drain." + queueDrainName })
|
|
59
60
|
const processMessage = (msg: string) =>
|
|
60
61
|
// we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
61
|
-
|
|
62
|
-
.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
{
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"queue.name": queueDrainName,
|
|
84
|
-
"queue.sessionId": sessionId,
|
|
85
|
-
"queue.input": body
|
|
86
|
-
}
|
|
62
|
+
parseDrain(msg).pipe(
|
|
63
|
+
Effect.orDie,
|
|
64
|
+
Effect
|
|
65
|
+
.flatMap(({ body, meta }) => {
|
|
66
|
+
let effect = InfraLogger
|
|
67
|
+
.logDebug(`[${queueDrainName}] Processing incoming message`)
|
|
68
|
+
.pipe(
|
|
69
|
+
Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
|
|
70
|
+
Effect.andThen(handleEvent(body)),
|
|
71
|
+
silenceAndReportError,
|
|
72
|
+
(_) =>
|
|
73
|
+
setupRequestContextWithCustomSpan(
|
|
74
|
+
_,
|
|
75
|
+
meta,
|
|
76
|
+
`queue.drain: ${queueDrainName}.${body._tag}`,
|
|
77
|
+
{
|
|
78
|
+
captureStackTrace: false,
|
|
79
|
+
kind: "consumer",
|
|
80
|
+
attributes: {
|
|
81
|
+
"queue.name": queueDrainName,
|
|
82
|
+
"queue.sessionId": sessionId,
|
|
83
|
+
"queue.input": body
|
|
87
84
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
if (meta.span) {
|
|
89
|
+
effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
|
|
90
|
+
}
|
|
91
|
+
return effect
|
|
92
|
+
})
|
|
93
|
+
)
|
|
94
|
+
return Q
|
|
95
|
+
.take(qDrain)
|
|
97
96
|
.pipe(
|
|
98
97
|
Effect
|
|
99
98
|
.flatMap((x) =>
|