@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.
@@ -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.updateVoid(Drain.update.make({ ...rest, processingAt: Option.some(new Date()) }) // auto in lib , etag: randomUUID()
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMUXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvUXVldWVNYWtlci9TUUxRdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQ2pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhDQUE4QyxDQUFBO0FBRTFGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQTtBQUM1RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUU3QyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBR3hELG9GQUFvRjtBQUNwRixNQUFNLFVB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
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.24.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.updateVoid(
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)