@effect-app/infra 1.24.1 → 1.25.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 +12 -0
- package/_cjs/api/routing2/DynamicMiddleware.cjs +41 -0
- package/_cjs/api/routing2/DynamicMiddleware.cjs.map +1 -0
- package/_cjs/api/routing2.cjs +112 -0
- package/_cjs/api/routing2.cjs.map +1 -0
- package/_cjs/services/QueueMaker/SQLQueue.cjs +1 -2
- package/_cjs/services/QueueMaker/SQLQueue.cjs.map +1 -1
- package/dist/api/routing2/DynamicMiddleware.d.ts +79 -0
- package/dist/api/routing2/DynamicMiddleware.d.ts.map +1 -0
- package/dist/api/routing2/DynamicMiddleware.js +30 -0
- package/dist/api/routing2.d.ts +79 -0
- package/dist/api/routing2.d.ts.map +1 -0
- package/dist/api/routing2.js +103 -0
- package/dist/services/QueueMaker/SQLQueue.d.ts +1 -1
- package/dist/services/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/SQLQueue.js +2 -3
- package/package.json +24 -2
- package/src/api/routing2/DynamicMiddleware.ts +211 -0
- package/src/api/routing2.ts +338 -0
- package/src/services/QueueMaker/SQLQueue.ts +1 -2
- package/vitest.config.ts.timestamp-1711656440838-19c636fe320df.mjs +0 -0
- package/vitest.config.ts.timestamp-1711724061890-6ecedb0a07fdd.mjs +0 -0
- package/vitest.config.ts.timestamp-1711743489537-da8d9e5f66c9f.mjs +0 -0
- package/vitest.config.ts.timestamp-1711744615239-dcf257a844e01.mjs +0 -37
|
@@ -77,9 +77,8 @@ export function makeSQLQueue(queueName, queueDrainName, schema, drainSchema) {
|
|
|
77
77
|
if (first) {
|
|
78
78
|
const dec = yield* decodeDrain(first);
|
|
79
79
|
const { createdAt, updatedAt, ...rest } = dec;
|
|
80
|
-
yield* drainRepo.
|
|
80
|
+
return yield* drainRepo.update(Drain.update.make({ ...rest, processingAt: Option.some(new Date()) }) // auto in lib , etag: randomUUID()
|
|
81
81
|
);
|
|
82
|
-
return dec;
|
|
83
82
|
}
|
|
84
83
|
if (first)
|
|
85
84
|
return first;
|
|
@@ -141,4 +140,4 @@ export function makeSQLQueue(queueName, queueDrainName, schema, drainSchema) {
|
|
|
141
140
|
};
|
|
142
141
|
});
|
|
143
142
|
}
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMUXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvUXVldWVNYWtlci9TUUxRdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQ2pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhDQUE4QyxDQUFBO0FBRTFGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQTtBQUM1RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUU3QyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBR3hELG9GQUFvRjtBQUNwRixNQUFNLFVB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
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.25.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@azure/cosmos": "^4.1.1",
|
|
8
8
|
"@azure/service-bus": "^7.9.5",
|
|
9
|
+
"@effect/rpc": "^0.40.2",
|
|
10
|
+
"@effect/rpc-http": "^0.38.3",
|
|
9
11
|
"express-oauth2-jwt-bearer": "^1.6.0",
|
|
10
12
|
"@faker-js/faker": "^8.4.1",
|
|
11
13
|
"@sendgrid/helpers": "^8.0.0",
|
|
@@ -18,8 +20,8 @@
|
|
|
18
20
|
"proper-lockfile": "^4.1.2",
|
|
19
21
|
"pure-rand": "6.1.0",
|
|
20
22
|
"redlock": "^4.2.0",
|
|
21
|
-
"@effect-app/infra-adapters": "1.12.1",
|
|
22
23
|
"@effect-app/core": "1.10.2",
|
|
24
|
+
"@effect-app/infra-adapters": "1.12.1",
|
|
23
25
|
"effect-app": "1.17.5",
|
|
24
26
|
"@effect-app/schema": "1.12.2"
|
|
25
27
|
},
|
|
@@ -186,6 +188,26 @@
|
|
|
186
188
|
"default": "./_cjs/api/routing/schema/routing.cjs"
|
|
187
189
|
}
|
|
188
190
|
},
|
|
191
|
+
"./api/routing2": {
|
|
192
|
+
"import": {
|
|
193
|
+
"types": "./dist/api/routing2.d.ts",
|
|
194
|
+
"default": "./dist/api/routing2.js"
|
|
195
|
+
},
|
|
196
|
+
"require": {
|
|
197
|
+
"types": "./dist/api/routing2.d.ts",
|
|
198
|
+
"default": "./_cjs/api/routing2.cjs"
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
"./api/routing2/DynamicMiddleware": {
|
|
202
|
+
"import": {
|
|
203
|
+
"types": "./dist/api/routing2/DynamicMiddleware.d.ts",
|
|
204
|
+
"default": "./dist/api/routing2/DynamicMiddleware.js"
|
|
205
|
+
},
|
|
206
|
+
"require": {
|
|
207
|
+
"types": "./dist/api/routing2/DynamicMiddleware.d.ts",
|
|
208
|
+
"default": "./_cjs/api/routing2/DynamicMiddleware.cjs"
|
|
209
|
+
}
|
|
210
|
+
},
|
|
189
211
|
"./api/setupRequest": {
|
|
190
212
|
"import": {
|
|
191
213
|
"types": "./dist/api/setupRequest.d.ts",
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { Rpc } from "@effect/rpc"
|
|
3
|
+
import type { Effect, Request } from "effect-app"
|
|
4
|
+
import { S } from "effect-app"
|
|
5
|
+
import type * as EffectRequest from "effect/Request"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context.
|
|
9
|
+
* Unless configured as `true`
|
|
10
|
+
*/
|
|
11
|
+
export type ContextMap<Key, Service, E> = [Key, Service, E, true]
|
|
12
|
+
|
|
13
|
+
export type ContextMapCustom<Key, Service, E, Custom> = [Key, Service, E, Custom]
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context.
|
|
17
|
+
* Unless omitted
|
|
18
|
+
*/
|
|
19
|
+
export type ContextMapInverted<Key, Service, E> = [Key, Service, E, false]
|
|
20
|
+
|
|
21
|
+
type Values<T extends Record<any, any>> = T[keyof T]
|
|
22
|
+
|
|
23
|
+
export type GetEffectContext<CTXMap extends Record<string, [string, any, S.Schema.All, any]>, T> = Values<
|
|
24
|
+
// inverted
|
|
25
|
+
& {
|
|
26
|
+
[
|
|
27
|
+
key in keyof CTXMap as CTXMap[key][3] extends true ? never
|
|
28
|
+
: key extends keyof T ? T[key] extends true ? never : CTXMap[key][0]
|
|
29
|
+
: CTXMap[key][0]
|
|
30
|
+
]: // TODO: or as an Optional available?
|
|
31
|
+
CTXMap[key][1]
|
|
32
|
+
}
|
|
33
|
+
// normal
|
|
34
|
+
& {
|
|
35
|
+
[
|
|
36
|
+
key in keyof CTXMap as CTXMap[key][3] extends false ? never
|
|
37
|
+
: key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never
|
|
38
|
+
: never
|
|
39
|
+
]: // TODO: or as an Optional available?
|
|
40
|
+
CTXMap[key][1]
|
|
41
|
+
}
|
|
42
|
+
>
|
|
43
|
+
export type ValuesOrNeverSchema<T extends Record<any, any>> = Values<T> extends never ? typeof S.Never : Values<T>
|
|
44
|
+
export type GetEffectError<CTXMap extends Record<string, [string, any, S.Schema.All, any]>, T> = Values<
|
|
45
|
+
// inverted
|
|
46
|
+
& {
|
|
47
|
+
[
|
|
48
|
+
key in keyof CTXMap as CTXMap[key][3] extends true ? never
|
|
49
|
+
: key extends keyof T ? T[key] extends true ? never : CTXMap[key][0]
|
|
50
|
+
: CTXMap[key][0]
|
|
51
|
+
]: // TODO: or as an Optional available?
|
|
52
|
+
CTXMap[key][2]
|
|
53
|
+
}
|
|
54
|
+
// normal
|
|
55
|
+
& {
|
|
56
|
+
[
|
|
57
|
+
key in keyof CTXMap as CTXMap[key][3] extends false ? never
|
|
58
|
+
: key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never
|
|
59
|
+
: never
|
|
60
|
+
]: // TODO: or as an Optional available?
|
|
61
|
+
CTXMap[key][2]
|
|
62
|
+
}
|
|
63
|
+
>
|
|
64
|
+
|
|
65
|
+
type GetFailure1<F1> = F1 extends S.Schema.Any ? F1 : typeof S.Never
|
|
66
|
+
type GetFailure<F1, F2> = F1 extends S.Schema.Any ? F2 extends S.Schema.Any ? S.Union<[F1, F2]> : F1 : F2
|
|
67
|
+
|
|
68
|
+
const merge = (a: any, b: Array<any>) =>
|
|
69
|
+
a !== undefined && b.length ? S.Union(a, ...b) : a !== undefined ? a : b.length ? S.Union(...b) : S.Never
|
|
70
|
+
|
|
71
|
+
export const makeRpcClient = <
|
|
72
|
+
RequestConfig extends object,
|
|
73
|
+
CTXMap extends Record<string, [string, any, S.Schema.All, any]>
|
|
74
|
+
>(
|
|
75
|
+
errors: { [K in keyof CTXMap]: CTXMap[K][2] }
|
|
76
|
+
) => {
|
|
77
|
+
// Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc...
|
|
78
|
+
type Context = { success: S.Schema.Any; failure: S.Schema.Any }
|
|
79
|
+
function TaggedRequest<Self>(): {
|
|
80
|
+
<Tag extends string, Payload extends S.Struct.Fields, C extends Context>(
|
|
81
|
+
tag: Tag,
|
|
82
|
+
fields: Payload,
|
|
83
|
+
config: RequestConfig & C
|
|
84
|
+
):
|
|
85
|
+
& S.TaggedRequestClass<
|
|
86
|
+
Self,
|
|
87
|
+
Tag,
|
|
88
|
+
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
89
|
+
typeof config["success"],
|
|
90
|
+
GetEffectError<CTXMap, C> extends never ? typeof config["failure"]
|
|
91
|
+
: GetFailure<typeof config["failure"], GetEffectError<CTXMap, C>>
|
|
92
|
+
> // typeof config["failure"]
|
|
93
|
+
& { config: Omit<C, "success" | "failure"> }
|
|
94
|
+
<Tag extends string, Payload extends S.Struct.Fields, C extends { success: S.Schema.Any }>(
|
|
95
|
+
tag: Tag,
|
|
96
|
+
fields: Payload,
|
|
97
|
+
config: RequestConfig & C
|
|
98
|
+
):
|
|
99
|
+
& S.TaggedRequestClass<
|
|
100
|
+
Self,
|
|
101
|
+
Tag,
|
|
102
|
+
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
103
|
+
typeof config["success"],
|
|
104
|
+
GetFailure1<GetEffectError<CTXMap, C>>
|
|
105
|
+
>
|
|
106
|
+
& { config: Omit<C, "success" | "failure"> }
|
|
107
|
+
<Tag extends string, Payload extends S.Struct.Fields, C extends { failure: S.Schema.Any }>(
|
|
108
|
+
tag: Tag,
|
|
109
|
+
fields: Payload,
|
|
110
|
+
config: RequestConfig & C
|
|
111
|
+
):
|
|
112
|
+
& S.TaggedRequestClass<
|
|
113
|
+
Self,
|
|
114
|
+
Tag,
|
|
115
|
+
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
116
|
+
typeof S.Void,
|
|
117
|
+
GetFailure1<GetEffectError<CTXMap, C>>
|
|
118
|
+
>
|
|
119
|
+
& { config: Omit<C, "success" | "failure"> }
|
|
120
|
+
<Tag extends string, Payload extends S.Struct.Fields, C extends Record<string, any>>(
|
|
121
|
+
tag: Tag,
|
|
122
|
+
fields: Payload,
|
|
123
|
+
config: C & RequestConfig
|
|
124
|
+
):
|
|
125
|
+
& S.TaggedRequestClass<
|
|
126
|
+
Self,
|
|
127
|
+
Tag,
|
|
128
|
+
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
129
|
+
typeof S.Void,
|
|
130
|
+
GetFailure1<GetEffectError<CTXMap, C>>
|
|
131
|
+
>
|
|
132
|
+
& { config: Omit<C, "success" | "failure"> }
|
|
133
|
+
<Tag extends string, Payload extends S.Struct.Fields>(
|
|
134
|
+
tag: Tag,
|
|
135
|
+
fields: Payload
|
|
136
|
+
): S.TaggedRequestClass<
|
|
137
|
+
Self,
|
|
138
|
+
Tag,
|
|
139
|
+
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
140
|
+
typeof S.Void,
|
|
141
|
+
typeof S.Never
|
|
142
|
+
>
|
|
143
|
+
} {
|
|
144
|
+
// TODO: filter errors based on config + take care of inversion
|
|
145
|
+
const errorSchemas = Object.values(errors)
|
|
146
|
+
return (<Tag extends string, Fields extends S.Struct.Fields, C extends Context>(
|
|
147
|
+
tag: Tag,
|
|
148
|
+
fields: Fields,
|
|
149
|
+
config?: C
|
|
150
|
+
) => {
|
|
151
|
+
const req = S.TaggedRequest<Self>()(tag, {
|
|
152
|
+
payload: fields,
|
|
153
|
+
failure: merge(config?.failure, errorSchemas),
|
|
154
|
+
success: config?.success ?? S.Void
|
|
155
|
+
})
|
|
156
|
+
const req2 = Object.assign(req, { config })
|
|
157
|
+
return req2
|
|
158
|
+
}) as any
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
TaggedRequest
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface Middleware<Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>> {
|
|
167
|
+
contextMap: CTXMap
|
|
168
|
+
context: Context
|
|
169
|
+
execute: <
|
|
170
|
+
T extends {
|
|
171
|
+
config?: { [K in keyof CTXMap]?: any }
|
|
172
|
+
},
|
|
173
|
+
Req extends S.TaggedRequest.All,
|
|
174
|
+
R
|
|
175
|
+
>(
|
|
176
|
+
schema: T & S.Schema<Req, any, never>,
|
|
177
|
+
handler: (
|
|
178
|
+
request: Req
|
|
179
|
+
) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>,
|
|
180
|
+
moduleName?: string
|
|
181
|
+
) => (
|
|
182
|
+
req: Req
|
|
183
|
+
) => Effect.Effect<
|
|
184
|
+
Request.Request.Success<Req>,
|
|
185
|
+
Request.Request.Error<Req>,
|
|
186
|
+
any // smd
|
|
187
|
+
>
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export const makeRpc = <Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(
|
|
191
|
+
middleware: Middleware<Context, CTXMap>
|
|
192
|
+
) => {
|
|
193
|
+
return {
|
|
194
|
+
effect: <T extends { config?: { [K in keyof CTXMap]?: any } }, Req extends S.TaggedRequest.All, R>(
|
|
195
|
+
schema: T & S.Schema<Req, any, never>,
|
|
196
|
+
handler: (
|
|
197
|
+
request: Req
|
|
198
|
+
) => Effect.Effect<
|
|
199
|
+
EffectRequest.Request.Success<Req>,
|
|
200
|
+
EffectRequest.Request.Error<Req>,
|
|
201
|
+
R
|
|
202
|
+
>,
|
|
203
|
+
moduleName?: string
|
|
204
|
+
) => {
|
|
205
|
+
return Rpc.effect<Req, Context | Exclude<R, GetEffectContext<CTXMap, T["config"]>>>(
|
|
206
|
+
schema,
|
|
207
|
+
middleware.execute(schema, handler, moduleName)
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
|
|
4
|
+
import type { EffectUnunified } from "@effect-app/core/Effect"
|
|
5
|
+
import { typedKeysOf } from "@effect-app/core/utils"
|
|
6
|
+
import type { Compute } from "@effect-app/core/utils"
|
|
7
|
+
import type { _E, _R } from "@effect-app/infra/api/routing"
|
|
8
|
+
import type { Rpc } from "@effect/rpc"
|
|
9
|
+
import { RpcRouter } from "@effect/rpc"
|
|
10
|
+
import { HttpRpcRouter } from "@effect/rpc-http"
|
|
11
|
+
import type { S } from "effect-app"
|
|
12
|
+
import { Effect, Predicate } from "effect-app"
|
|
13
|
+
import { HttpRouter } from "effect-app/http"
|
|
14
|
+
import type { GetEffectContext, Middleware } from "./routing2/DynamicMiddleware.js"
|
|
15
|
+
import { makeRpc } from "./routing2/DynamicMiddleware.js"
|
|
16
|
+
|
|
17
|
+
export interface Hint<Err extends string> {
|
|
18
|
+
Err: Err
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type HandleVoid<Expected, Actual, Result> = [Expected] extends [void]
|
|
22
|
+
? [Actual] extends [void] ? Result : Hint<"You're returning non void for a void Response, please fix">
|
|
23
|
+
: Result
|
|
24
|
+
|
|
25
|
+
type AnyRequestModule = S.Schema.Any & { success?: S.Schema.Any; failure?: S.Schema.Any }
|
|
26
|
+
|
|
27
|
+
type GetSuccess<T> = T extends { success: S.Schema.Any } ? T["success"] : typeof S.Void
|
|
28
|
+
|
|
29
|
+
type GetSuccessShape<Action extends { success?: S.Schema.Any }, RT extends "d" | "raw"> = RT extends "raw"
|
|
30
|
+
? S.Schema.Encoded<GetSuccess<Action>>
|
|
31
|
+
: S.Schema.Type<GetSuccess<Action>>
|
|
32
|
+
type GetFailure<T extends { failure?: S.Schema.Any }> = T["failure"] extends never ? typeof S.Never : T["failure"]
|
|
33
|
+
|
|
34
|
+
export interface Handler<Action extends AnyRequestModule, RT extends "raw" | "d", A, E, R, Context> {
|
|
35
|
+
new(): {}
|
|
36
|
+
_tag: RT
|
|
37
|
+
handler: (
|
|
38
|
+
req: S.Schema.Type<Action>,
|
|
39
|
+
ctx: Context
|
|
40
|
+
) => Effect<
|
|
41
|
+
A,
|
|
42
|
+
E,
|
|
43
|
+
R
|
|
44
|
+
>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Separate "raw" vs "d" to verify A (Encoded for "raw" vs Type for "d")
|
|
48
|
+
type AHandler<Action extends AnyRequestModule> =
|
|
49
|
+
| Handler<
|
|
50
|
+
Action,
|
|
51
|
+
"raw",
|
|
52
|
+
S.Schema.Encoded<GetSuccess<Action>>,
|
|
53
|
+
S.Schema.Type<GetFailure<Action>>,
|
|
54
|
+
any,
|
|
55
|
+
{ Response: any }
|
|
56
|
+
>
|
|
57
|
+
| Handler<
|
|
58
|
+
Action,
|
|
59
|
+
"d",
|
|
60
|
+
S.Schema.Type<GetSuccess<Action>>,
|
|
61
|
+
S.Schema.Type<GetFailure<Action>>,
|
|
62
|
+
any,
|
|
63
|
+
{ Response: any }
|
|
64
|
+
>
|
|
65
|
+
|
|
66
|
+
type Filter<T> = {
|
|
67
|
+
[K in keyof T as T[K] extends S.Schema.All & { success: S.Schema.Any; failure: S.Schema.Any } ? K : never]: T[K]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const makeRouter2 = <Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(
|
|
71
|
+
middleware: Middleware<Context, CTXMap>
|
|
72
|
+
) => {
|
|
73
|
+
const rpc = makeRpc(middleware)
|
|
74
|
+
function matchFor<Rsc extends Record<string, any> & { meta: { moduleName: string } }>(
|
|
75
|
+
rsc: Rsc
|
|
76
|
+
) {
|
|
77
|
+
const meta = (rsc as any).meta as { moduleName: string }
|
|
78
|
+
if (!meta) throw new Error("Resource has no meta specified") // TODO: do something with moduleName+cur etc.
|
|
79
|
+
|
|
80
|
+
type Filtered = Filter<Rsc>
|
|
81
|
+
const filtered = typedKeysOf(rsc).reduce((acc, cur) => {
|
|
82
|
+
if (Predicate.isObject(rsc[cur]) && rsc[cur]["success"]) {
|
|
83
|
+
acc[cur as keyof Filtered] = rsc[cur]
|
|
84
|
+
}
|
|
85
|
+
return acc
|
|
86
|
+
}, {} as Filtered)
|
|
87
|
+
|
|
88
|
+
const matchWithServices = <Key extends keyof Filtered>(action: Key) => {
|
|
89
|
+
return <
|
|
90
|
+
SVC extends Record<
|
|
91
|
+
string,
|
|
92
|
+
Effect<any, any, any>
|
|
93
|
+
>,
|
|
94
|
+
R2,
|
|
95
|
+
E,
|
|
96
|
+
A
|
|
97
|
+
>(
|
|
98
|
+
_services: SVC,
|
|
99
|
+
f: (
|
|
100
|
+
req: S.Schema.Type<Rsc[Key]>,
|
|
101
|
+
ctx: any
|
|
102
|
+
// ctx: Compute<
|
|
103
|
+
// LowerServices<EffectDeps<SVC>> & never // ,
|
|
104
|
+
// "flat"
|
|
105
|
+
// >
|
|
106
|
+
) => Effect<A, E, R2>
|
|
107
|
+
) =>
|
|
108
|
+
(req: any) =>
|
|
109
|
+
// Effect.andThen(allLower(services), (svc2) =>
|
|
110
|
+
// ...ctx, ...svc2,
|
|
111
|
+
f(req, { Response: rsc[action].success })
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
type MatchWithServicesNew<RT extends "raw" | "d", Key extends keyof Rsc> = {
|
|
115
|
+
<R2, E, A>(
|
|
116
|
+
f: Effect<A, E, R2>
|
|
117
|
+
): HandleVoid<
|
|
118
|
+
GetSuccessShape<Rsc[Key], RT>,
|
|
119
|
+
A,
|
|
120
|
+
Handler<
|
|
121
|
+
Rsc[Key],
|
|
122
|
+
RT,
|
|
123
|
+
A,
|
|
124
|
+
E,
|
|
125
|
+
Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>,
|
|
126
|
+
{ Response: Rsc[Key]["success"] } //
|
|
127
|
+
>
|
|
128
|
+
>
|
|
129
|
+
|
|
130
|
+
<R2, E, A>(
|
|
131
|
+
f: (
|
|
132
|
+
req: S.Schema.Type<Rsc[Key]>,
|
|
133
|
+
ctx: { Response: Rsc[Key]["success"] }
|
|
134
|
+
) => Effect<A, E, R2>
|
|
135
|
+
): HandleVoid<
|
|
136
|
+
GetSuccessShape<Rsc[Key], RT>,
|
|
137
|
+
A,
|
|
138
|
+
Handler<
|
|
139
|
+
Rsc[Key],
|
|
140
|
+
RT,
|
|
141
|
+
A,
|
|
142
|
+
E,
|
|
143
|
+
Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>,
|
|
144
|
+
{ Response: Rsc[Key]["success"] } //
|
|
145
|
+
>
|
|
146
|
+
>
|
|
147
|
+
|
|
148
|
+
<
|
|
149
|
+
SVC extends Record<
|
|
150
|
+
string,
|
|
151
|
+
EffectUnunified<any, any, any>
|
|
152
|
+
>,
|
|
153
|
+
R2,
|
|
154
|
+
E,
|
|
155
|
+
A
|
|
156
|
+
>(
|
|
157
|
+
services: SVC,
|
|
158
|
+
f: (
|
|
159
|
+
req: S.Schema.Type<Rsc[Key]>,
|
|
160
|
+
ctx: Compute<
|
|
161
|
+
// LowerServices<EffectDeps<SVC>> & Pick<Rsc[Key], "success">,
|
|
162
|
+
{ Response: Rsc[Key] },
|
|
163
|
+
"flat"
|
|
164
|
+
>
|
|
165
|
+
) => Effect<A, E, R2>
|
|
166
|
+
): HandleVoid<
|
|
167
|
+
GetSuccessShape<Rsc[Key], RT>,
|
|
168
|
+
A,
|
|
169
|
+
Handler<
|
|
170
|
+
Rsc[Key],
|
|
171
|
+
RT,
|
|
172
|
+
A,
|
|
173
|
+
E,
|
|
174
|
+
Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>,
|
|
175
|
+
{ Response: Rsc[Key]["success"] } //
|
|
176
|
+
>
|
|
177
|
+
>
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
type Keys = keyof Filtered
|
|
181
|
+
|
|
182
|
+
const controllers = <
|
|
183
|
+
THandlers extends {
|
|
184
|
+
// import to keep them separate via | for type checking!!
|
|
185
|
+
[K in Keys]: AHandler<Rsc[K]>
|
|
186
|
+
}
|
|
187
|
+
>(
|
|
188
|
+
controllers: THandlers
|
|
189
|
+
) => {
|
|
190
|
+
const handlers = typedKeysOf(filtered).reduce(
|
|
191
|
+
(acc, cur) => {
|
|
192
|
+
if (cur === "meta") return acc
|
|
193
|
+
;(acc as any)[cur] = {
|
|
194
|
+
h: controllers[cur as keyof typeof controllers].handler,
|
|
195
|
+
Request: rsc[cur]
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return acc
|
|
199
|
+
},
|
|
200
|
+
{} as {
|
|
201
|
+
[K in Keys]: {
|
|
202
|
+
h: (
|
|
203
|
+
r: S.Schema.Type<Rsc[K]>
|
|
204
|
+
) => Effect<
|
|
205
|
+
S.Schema.Type<GetSuccess<Rsc[K]>>,
|
|
206
|
+
_E<ReturnType<THandlers[K]["handler"]>>,
|
|
207
|
+
_R<ReturnType<THandlers[K]["handler"]>>
|
|
208
|
+
>
|
|
209
|
+
Request: Rsc[K]
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
const mapped = typedKeysOf(handlers).reduce((acc, cur) => {
|
|
215
|
+
const handler = handlers[cur]
|
|
216
|
+
const req = handler.Request
|
|
217
|
+
|
|
218
|
+
acc[cur] = rpc.effect(req, handler.h as any, meta.moduleName) // TODO
|
|
219
|
+
return acc
|
|
220
|
+
}, {} as any) as {
|
|
221
|
+
[K in Keys]: Rpc.Rpc<
|
|
222
|
+
Rsc[K],
|
|
223
|
+
_R<ReturnType<THandlers[K]["handler"]>>
|
|
224
|
+
>
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
type RPCRouteR<T extends Rpc.Rpc<any, any>> = [T] extends [
|
|
228
|
+
Rpc.Rpc<any, infer R>
|
|
229
|
+
] ? R
|
|
230
|
+
: never
|
|
231
|
+
|
|
232
|
+
type RPCRouteReq<T extends Rpc.Rpc<any, any>> = [T] extends [
|
|
233
|
+
Rpc.Rpc<infer Req, any>
|
|
234
|
+
] ? Req
|
|
235
|
+
: never
|
|
236
|
+
|
|
237
|
+
const router = RpcRouter.make(...Object.values(mapped) as any) as RpcRouter.RpcRouter<
|
|
238
|
+
RPCRouteReq<typeof mapped[keyof typeof mapped]>,
|
|
239
|
+
RPCRouteR<typeof mapped[keyof typeof mapped]>
|
|
240
|
+
>
|
|
241
|
+
|
|
242
|
+
return HttpRouter.empty.pipe(
|
|
243
|
+
HttpRouter.all(("/rpc/" + rsc.meta.moduleName) as any, HttpRpcRouter.toHttpApp(router))
|
|
244
|
+
)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const r = {
|
|
248
|
+
controllers,
|
|
249
|
+
...typedKeysOf(filtered).reduce(
|
|
250
|
+
(prev, cur) => {
|
|
251
|
+
;(prev as any)[cur] = (svcOrFnOrEffect: any, fnOrNone: any) => {
|
|
252
|
+
const stack = new Error().stack?.split("\n").slice(2).join("\n")
|
|
253
|
+
return Effect.isEffect(svcOrFnOrEffect)
|
|
254
|
+
? class {
|
|
255
|
+
static stack = stack
|
|
256
|
+
static _tag = "d"
|
|
257
|
+
static handler = () => svcOrFnOrEffect
|
|
258
|
+
}
|
|
259
|
+
: typeof svcOrFnOrEffect === "function"
|
|
260
|
+
? class {
|
|
261
|
+
static stack = stack
|
|
262
|
+
static _tag = "d"
|
|
263
|
+
static handler = (req: any, ctx: any) => svcOrFnOrEffect(req, { ...ctx, Response: rsc[cur].success })
|
|
264
|
+
}
|
|
265
|
+
: class {
|
|
266
|
+
static stack = stack
|
|
267
|
+
static _tag = "d"
|
|
268
|
+
static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
;(prev as any)[(cur as any) + "Raw"] = (svcOrFnOrEffect: any, fnOrNone: any) => {
|
|
272
|
+
const stack = new Error().stack?.split("\n").slice(2).join("\n")
|
|
273
|
+
return Effect.isEffect(svcOrFnOrEffect)
|
|
274
|
+
? class {
|
|
275
|
+
static stack = stack
|
|
276
|
+
static _tag = "raw"
|
|
277
|
+
static handler = () => svcOrFnOrEffect
|
|
278
|
+
}
|
|
279
|
+
: typeof svcOrFnOrEffect === "function"
|
|
280
|
+
? class {
|
|
281
|
+
static stack = stack
|
|
282
|
+
static _tag = "raw"
|
|
283
|
+
static handler = (req: any, ctx: any) => svcOrFnOrEffect(req, { ...ctx, Response: rsc[cur].success })
|
|
284
|
+
}
|
|
285
|
+
: class {
|
|
286
|
+
static stack = stack
|
|
287
|
+
static _tag = "raw"
|
|
288
|
+
static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone)
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return prev
|
|
292
|
+
},
|
|
293
|
+
{} as
|
|
294
|
+
& {
|
|
295
|
+
// use Rsc as Key over using Keys, so that the Go To on X.Action remain in tact in Controllers files
|
|
296
|
+
/**
|
|
297
|
+
* Requires the Type shape
|
|
298
|
+
*/
|
|
299
|
+
[Key in keyof Filtered]: MatchWithServicesNew<"d", Key>
|
|
300
|
+
}
|
|
301
|
+
& {
|
|
302
|
+
// use Rsc as Key over using Keys, so that the Go To on X.Action remain in tact in Controllers files
|
|
303
|
+
/**
|
|
304
|
+
* Requires the Encoded shape (e.g directly undecoded from DB, so that we don't do multiple Decode/Encode)
|
|
305
|
+
*/
|
|
306
|
+
[Key in keyof Filtered as Key extends string ? `${Key}Raw` : never]: MatchWithServicesNew<"raw", Key>
|
|
307
|
+
}
|
|
308
|
+
)
|
|
309
|
+
}
|
|
310
|
+
return r
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
type RequestHandlersTest = {
|
|
314
|
+
[key: string]: HttpRouter.HttpRouter<any, any>
|
|
315
|
+
}
|
|
316
|
+
function matchAll<T extends RequestHandlersTest>(handlers: T) {
|
|
317
|
+
const r = typedKeysOf(handlers).reduce((acc, cur) => {
|
|
318
|
+
return HttpRouter.concat(acc, handlers[cur] as any)
|
|
319
|
+
}, HttpRouter.empty)
|
|
320
|
+
|
|
321
|
+
type _RRouter<T extends HttpRouter.HttpRouter<any, any>> = [T] extends [
|
|
322
|
+
HttpRouter.HttpRouter<any, infer R>
|
|
323
|
+
] ? R
|
|
324
|
+
: never
|
|
325
|
+
|
|
326
|
+
type _ERouter<T extends HttpRouter.HttpRouter<any, any>> = [T] extends [
|
|
327
|
+
HttpRouter.HttpRouter<infer E, any>
|
|
328
|
+
] ? E
|
|
329
|
+
: never
|
|
330
|
+
|
|
331
|
+
return r as HttpRouter.HttpRouter<
|
|
332
|
+
_ERouter<typeof handlers[keyof typeof handlers]>,
|
|
333
|
+
_RRouter<typeof handlers[keyof typeof handlers]>
|
|
334
|
+
>
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return { matchAll, matchFor }
|
|
338
|
+
}
|
|
@@ -97,10 +97,9 @@ export function makeSQLQueue<
|
|
|
97
97
|
if (first) {
|
|
98
98
|
const dec = yield* decodeDrain(first)
|
|
99
99
|
const { createdAt, updatedAt, ...rest } = dec
|
|
100
|
-
yield* drainRepo.
|
|
100
|
+
return yield* drainRepo.update(
|
|
101
101
|
Drain.update.make({ ...rest, processingAt: Option.some(new Date()) }) // auto in lib , etag: randomUUID()
|
|
102
102
|
)
|
|
103
|
-
return dec
|
|
104
103
|
}
|
|
105
104
|
if (first) return first
|
|
106
105
|
yield* Effect.sleep(250)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|