@effect-app/infra 1.29.6 → 1.30.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 -0
- package/_cjs/api/routing/DynamicMiddleware.cjs +1 -25
- package/_cjs/api/routing/DynamicMiddleware.cjs.map +1 -1
- package/_cjs/api/routing.cjs +6 -2
- package/_cjs/api/routing.cjs.map +1 -1
- package/dist/api/routing/DynamicMiddleware.d.ts +4 -67
- package/dist/api/routing/DynamicMiddleware.d.ts.map +1 -1
- package/dist/api/routing/DynamicMiddleware.js +1 -22
- package/dist/api/routing.d.ts +6 -5
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +8 -4
- package/package.json +4 -4
- package/src/api/routing/DynamicMiddleware.ts +4 -172
- package/src/api/routing.ts +23 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 1.30.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 67a202a: fix location
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [67a202a]
|
|
12
|
+
- effect-app@1.23.0
|
|
13
|
+
- @effect-app/infra-adapters@1.15.4
|
|
14
|
+
|
|
15
|
+
## 1.29.7
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- 9a02e95: revert toHttp change
|
|
20
|
+
|
|
3
21
|
## 1.29.6
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -3,36 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.makeRpc = void 0;
|
|
7
7
|
var _rpc = require("@effect/rpc");
|
|
8
|
-
var _effectApp = require("effect-app");
|
|
9
8
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
10
9
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
11
10
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
12
11
|
|
|
13
|
-
const merge = (a, b) =>
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
15
|
-
a !== undefined && b.length ? _effectApp.S.Union(a, ...b) : a !== undefined ? a : b.length ? _effectApp.S.Union(...b) : _effectApp.S.Never;
|
|
16
|
-
const makeRpcClient = (errors, generalErrors) => {
|
|
17
|
-
function TaggedRequest() {
|
|
18
|
-
// TODO: filter errors based on config + take care of inversion
|
|
19
|
-
const errorSchemas = Object.values(errors);
|
|
20
|
-
return (tag, fields, config) => {
|
|
21
|
-
const req = _effectApp.S.TaggedRequest()(tag, {
|
|
22
|
-
payload: fields,
|
|
23
|
-
failure: merge(config?.failure, [...errorSchemas, generalErrors].filter(Boolean)),
|
|
24
|
-
success: config?.success ?? _effectApp.S.Void
|
|
25
|
-
});
|
|
26
|
-
return Object.assign(req, {
|
|
27
|
-
config
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
TaggedRequest
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
exports.makeRpcClient = makeRpcClient;
|
|
36
12
|
const makeRpc = middleware => {
|
|
37
13
|
return {
|
|
38
14
|
effect: (schema, handler, moduleName) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicMiddleware.cjs","names":["_rpc","require","
|
|
1
|
+
{"version":3,"file":"DynamicMiddleware.cjs","names":["_rpc","require","makeRpc","middleware","effect","schema","handler","moduleName","Rpc","execute","exports"],"sources":["../../../src/api/routing/DynamicMiddleware.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,IAAA,GAAAC,OAAA;AAHA;AACA;AACA;;AA8BO,MAAMC,OAAO,GAClBC,UAAuC,IACrC;EACF,OAAO;IACLC,MAAM,EAAEA,CACNC,MAAqC,EACrCC,OAMC,EACDC,UAAmB,KACjB;MACF,OAAOC,QAAG,CAACJ,MAAM,CACfC,MAAM,EACNF,UAAU,CAACM,OAAO,CAACJ,MAAM,EAAEC,OAAO,EAAEC,UAAU,CAAC,CAChD;IACH;GACD;AACH,CAAC;AAAAG,OAAA,CAAAR,OAAA,GAAAA,OAAA","ignoreList":[]}
|
package/_cjs/api/routing.cjs
CHANGED
|
@@ -23,8 +23,12 @@ TODO: uninteruptible commands! was for All except GET.
|
|
|
23
23
|
* @deprecated use HttpRpcRouterNoStream.toHttpApp once support options
|
|
24
24
|
*/
|
|
25
25
|
const toHttpApp = (self, options) => {
|
|
26
|
-
const handler = _rpc.RpcRouter.
|
|
27
|
-
return
|
|
26
|
+
const handler = _rpc.RpcRouter.toHandler(self, options);
|
|
27
|
+
return _effectApp.Effect.withFiberRuntime(fiber => {
|
|
28
|
+
const context = fiber.getFiberRef(_effectApp.FiberRef.currentContext);
|
|
29
|
+
const request = _effectApp.Context.unsafeGet(context, _http.HttpServerRequest.HttpServerRequest);
|
|
30
|
+
return _effectApp.Effect.flatMap(request.json, _ => handler(_).pipe(_effectApp.Stream.provideContext(context), _effectApp.Stream.runCollect, _effectApp.Effect.map(_ => _effectApp.Chunk.toReadonlyArray(_)), _effectApp.Effect.andThen(_ => _http.HttpServerResponse.json(_)), _effectApp.Effect.orDie));
|
|
31
|
+
});
|
|
28
32
|
};
|
|
29
33
|
exports.toHttpApp = toHttpApp;
|
|
30
34
|
const makeRouter = middleware => {
|
package/_cjs/api/routing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.cjs","names":["_Effect","require","_utils","_rpc","_effectApp","_http","_DynamicMiddleware","toHttpApp","self","options","handler","RpcRouter","
|
|
1
|
+
{"version":3,"file":"routing.cjs","names":["_Effect","require","_utils","_rpc","_effectApp","_http","_DynamicMiddleware","toHttpApp","self","options","handler","RpcRouter","toHandler","Effect","withFiberRuntime","fiber","context","getFiberRef","FiberRef","currentContext","request","Context","unsafeGet","HttpServerRequest","flatMap","json","_","pipe","Stream","provideContext","runCollect","map","Chunk","toReadonlyArray","andThen","HttpServerResponse","orDie","exports","makeRouter","middleware","rpc","makeRpc","matchFor","rsc","meta","Error","filtered","typedKeysOf","reduce","acc","cur","Predicate","isObject","matchWithServices","action","services","f","req","all","svc","allLower","ctx","makeContext","Response","success","controllers","handlers","h","Request","mapped","effect","moduleName","router","make","Object","values","HttpRouter","empty","spanPrefix","uninterruptible","r","prev","svcOrFnOrEffect","fnOrNone","stack","split","slice","join","isEffect","_tag","matchAll","concat"],"sources":["../../src/api/routing.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,70 +1,8 @@
|
|
|
1
1
|
import { Rpc } from "@effect/rpc";
|
|
2
|
-
import type { Effect, Request } from "effect-app";
|
|
3
|
-
import {
|
|
2
|
+
import type { Effect, Request, S } from "effect-app";
|
|
3
|
+
import type { GetEffectContext, RPCContetMap } from "effect-app/client/req";
|
|
4
4
|
import type * as EffectRequest from "effect/Request";
|
|
5
|
-
|
|
6
|
-
* Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context.
|
|
7
|
-
* Unless configured as `true`
|
|
8
|
-
*/
|
|
9
|
-
export type ContextMap<Key, Service, E> = [Key, Service, E, true];
|
|
10
|
-
export declare namespace ContextMap {
|
|
11
|
-
type Custom<Key, Service, E, Custom> = [Key, Service, E, Custom];
|
|
12
|
-
/**
|
|
13
|
-
* Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context.
|
|
14
|
-
* Unless omitted
|
|
15
|
-
*/
|
|
16
|
-
type Inverted<Key, Service, E> = [Key, Service, E, false];
|
|
17
|
-
type Any = [string, any, S.Schema.All, any];
|
|
18
|
-
}
|
|
19
|
-
type Values<T extends Record<any, any>> = T[keyof T];
|
|
20
|
-
export type GetEffectContext<CTXMap extends Record<string, ContextMap.Any>, T> = Values<{
|
|
21
|
-
[key in keyof CTXMap as CTXMap[key][3] extends true ? never : key extends keyof T ? T[key] extends true ? never : CTXMap[key][0] : CTXMap[key][0]]: CTXMap[key][1];
|
|
22
|
-
} & {
|
|
23
|
-
[key in keyof CTXMap as CTXMap[key][3] extends false ? never : key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never : never]: CTXMap[key][1];
|
|
24
|
-
}>;
|
|
25
|
-
export type ValuesOrNeverSchema<T extends Record<any, any>> = Values<T> extends never ? typeof S.Never : Values<T>;
|
|
26
|
-
export type GetEffectError<CTXMap extends Record<string, ContextMap.Any>, T> = Values<{
|
|
27
|
-
[key in keyof CTXMap as CTXMap[key][3] extends true ? never : key extends keyof T ? T[key] extends true ? never : CTXMap[key][0] : CTXMap[key][0]]: CTXMap[key][2];
|
|
28
|
-
} & {
|
|
29
|
-
[key in keyof CTXMap as CTXMap[key][3] extends false ? never : key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never : never]: CTXMap[key][2];
|
|
30
|
-
}>;
|
|
31
|
-
type JoinSchema<T> = T extends ReadonlyArray<S.Schema.All> ? S.Union<T> : typeof S.Never;
|
|
32
|
-
type ExcludeFromTuple<T extends readonly any[], E> = T extends [infer F, ...infer R] ? [F] extends [E] ? ExcludeFromTuple<R, E> : [F, ...ExcludeFromTuple<R, E>] : [];
|
|
33
|
-
export declare const makeRpcClient: <RequestConfig extends object, CTXMap extends Record<string, ContextMap.Any>, GeneralErrors extends S.Schema.All = never>(errors: { [K in keyof CTXMap]: CTXMap[K][2]; }, generalErrors?: GeneralErrors) => {
|
|
34
|
-
TaggedRequest: <Self>() => {
|
|
35
|
-
<Tag extends string, Payload extends S.Struct.Fields, C extends {
|
|
36
|
-
success: S.Schema.Any;
|
|
37
|
-
failure: S.Schema.Any;
|
|
38
|
-
}>(tag: Tag, fields: Payload, config: RequestConfig & C): S.TaggedRequestClass<Self, Tag, {
|
|
39
|
-
readonly _tag: S.tag<Tag>;
|
|
40
|
-
} & Payload, (typeof config)["success"], JoinSchema<ExcludeFromTuple<[(typeof config)["failure"] | GetEffectError<CTXMap, C> | GeneralErrors], never>>> & {
|
|
41
|
-
config: Omit<C, "success" | "failure">;
|
|
42
|
-
};
|
|
43
|
-
<Tag extends string, Payload_1 extends S.Struct.Fields, C_1 extends {
|
|
44
|
-
success: S.Schema.Any;
|
|
45
|
-
}>(tag: Tag, fields: Payload_1, config: RequestConfig & C_1): S.TaggedRequestClass<Self, Tag, {
|
|
46
|
-
readonly _tag: S.tag<Tag>;
|
|
47
|
-
} & Payload_1, (typeof config)["success"], JoinSchema<ExcludeFromTuple<[GetEffectError<CTXMap, C_1> | GeneralErrors], never>>> & {
|
|
48
|
-
config: Omit<C_1, "success" | "failure">;
|
|
49
|
-
};
|
|
50
|
-
<Tag extends string, Payload_2 extends S.Struct.Fields, C_2 extends {
|
|
51
|
-
failure: S.Schema.Any;
|
|
52
|
-
}>(tag: Tag, fields: Payload_2, config: RequestConfig & C_2): S.TaggedRequestClass<Self, Tag, {
|
|
53
|
-
readonly _tag: S.tag<Tag>;
|
|
54
|
-
} & Payload_2, typeof S.Void, JoinSchema<ExcludeFromTuple<[(typeof config)["failure"] | GetEffectError<CTXMap, C_2> | GeneralErrors], never>>> & {
|
|
55
|
-
config: Omit<C_2, "success" | "failure">;
|
|
56
|
-
};
|
|
57
|
-
<Tag extends string, Payload_3 extends S.Struct.Fields, C_3 extends Record<string, any>>(tag: Tag, fields: Payload_3, config: C_3 & RequestConfig): S.TaggedRequestClass<Self, Tag, {
|
|
58
|
-
readonly _tag: S.tag<Tag>;
|
|
59
|
-
} & Payload_3, typeof S.Void, JoinSchema<ExcludeFromTuple<[GetEffectError<CTXMap, C_3> | GeneralErrors], never>>> & {
|
|
60
|
-
config: Omit<C_3, "success" | "failure">;
|
|
61
|
-
};
|
|
62
|
-
<Tag extends string, Payload_4 extends S.Struct.Fields>(tag: Tag, fields: Payload_4): S.TaggedRequestClass<Self, Tag, {
|
|
63
|
-
readonly _tag: S.tag<Tag>;
|
|
64
|
-
} & Payload_4, typeof S.Void, GeneralErrors extends never ? typeof S.Never : GeneralErrors>;
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
export interface Middleware<Context, CTXMap extends Record<string, ContextMap.Any>> {
|
|
5
|
+
export interface Middleware<Context, CTXMap extends Record<string, RPCContetMap.Any>> {
|
|
68
6
|
contextMap: CTXMap;
|
|
69
7
|
context: Context;
|
|
70
8
|
execute: <T extends {
|
|
@@ -73,10 +11,9 @@ export interface Middleware<Context, CTXMap extends Record<string, ContextMap.An
|
|
|
73
11
|
};
|
|
74
12
|
}, Req extends S.TaggedRequest.All, R>(schema: T & S.Schema<Req, any, never>, handler: (request: Req) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>, moduleName?: string) => (req: Req) => Effect.Effect<Request.Request.Success<Req>, Request.Request.Error<Req>, any>;
|
|
75
13
|
}
|
|
76
|
-
export declare const makeRpc: <Context, CTXMap extends Record<string,
|
|
14
|
+
export declare const makeRpc: <Context, CTXMap extends Record<string, RPCContetMap.Any>>(middleware: Middleware<Context, CTXMap>) => {
|
|
77
15
|
effect: <T extends {
|
|
78
16
|
config?: { [K in keyof CTXMap]?: any; };
|
|
79
17
|
}, Req extends S.TaggedRequest.All, R>(schema: T & S.Schema<Req, any, never>, handler: (request: Req) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>, moduleName?: string) => Rpc.Rpc<Req, Context | Exclude<R, GetEffectContext<CTXMap, T["config"]>>>;
|
|
80
18
|
};
|
|
81
|
-
export {};
|
|
82
19
|
//# sourceMappingURL=DynamicMiddleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicMiddleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/DynamicMiddleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DynamicMiddleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/DynamicMiddleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,KAAK,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,UAAU,CAAC,OAAO,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC;IAClF,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,CACP,CAAC,SAAS;QACR,MAAM,CAAC,EAAE;aAAG,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC,EAAE,GAAG;SAAE,CAAA;KACvC,EACD,GAAG,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAC/B,CAAC,EAED,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EACrC,OAAO,EAAE,CACP,OAAO,EAAE,GAAG,KACT,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAC3F,UAAU,CAAC,EAAE,MAAM,KAChB,CACH,GAAG,EAAE,GAAG,KACL,MAAM,CAAC,MAAM,CAChB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAC5B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAC1B,GAAG,CACJ,CAAA;CACF;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,cAClE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;aAG5B,CAAC,SAAS;QAAE,MAAM,CAAC,EAAE,GAAG,CAAiB,IAAZ,MAAM,MAAM,CAAC,CAAC,EAAE,GAAG,GAAE,CAAA;KAAE,EAAE,GAAG,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UACvF,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,WAC5B,CACP,OAAO,EAAE,GAAG,KACT,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAClC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAChC,CAAC,CACF,eACY,MAAM;CAQxB,CAAA"}
|
|
@@ -2,27 +2,6 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
4
|
import { Rpc } from "@effect/rpc";
|
|
5
|
-
import { S } from "effect-app";
|
|
6
|
-
const merge = (a, b) =>
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
8
|
-
a !== undefined && b.length ? S.Union(a, ...b) : a !== undefined ? a : b.length ? S.Union(...b) : S.Never;
|
|
9
|
-
export const makeRpcClient = (errors, generalErrors) => {
|
|
10
|
-
function TaggedRequest() {
|
|
11
|
-
// TODO: filter errors based on config + take care of inversion
|
|
12
|
-
const errorSchemas = Object.values(errors);
|
|
13
|
-
return ((tag, fields, config) => {
|
|
14
|
-
const req = S.TaggedRequest()(tag, {
|
|
15
|
-
payload: fields,
|
|
16
|
-
failure: merge(config?.failure, [...errorSchemas, generalErrors].filter(Boolean)),
|
|
17
|
-
success: config?.success ?? S.Void
|
|
18
|
-
});
|
|
19
|
-
return Object.assign(req, { config });
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
return {
|
|
23
|
-
TaggedRequest
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
5
|
export const makeRpc = (middleware) => {
|
|
27
6
|
return {
|
|
28
7
|
effect: (schema, handler, moduleName) => {
|
|
@@ -30,4 +9,4 @@ export const makeRpc = (middleware) => {
|
|
|
30
9
|
}
|
|
31
10
|
};
|
|
32
11
|
};
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JvdXRpbmcvRHluYW1pY01pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNERBQTREO0FBQzVELHdEQUF3RDtBQUN4RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQTZCakMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQ3JCLFVBQXVDLEVBQ3ZDLEVBQUU7SUFDRixPQUFPO1FBQ0wsTUFBTSxFQUFFLENBQ04sTUFBcUMsRUFDckMsT0FNQyxFQUNELFVBQW1CLEVBQ25CLEVBQUU7WUFDRixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQ2YsTUFBTSxFQUNOLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FDaEQsQ0FBQTtRQUNILENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFBIn0=
|
package/dist/api/routing.d.ts
CHANGED
|
@@ -4,9 +4,10 @@ import type { Rpc } from "@effect/rpc";
|
|
|
4
4
|
import { RpcRouter } from "@effect/rpc";
|
|
5
5
|
import type { S } from "effect-app";
|
|
6
6
|
import { Effect } from "effect-app";
|
|
7
|
+
import type { GetEffectContext, RPCContetMap } from "effect-app/client/req";
|
|
7
8
|
import type { HttpServerError } from "effect-app/http";
|
|
8
9
|
import { HttpRouter } from "effect-app/http";
|
|
9
|
-
import type {
|
|
10
|
+
import type { Middleware } from "./routing/DynamicMiddleware.js";
|
|
10
11
|
export type _R<T extends Effect<any, any, any>> = [T] extends [
|
|
11
12
|
Effect<any, any, infer R>
|
|
12
13
|
] ? R : never;
|
|
@@ -22,7 +23,7 @@ export type EffectDeps<A> = {
|
|
|
22
23
|
*/
|
|
23
24
|
export declare const toHttpApp: <R extends RpcRouter.RpcRouter<any, any>>(self: R, options?: {
|
|
24
25
|
readonly spanPrefix?: string;
|
|
25
|
-
}) => HttpApp.Default<HttpServerError.RequestError
|
|
26
|
+
}) => HttpApp.Default<HttpServerError.RequestError, RpcRouter.RpcRouter.Context<R>>;
|
|
26
27
|
export interface Hint<Err extends string> {
|
|
27
28
|
Err: Err;
|
|
28
29
|
}
|
|
@@ -53,12 +54,12 @@ type Filter<T> = {
|
|
|
53
54
|
failure: S.Schema.Any;
|
|
54
55
|
} ? K : never]: T[K];
|
|
55
56
|
};
|
|
56
|
-
interface ExtendedMiddleware<Context, CTXMap extends Record<string,
|
|
57
|
+
interface ExtendedMiddleware<Context, CTXMap extends Record<string, RPCContetMap.Any>> extends Middleware<Context, CTXMap> {
|
|
57
58
|
makeContext: Effect<{
|
|
58
59
|
[K in keyof CTXMap as CTXMap[K][1] extends never ? never : CTXMap[K][0]]: CTXMap[K][1];
|
|
59
60
|
}, never, never>;
|
|
60
61
|
}
|
|
61
|
-
export declare const makeRouter: <Context, CTXMap extends Record<string,
|
|
62
|
+
export declare const makeRouter: <Context, CTXMap extends Record<string, RPCContetMap.Any>>(middleware: ExtendedMiddleware<Context, CTXMap>) => {
|
|
62
63
|
matchAll: <T extends {
|
|
63
64
|
[key: string]: HttpRouter.HttpRouter<any, any>;
|
|
64
65
|
}>(handlers: T) => HttpRouter.HttpRouter<[T[keyof T]] extends [HttpRouter.HttpRouter<infer E, any>] ? E : never, [T[keyof T]] extends [HttpRouter.HttpRouter<any, infer R>] ? R : never>;
|
|
@@ -67,7 +68,7 @@ export declare const makeRouter: <Context, CTXMap extends Record<string, Context
|
|
|
67
68
|
moduleName: string;
|
|
68
69
|
};
|
|
69
70
|
}>(rsc: Rsc) => {
|
|
70
|
-
controllers: <THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]>; }>(controllers: THandlers) => HttpRouter.HttpRouter<HttpServerError.RequestError
|
|
71
|
+
controllers: <THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]>; }>(controllers: THandlers) => HttpRouter.HttpRouter<HttpServerError.RequestError, Exclude<[(keyof Filter<Rsc> extends infer T extends keyof Filter<Rsc> ? { [K in T]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>>; } : never)[keyof Filter<Rsc>]] extends [Rpc.Rpc<any, infer R>] ? R : never, HttpRouter.HttpRouter.Provided> | Exclude<import("@effect/schema/Serializable").SerializableWithResult.Context<[(keyof Filter<Rsc> extends infer T extends keyof Filter<Rsc> ? { [K in T]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>>; } : never)[keyof Filter<Rsc>]] extends [Rpc.Rpc<infer Req extends S.TaggedRequest.All, any>] ? Req : never>, HttpRouter.HttpRouter.Provided>>;
|
|
71
72
|
} & { [Key in keyof Filter<Rsc>]: {
|
|
72
73
|
<R2, E, A>(f: Effect<A, E, R2>): HandleVoid<S.Schema.Type<GetSuccess<Rsc[Key]>>, A, Handler<Rsc[Key], "d", A, E, Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>, {
|
|
73
74
|
Response: Rsc[Key]["success"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/api/routing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAG5F,OAAO,KAAK,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/api/routing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAG5F,OAAO,KAAK,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAkB,MAAM,EAA+B,MAAM,YAAY,CAAA;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAyC,MAAM,iBAAiB,CAAA;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAGhE,MAAM,MAAM,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;IAC5D,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;CAC1B,GAAG,CAAC,GACD,KAAK,CAAA;AAET,MAAM,MAAM,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;IAC5D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;CAC1B,GAAG,CAAC,GACD,KAAK,CAAA;AAET,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CACpH,CAAA;AACD;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,KAAG,OAAO,CAAC,OAAO,CACjB,eAAe,CAAC,YAAY,EAC5B,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAkB/B,CAAA;AAmCD,MAAM,WAAW,IAAI,CAAC,GAAG,SAAS,MAAM;IACtC,GAAG,EAAE,GAAG,CAAA;CACT;AAED,KAAK,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GACjE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,2DAA2D,CAAC,GACpG,MAAM,CAAA;AAEV,KAAK,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;IAAE,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;CAAE,CAAA;AAEzF,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;CAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAA;AAKvF,KAAK,UAAU,CAAC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;CAAE,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;AAElH,MAAM,WAAW,OAAO,CAAC,MAAM,SAAS,gBAAgB,EAAE,EAAE,SAAS,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO;IAChG,QAAO,EAAE,CAAA;IACT,IAAI,EAAE,EAAE,CAAA;IACR,OAAO,EAAE,CACP,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAC1B,GAAG,EAAE,OAAO,KACT,MAAM,CACT,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAA;CACF;AAGD,KAAK,QAAQ,CAAC,MAAM,SAAS,gBAAgB,IACzC,OAAO,CACP,MAAM,EACN,KAAK,EACL,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EACpC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,EAC5D,GAAG,EACH;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAClB,GACC,OAAO,CACP,MAAM,EACN,GAAG,EACH,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EACjC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,EAC5D,GAAG,EACH;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAClB,CAAA;AAEH,KAAK,MAAM,CAAC,CAAC,IAAI;KACd,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;QAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;KAAE,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;CACjH,CAAA;AAED,UAAU,kBAAkB,CAAC,OAAO,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CACnF,SAAQ,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;IAGnC,WAAW,EAAE,MAAM,CACjB;SAAG,CAAC,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,EAC1F,KAAK,EACL,KAAK,CACN,CAAA;CACF;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,cACrE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC;eAgQ7B,CAAC;;iBAAwC,CAAC,KAe9C,UAAU,CAAC,UAAU,mDAJH,CAAC,4EALI,CAAC,eAYnC;eA/Qe,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,IAAI,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,OAC7E,GAAG;sBA+GN,SAAS,SAAS,GAEf,CAAS,qBAAA,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAC9B,eAEY,SAAS,oIAgCnB,CAAC,6HAOiB,CAAC,kMAPnB,CAAC,wHAYY,GAAG;WA2EZ,GAAG;SAjMT,EAAE,EAAE,CAAC,EAAE,CAAC;;;SAeR,EAAE,sDA1JH,GAAG;;;;;SA6KD,GAAG,SAAS,MAAM,CAChB,MAAM,EACN,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAC/B,EACD,EAAE,mJAjLJ,GAAG;;;;;;eA2IE,CAAC,EAAE,CAAC;;;qEA3IT,GAAG;;;;;SA6KD,GAAG,SAAS,MAAM,CAChB,MAAM,EACN,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAC/B,EACD,EAAE,qJAjLJ,GAAG;;;;;;CAmXR,CAAA"}
|
package/dist/api/routing.js
CHANGED
|
@@ -8,7 +8,7 @@ TODO: uninteruptible commands! was for All except GET.
|
|
|
8
8
|
import { allLower } from "@effect-app/core/Effect";
|
|
9
9
|
import { typedKeysOf } from "@effect-app/core/utils";
|
|
10
10
|
import { RpcRouter } from "@effect/rpc";
|
|
11
|
-
import { Effect, Predicate } from "effect-app";
|
|
11
|
+
import { Chunk, Context, Effect, FiberRef, Predicate, Stream } from "effect-app";
|
|
12
12
|
import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect-app/http";
|
|
13
13
|
import { makeRpc } from "./routing/DynamicMiddleware.js";
|
|
14
14
|
/**
|
|
@@ -16,8 +16,12 @@ import { makeRpc } from "./routing/DynamicMiddleware.js";
|
|
|
16
16
|
* @deprecated use HttpRpcRouterNoStream.toHttpApp once support options
|
|
17
17
|
*/
|
|
18
18
|
export const toHttpApp = (self, options) => {
|
|
19
|
-
const handler = RpcRouter.
|
|
20
|
-
return
|
|
19
|
+
const handler = RpcRouter.toHandler(self, options);
|
|
20
|
+
return Effect.withFiberRuntime((fiber) => {
|
|
21
|
+
const context = fiber.getFiberRef(FiberRef.currentContext);
|
|
22
|
+
const request = Context.unsafeGet(context, HttpServerRequest.HttpServerRequest);
|
|
23
|
+
return Effect.flatMap(request.json, (_) => handler(_).pipe(Stream.provideContext(context), Stream.runCollect, Effect.map((_) => Chunk.toReadonlyArray(_)), Effect.andThen((_) => HttpServerResponse.json(_)), Effect.orDie));
|
|
24
|
+
});
|
|
21
25
|
};
|
|
22
26
|
export const makeRouter = (middleware) => {
|
|
23
27
|
const rpc = makeRpc(middleware);
|
|
@@ -111,4 +115,4 @@ export const makeRouter = (middleware) => {
|
|
|
111
115
|
}
|
|
112
116
|
return { matchAll, matchFor };
|
|
113
117
|
};
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcm91dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwREFBMEQ7QUFDMUQsNERBQTREO0FBQzVELHVEQUF1RDtBQUN2RDs7O0VBR0U7QUFDRixPQUFPLEVBQUUsUUFBUSxFQUE0QyxNQUFNLHlCQUF5QixDQUFBO0FBQzVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUlwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdoRixPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBZXhEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUEwQyxJQUFPLEVBQUUsT0FFM0UsRUFHQyxFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbEQsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUN2QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUMxRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQy9FLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FDbkIsT0FBTyxDQUFDLElBQUksRUFDWixDQUFDLENBQUMsRUFBRSxFQUFF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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.30.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"proper-lockfile": "^4.1.2",
|
|
21
21
|
"pure-rand": "6.1.0",
|
|
22
22
|
"redlock": "^4.2.0",
|
|
23
|
+
"@effect-app/infra-adapters": "1.15.4",
|
|
23
24
|
"@effect-app/core": "1.12.0",
|
|
24
|
-
"@effect-app/
|
|
25
|
-
"effect-app": "1.
|
|
26
|
-
"@effect-app/schema": "1.15.0"
|
|
25
|
+
"@effect-app/schema": "1.15.0",
|
|
26
|
+
"effect-app": "1.23.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@babel/cli": "^7.25.7",
|
|
@@ -2,179 +2,11 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
4
|
import { Rpc } from "@effect/rpc"
|
|
5
|
-
import type { Effect, Request } from "effect-app"
|
|
6
|
-
import {
|
|
5
|
+
import type { Effect, Request, S } from "effect-app"
|
|
6
|
+
import type { GetEffectContext, RPCContetMap } from "effect-app/client/req"
|
|
7
7
|
import type * as EffectRequest from "effect/Request"
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
* Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context.
|
|
11
|
-
* Unless configured as `true`
|
|
12
|
-
*/
|
|
13
|
-
export type ContextMap<Key, Service, E> = [Key, Service, E, true]
|
|
14
|
-
|
|
15
|
-
export declare namespace ContextMap {
|
|
16
|
-
export type Custom<Key, Service, E, Custom> = [Key, Service, E, Custom]
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context.
|
|
20
|
-
* Unless omitted
|
|
21
|
-
*/
|
|
22
|
-
export type Inverted<Key, Service, E> = [Key, Service, E, false]
|
|
23
|
-
|
|
24
|
-
export type Any = [string, any, S.Schema.All, any]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
type Values<T extends Record<any, any>> = T[keyof T]
|
|
28
|
-
|
|
29
|
-
export type GetEffectContext<CTXMap extends Record<string, ContextMap.Any>, T> = Values<
|
|
30
|
-
// inverted
|
|
31
|
-
& {
|
|
32
|
-
[
|
|
33
|
-
key in keyof CTXMap as CTXMap[key][3] extends true ? never
|
|
34
|
-
: key extends keyof T ? T[key] extends true ? never : CTXMap[key][0]
|
|
35
|
-
: CTXMap[key][0]
|
|
36
|
-
]: // TODO: or as an Optional available?
|
|
37
|
-
CTXMap[key][1]
|
|
38
|
-
}
|
|
39
|
-
// normal
|
|
40
|
-
& {
|
|
41
|
-
[
|
|
42
|
-
key in keyof CTXMap as CTXMap[key][3] extends false ? never
|
|
43
|
-
: key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never
|
|
44
|
-
: never
|
|
45
|
-
]: // TODO: or as an Optional available?
|
|
46
|
-
CTXMap[key][1]
|
|
47
|
-
}
|
|
48
|
-
>
|
|
49
|
-
export type ValuesOrNeverSchema<T extends Record<any, any>> = Values<T> extends never ? typeof S.Never : Values<T>
|
|
50
|
-
export type GetEffectError<CTXMap extends Record<string, ContextMap.Any>, T> = Values<
|
|
51
|
-
// inverted
|
|
52
|
-
& {
|
|
53
|
-
[
|
|
54
|
-
key in keyof CTXMap as CTXMap[key][3] extends true ? never
|
|
55
|
-
: key extends keyof T ? T[key] extends true ? never : CTXMap[key][0]
|
|
56
|
-
: CTXMap[key][0]
|
|
57
|
-
]: // TODO: or as an Optional available?
|
|
58
|
-
CTXMap[key][2]
|
|
59
|
-
}
|
|
60
|
-
// normal
|
|
61
|
-
& {
|
|
62
|
-
[
|
|
63
|
-
key in keyof CTXMap as CTXMap[key][3] extends false ? never
|
|
64
|
-
: key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never
|
|
65
|
-
: never
|
|
66
|
-
]: // TODO: or as an Optional available?
|
|
67
|
-
CTXMap[key][2]
|
|
68
|
-
}
|
|
69
|
-
>
|
|
70
|
-
|
|
71
|
-
const merge = (a: any, b: Array<any>) =>
|
|
72
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
73
|
-
a !== undefined && b.length ? S.Union(a, ...b) : a !== undefined ? a : b.length ? S.Union(...b) : S.Never
|
|
74
|
-
|
|
75
|
-
// TODO: Fix error types...
|
|
76
|
-
type JoinSchema<T> = T extends ReadonlyArray<S.Schema.All> ? S.Union<T> : typeof S.Never
|
|
77
|
-
type ExcludeFromTuple<T extends readonly any[], E> = T extends [infer F, ...infer R]
|
|
78
|
-
? [F] extends [E] ? ExcludeFromTuple<R, E>
|
|
79
|
-
: [F, ...ExcludeFromTuple<R, E>]
|
|
80
|
-
: []
|
|
81
|
-
|
|
82
|
-
export const makeRpcClient = <
|
|
83
|
-
RequestConfig extends object,
|
|
84
|
-
CTXMap extends Record<string, ContextMap.Any>,
|
|
85
|
-
GeneralErrors extends S.Schema.All = never
|
|
86
|
-
>(
|
|
87
|
-
errors: { [K in keyof CTXMap]: CTXMap[K][2] },
|
|
88
|
-
generalErrors?: GeneralErrors
|
|
89
|
-
) => {
|
|
90
|
-
// Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc...
|
|
91
|
-
type Context = { success: S.Schema.Any; failure: S.Schema.Any }
|
|
92
|
-
function TaggedRequest<Self>(): {
|
|
93
|
-
<Tag extends string, Payload extends S.Struct.Fields, C extends Context>(
|
|
94
|
-
tag: Tag,
|
|
95
|
-
fields: Payload,
|
|
96
|
-
config: RequestConfig & C
|
|
97
|
-
):
|
|
98
|
-
& S.TaggedRequestClass<
|
|
99
|
-
Self,
|
|
100
|
-
Tag,
|
|
101
|
-
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
102
|
-
typeof config["success"],
|
|
103
|
-
JoinSchema<ExcludeFromTuple<[typeof config["failure"] | GetEffectError<CTXMap, C> | GeneralErrors], never>>
|
|
104
|
-
>
|
|
105
|
-
& { config: Omit<C, "success" | "failure"> }
|
|
106
|
-
<Tag extends string, Payload extends S.Struct.Fields, C extends { success: S.Schema.Any }>(
|
|
107
|
-
tag: Tag,
|
|
108
|
-
fields: Payload,
|
|
109
|
-
config: RequestConfig & C
|
|
110
|
-
):
|
|
111
|
-
& S.TaggedRequestClass<
|
|
112
|
-
Self,
|
|
113
|
-
Tag,
|
|
114
|
-
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
115
|
-
typeof config["success"],
|
|
116
|
-
JoinSchema<ExcludeFromTuple<[GetEffectError<CTXMap, C> | GeneralErrors], never>>
|
|
117
|
-
>
|
|
118
|
-
& { config: Omit<C, "success" | "failure"> }
|
|
119
|
-
<Tag extends string, Payload extends S.Struct.Fields, C extends { failure: S.Schema.Any }>(
|
|
120
|
-
tag: Tag,
|
|
121
|
-
fields: Payload,
|
|
122
|
-
config: RequestConfig & C
|
|
123
|
-
):
|
|
124
|
-
& S.TaggedRequestClass<
|
|
125
|
-
Self,
|
|
126
|
-
Tag,
|
|
127
|
-
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
128
|
-
typeof S.Void,
|
|
129
|
-
JoinSchema<ExcludeFromTuple<[typeof config["failure"] | GetEffectError<CTXMap, C> | GeneralErrors], never>>
|
|
130
|
-
>
|
|
131
|
-
& { config: Omit<C, "success" | "failure"> }
|
|
132
|
-
<Tag extends string, Payload extends S.Struct.Fields, C extends Record<string, any>>(
|
|
133
|
-
tag: Tag,
|
|
134
|
-
fields: Payload,
|
|
135
|
-
config: C & RequestConfig
|
|
136
|
-
):
|
|
137
|
-
& S.TaggedRequestClass<
|
|
138
|
-
Self,
|
|
139
|
-
Tag,
|
|
140
|
-
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
141
|
-
typeof S.Void,
|
|
142
|
-
JoinSchema<ExcludeFromTuple<[GetEffectError<CTXMap, C> | GeneralErrors], never>>
|
|
143
|
-
>
|
|
144
|
-
& { config: Omit<C, "success" | "failure"> }
|
|
145
|
-
<Tag extends string, Payload extends S.Struct.Fields>(
|
|
146
|
-
tag: Tag,
|
|
147
|
-
fields: Payload
|
|
148
|
-
): S.TaggedRequestClass<
|
|
149
|
-
Self,
|
|
150
|
-
Tag,
|
|
151
|
-
{ readonly _tag: S.tag<Tag> } & Payload,
|
|
152
|
-
typeof S.Void,
|
|
153
|
-
GeneralErrors extends never ? typeof S.Never : GeneralErrors
|
|
154
|
-
>
|
|
155
|
-
} {
|
|
156
|
-
// TODO: filter errors based on config + take care of inversion
|
|
157
|
-
const errorSchemas = Object.values(errors)
|
|
158
|
-
return (<Tag extends string, Fields extends S.Struct.Fields, C extends Context>(
|
|
159
|
-
tag: Tag,
|
|
160
|
-
fields: Fields,
|
|
161
|
-
config?: C
|
|
162
|
-
) => {
|
|
163
|
-
const req = S.TaggedRequest<Self>()(tag, {
|
|
164
|
-
payload: fields,
|
|
165
|
-
failure: merge(config?.failure, [...errorSchemas, generalErrors].filter(Boolean)),
|
|
166
|
-
success: config?.success ?? S.Void
|
|
167
|
-
})
|
|
168
|
-
return Object.assign(req, { config })
|
|
169
|
-
}) as any
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return {
|
|
173
|
-
TaggedRequest
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export interface Middleware<Context, CTXMap extends Record<string, ContextMap.Any>> {
|
|
9
|
+
export interface Middleware<Context, CTXMap extends Record<string, RPCContetMap.Any>> {
|
|
178
10
|
contextMap: CTXMap
|
|
179
11
|
context: Context
|
|
180
12
|
execute: <
|
|
@@ -198,7 +30,7 @@ export interface Middleware<Context, CTXMap extends Record<string, ContextMap.An
|
|
|
198
30
|
>
|
|
199
31
|
}
|
|
200
32
|
|
|
201
|
-
export const makeRpc = <Context, CTXMap extends Record<string,
|
|
33
|
+
export const makeRpc = <Context, CTXMap extends Record<string, RPCContetMap.Any>>(
|
|
202
34
|
middleware: Middleware<Context, CTXMap>
|
|
203
35
|
) => {
|
|
204
36
|
return {
|
package/src/api/routing.ts
CHANGED
|
@@ -12,10 +12,11 @@ import type * as HttpApp from "@effect/platform/HttpApp"
|
|
|
12
12
|
import type { Rpc } from "@effect/rpc"
|
|
13
13
|
import { RpcRouter } from "@effect/rpc"
|
|
14
14
|
import type { S } from "effect-app"
|
|
15
|
-
import { Effect, Predicate } from "effect-app"
|
|
15
|
+
import { Chunk, Context, Effect, FiberRef, Predicate, Stream } from "effect-app"
|
|
16
|
+
import type { GetEffectContext, RPCContetMap } from "effect-app/client/req"
|
|
16
17
|
import type { HttpServerError } from "effect-app/http"
|
|
17
18
|
import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect-app/http"
|
|
18
|
-
import type {
|
|
19
|
+
import type { Middleware } from "./routing/DynamicMiddleware.js"
|
|
19
20
|
import { makeRpc } from "./routing/DynamicMiddleware.js"
|
|
20
21
|
|
|
21
22
|
export type _R<T extends Effect<any, any, any>> = [T] extends [
|
|
@@ -38,18 +39,28 @@ export type EffectDeps<A> = {
|
|
|
38
39
|
export const toHttpApp = <R extends RpcRouter.RpcRouter<any, any>>(self: R, options?: {
|
|
39
40
|
readonly spanPrefix?: string
|
|
40
41
|
}): HttpApp.Default<
|
|
41
|
-
HttpServerError.RequestError
|
|
42
|
+
HttpServerError.RequestError,
|
|
42
43
|
RpcRouter.RpcRouter.Context<R>
|
|
43
44
|
> => {
|
|
44
|
-
const handler = RpcRouter.
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
Effect.
|
|
49
|
-
|
|
45
|
+
const handler = RpcRouter.toHandler(self, options)
|
|
46
|
+
return Effect.withFiberRuntime((fiber) => {
|
|
47
|
+
const context = fiber.getFiberRef(FiberRef.currentContext)
|
|
48
|
+
const request = Context.unsafeGet(context, HttpServerRequest.HttpServerRequest)
|
|
49
|
+
return Effect.flatMap(
|
|
50
|
+
request.json,
|
|
51
|
+
(_) =>
|
|
52
|
+
handler(_).pipe(
|
|
53
|
+
Stream.provideContext(context),
|
|
54
|
+
Stream.runCollect,
|
|
55
|
+
Effect.map((_) => Chunk.toReadonlyArray(_)),
|
|
56
|
+
Effect.andThen((_) => HttpServerResponse.json(_)),
|
|
57
|
+
Effect.orDie
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
})
|
|
50
61
|
}
|
|
51
62
|
|
|
52
|
-
type GetRouteContext<CTXMap extends Record<string,
|
|
63
|
+
type GetRouteContext<CTXMap extends Record<string, RPCContetMap.Any>, T> =
|
|
53
64
|
// & CTX
|
|
54
65
|
// inverted
|
|
55
66
|
& {
|
|
@@ -135,7 +146,7 @@ type Filter<T> = {
|
|
|
135
146
|
[K in keyof T as T[K] extends S.Schema.All & { success: S.Schema.Any; failure: S.Schema.Any } ? K : never]: T[K]
|
|
136
147
|
}
|
|
137
148
|
|
|
138
|
-
interface ExtendedMiddleware<Context, CTXMap extends Record<string,
|
|
149
|
+
interface ExtendedMiddleware<Context, CTXMap extends Record<string, RPCContetMap.Any>>
|
|
139
150
|
extends Middleware<Context, CTXMap>
|
|
140
151
|
{
|
|
141
152
|
// TODO
|
|
@@ -146,7 +157,7 @@ interface ExtendedMiddleware<Context, CTXMap extends Record<string, ContextMap.A
|
|
|
146
157
|
>
|
|
147
158
|
}
|
|
148
159
|
|
|
149
|
-
export const makeRouter = <Context, CTXMap extends Record<string,
|
|
160
|
+
export const makeRouter = <Context, CTXMap extends Record<string, RPCContetMap.Any>>(
|
|
150
161
|
middleware: ExtendedMiddleware<Context, CTXMap>
|
|
151
162
|
) => {
|
|
152
163
|
const rpc = makeRpc(middleware)
|