@effect-app/infra 2.94.0 → 3.0.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 +11 -0
- package/dist/Emailer/service.d.ts +1 -1
- package/dist/MainFiberSet.d.ts +1 -1
- package/dist/Operations.d.ts +1 -1
- package/dist/RequestFiberSet.d.ts +1 -1
- package/dist/Store/service.d.ts +2 -2
- package/dist/adapters/SQL/Model.d.ts +6 -6
- package/dist/adapters/ServiceBus.d.ts +2 -2
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +13 -10
- package/dist/adapters/memQueue.d.ts +1 -1
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +6 -6
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/RpcMiddleware.d.ts +4 -15
- package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/RpcMiddleware.js +3 -4
- package/dist/api/routing/middleware/RpcMiddlewareX.d.ts +18 -0
- package/dist/api/routing/middleware/RpcMiddlewareX.d.ts.map +1 -0
- package/dist/api/routing/middleware/RpcMiddlewareX.js +16 -0
- package/dist/api/routing/middleware/generic-middleware.d.ts +22 -8
- package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/generic-middleware.js +59 -62
- package/dist/api/routing/middleware/middleware-api.d.ts +51 -32
- package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware-api.js +54 -24
- package/dist/api/routing/middleware/middleware-native.d.ts +23 -0
- package/dist/api/routing/middleware/middleware-native.d.ts.map +1 -0
- package/dist/api/routing/middleware/middleware-native.js +19 -0
- package/dist/api/routing/middleware/middleware.d.ts +7 -27
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +73 -88
- package/dist/api/routing/middleware.d.ts +1 -0
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +2 -1
- package/package.json +11 -3
- package/src/adapters/ServiceBus.ts +7 -5
- package/src/api/routing/middleware/RouterMiddleware.ts +9 -8
- package/src/api/routing/middleware/RpcMiddleware.ts +4 -51
- package/src/api/routing/middleware/RpcMiddlewareX.ts +70 -0
- package/src/api/routing/middleware/generic-middleware.ts +142 -107
- package/src/api/routing/middleware/middleware-api.ts +239 -61
- package/src/api/routing/middleware/middleware-native.ts +23 -0
- package/src/api/routing/middleware/middleware.ts +37 -40
- package/src/api/routing/middleware.ts +1 -0
- package/test/controller.test.ts +39 -14
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +48 -32
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +76 -47
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -0
- package/test/fixtures.ts +70 -16
- package/test/requires.test.ts +15 -50
- package/test/rpc-multi-middleware.test.ts +134 -0
|
@@ -1,98 +1,83 @@
|
|
|
1
|
-
|
|
2
|
-
import { Cause, Context, Duration, Effect, Layer, ParseResult, Request, Schedule } from "effect-app";
|
|
1
|
+
import { Cause, Duration, Effect, Layer, ParseResult, Request, Schedule } from "effect";
|
|
3
2
|
import { pretty } from "effect-app/utils";
|
|
4
3
|
import { logError, reportError } from "../../../errorReporter.js";
|
|
5
4
|
import { InfraLogger } from "../../../logger.js";
|
|
6
5
|
import { determineMethod, isCommand } from "../utils.js";
|
|
7
|
-
import
|
|
6
|
+
import * as MiddlewareNative from "./middleware-native.js";
|
|
8
7
|
const logRequestError = logError("Request");
|
|
9
8
|
const reportRequestError = reportError("Request");
|
|
9
|
+
export { DevMode } from "./middleware-native.js";
|
|
10
10
|
export const RequestCacheLayers = Layer.mergeAll(Layer.setRequestCache(Request.makeCache({ capacity: 500, timeToLive: Duration.hours(8) })), Layer.setRequestCaching(true), Layer.setRequestBatching(true));
|
|
11
|
-
export
|
|
12
|
-
}
|
|
13
|
-
export class RequestCacheMiddleware extends Tag()("RequestCacheMiddleware", { wrap: true })({
|
|
14
|
-
effect: Effect.succeed(({ next }) => next.pipe(Effect.provide(RequestCacheLayers)))
|
|
15
|
-
}) {
|
|
16
|
-
}
|
|
11
|
+
export const RequestCacheMiddlewareLive = Layer.succeed(MiddlewareNative.RequestCacheMiddleware, ({ next }) => next.pipe(Effect.provide(RequestCacheLayers)));
|
|
17
12
|
// retry just once on optimistic concurrency exceptions
|
|
18
13
|
const optimisticConcurrencySchedule = Schedule.once.pipe(Schedule.intersect(Schedule.recurWhile((a) => a?._tag === "OptimisticConcurrencyException")));
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
14
|
+
export const ConfigureInterruptibilityMiddlewareLive = Layer.effect(MiddlewareNative.ConfigureInterruptibilityMiddleware, Effect.gen(function* () {
|
|
15
|
+
const cache = new Map();
|
|
16
|
+
const getCached = (key, schema) => {
|
|
17
|
+
const existing = cache.get(key);
|
|
18
|
+
if (existing)
|
|
19
|
+
return existing;
|
|
20
|
+
const n = determineMethod(key, schema);
|
|
21
|
+
cache.set(key, n);
|
|
22
|
+
return n;
|
|
23
|
+
};
|
|
24
|
+
return ({ next, rpc }) => {
|
|
25
|
+
const method = getCached(rpc._tag, rpc.payloadSchema);
|
|
26
|
+
next = isCommand(method)
|
|
27
|
+
? Effect.retry(Effect.uninterruptible(next), optimisticConcurrencySchedule)
|
|
28
|
+
: Effect.interruptible(next);
|
|
29
|
+
return next;
|
|
30
|
+
};
|
|
31
|
+
}));
|
|
32
|
+
export const LoggerMiddlewareLive = Layer.effect(MiddlewareNative.LoggerMiddleware, Effect.gen(function* () {
|
|
33
|
+
const devMode = yield* MiddlewareNative.DevMode;
|
|
34
|
+
return ({ headers, next, payload, rpc }) => Effect
|
|
35
|
+
.annotateCurrentSpan({
|
|
36
|
+
"request.name": rpc._tag,
|
|
37
|
+
"requestInput": typeof payload === "object" && payload !== null
|
|
38
|
+
? Object.entries(payload).reduce((prev, [key, value]) => {
|
|
39
|
+
prev[key] = key === "password"
|
|
40
|
+
? "<redacted>"
|
|
41
|
+
: typeof value === "string" || typeof value === "number" || typeof value === "boolean"
|
|
42
|
+
? typeof value === "string" && value.length > 256
|
|
43
|
+
? (value.substring(0, 253) + "...")
|
|
44
|
+
: value
|
|
45
|
+
: Array.isArray(value)
|
|
46
|
+
? `Array[${value.length}]`
|
|
47
|
+
: value === null || value === undefined
|
|
48
|
+
? `${value}`
|
|
49
|
+
: typeof value === "object" && value
|
|
50
|
+
? `Object[${Object.keys(value).length}]`
|
|
51
|
+
: typeof value;
|
|
52
|
+
return prev;
|
|
53
|
+
}, {})
|
|
54
|
+
: payload
|
|
37
55
|
})
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
// can't use andThen due to some being a function and effect
|
|
67
|
-
Effect.zipRight(next),
|
|
68
|
-
// TODO: support ParseResult if the error channel of the request allows it.. but who would want that?
|
|
69
|
-
Effect.catchAll((_) => ParseResult.isParseError(_) ? Effect.die(_) : Effect.fail(_)), Effect.tapErrorCause((cause) => Cause.isFailure(cause) ? logRequestError(cause) : Effect.void), Effect.tapDefect((cause) => Effect
|
|
70
|
-
.all([
|
|
71
|
-
reportRequestError(cause, {
|
|
72
|
-
action: rpc._tag
|
|
73
|
-
}),
|
|
74
|
-
InfraLogger
|
|
75
|
-
.logError("Finished request", cause)
|
|
76
|
-
.pipe(Effect.annotateLogs({
|
|
77
|
-
action: rpc._tag,
|
|
78
|
-
req: pretty(payload),
|
|
79
|
-
headers: pretty(headers)
|
|
80
|
-
// resHeaders: pretty(
|
|
81
|
-
// Object
|
|
82
|
-
// .entries(headers)
|
|
83
|
-
// .reduce((prev, [key, value]) => {
|
|
84
|
-
// prev[key] = value && typeof value === "string" ? snipString(value) : value
|
|
85
|
-
// return prev
|
|
86
|
-
// }, {} as Record<string, any>)
|
|
87
|
-
// )
|
|
88
|
-
}))
|
|
89
|
-
])), devMode ? (_) => _ : Effect.catchAllDefect(() => Effect.die("Internal Server Error")));
|
|
90
|
-
})
|
|
91
|
-
}) {
|
|
92
|
-
}
|
|
93
|
-
export const DefaultGenericMiddlewares = [
|
|
94
|
-
RequestCacheMiddleware,
|
|
95
|
-
ConfigureInterruptibilityMiddleware,
|
|
96
|
-
LoggerMiddleware
|
|
97
|
-
];
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFlLE1BQU0sWUFBWSxDQUFBO0FBQ2pILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFeEMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBRWpELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxRQUFRLENBQzlDLEtBQUssQ0FBQyxlQUFlLENBQ25CLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDcEUsRUFDRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQzdCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FDL0IsQ0FBQTtBQUVELE1BQU0sT0FBTyxPQUFRLFNBQVEsT0FBTyxDQUFDLFNBQVMsRUFBVyxD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
|
|
56
|
+
.pipe(
|
|
57
|
+
// can't use andThen due to some being a function and effect
|
|
58
|
+
Effect.zipRight(next),
|
|
59
|
+
// TODO: support ParseResult if the error channel of the request allows it.. but who would want that?
|
|
60
|
+
Effect.catchAll((_) => ParseResult.isParseError(_) ? Effect.die(_) : Effect.fail(_)), Effect.tapErrorCause((cause) => Cause.isFailure(cause) ? logRequestError(cause) : Effect.void), Effect.tapDefect((cause) => Effect
|
|
61
|
+
.all([
|
|
62
|
+
reportRequestError(cause, {
|
|
63
|
+
action: rpc._tag
|
|
64
|
+
}),
|
|
65
|
+
InfraLogger
|
|
66
|
+
.logError("Finished request", cause)
|
|
67
|
+
.pipe(Effect.annotateLogs({
|
|
68
|
+
action: rpc._tag,
|
|
69
|
+
req: pretty(payload),
|
|
70
|
+
headers: pretty(headers)
|
|
71
|
+
// resHeaders: pretty(
|
|
72
|
+
// Object
|
|
73
|
+
// .entries(headers)
|
|
74
|
+
// .reduce((prev, [key, value]) => {
|
|
75
|
+
// prev[key] = value && typeof value === "string" ? snipString(value) : value
|
|
76
|
+
// return prev
|
|
77
|
+
// }, {} as Record<string, any>)
|
|
78
|
+
// )
|
|
79
|
+
}))
|
|
80
|
+
])), devMode ? (_) => _ : Effect.catchAllDefect(() => Effect.die("Internal Server Error")));
|
|
81
|
+
}));
|
|
82
|
+
export const DefaultGenericMiddlewaresLive = Layer.mergeAll(RequestCacheMiddlewareLive, ConfigureInterruptibilityMiddlewareLive, LoggerMiddlewareLive);
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBZSxNQUFNLFFBQVEsQ0FBQTtBQUNwRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHdCQUF3QixDQUFBO0FBRTFELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMzQyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUVqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FDOUMsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNwRSxFQUNELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFDN0IsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUMvQixDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FDckQsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQ3ZDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FDNUQsQ0FBQTtBQUVELHVEQUF1RDtBQUN2RCxNQUFNLDZCQUE2QixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN0RCxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssZ0NBQWdDLENBQUMsQ0FBQyxDQUNsRyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDakUsZ0JBQWdCLENBQUMsbUNBQW1DLEVBQ3BELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDdkIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFXLEVBQUUsTUFBeUIsRUFBRSxFQUFFO1FBQzNELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUE7UUFDN0IsTUFBTSxDQUFDLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNqQixPQUFPLENBQUMsQ0FBQTtJQUNWLENBQUMsQ0FBQTtJQUNELE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVyRCxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLDZCQUE2QixDQUFDO1lBQzNFLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTlCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQzlDLGdCQUFnQixDQUFDLGdCQUFnQixFQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUE7SUFDL0MsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUN6QyxNQUFNO1NBQ0gsbUJBQW1CLENBQUM7UUFDbkIsY0FBYyxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ3hCLGNBQWMsRUFBRSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLElBQUk7WUFDN0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBb0IsRUFBRSxFQUFFO2dCQUN6RSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLFVBQVU7b0JBQzVCLENBQUMsQ0FBQyxZQUFZO29CQUNkLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7d0JBQ3RGLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHOzRCQUMvQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ25DLENBQUMsQ0FBQyxLQUFLO3dCQUNULENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzs0QkFDdEIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRzs0QkFDMUIsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVM7Z0NBQ3ZDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRTtnQ0FDWixDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUs7b0NBQ3BDLENBQUMsQ0FBQyxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHO29DQUN4QyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUE7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFBO1lBQ2IsQ0FBQyxFQUFFLEVBQStDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLE9BQU87S0FDWixDQUFDO1NBQ0QsSUFBSTtJQUNILDREQUE0RDtJQUM1RCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNyQixxR0FBcUc7SUFDckcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwRixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDOUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3pCLE1BQU07U0FDSCxHQUFHLENBQUM7UUFDSCxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7WUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1NBQ2pCLENBQUM7UUFDRixXQUFXO2FBQ1IsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQzthQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDaEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDcEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDeEIsc0JBQXNCO1lBQ3RCLFdBQVc7WUFDWCx3QkFBd0I7WUFDeEIsd0NBQXdDO1lBQ3hDLG1GQUFtRjtZQUNuRixvQkFBb0I7WUFDcEIsb0NBQW9DO1lBQ3BDLElBQUk7U0FDTCxDQUFDLENBQUM7S0FDTixDQUFDLENBQ0wsRUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQ3RGLENBQUE7QUFDUCxDQUFDLENBQUMsQ0FDSCxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FDekQsMEJBQTBCLEVBQzFCLHVDQUF1QyxFQUN2QyxvQkFBb0IsQ0FDckIsQ0FBQSJ9
|
|
@@ -3,5 +3,6 @@ export * from "./middleware/middleware-api.js";
|
|
|
3
3
|
export * from "./middleware/middleware.js";
|
|
4
4
|
export * from "./middleware/RouterMiddleware.js";
|
|
5
5
|
export * from "./middleware/RpcMiddleware.js";
|
|
6
|
+
export * from "./middleware/RpcMiddlewareX.js";
|
|
6
7
|
export * as Middleware from "./middleware.js";
|
|
7
8
|
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/middleware.ts"],"names":[],"mappings":"AACA,cAAc,oCAAoC,CAAA;AAClD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing/middleware.ts"],"names":[],"mappings":"AACA,cAAc,oCAAoC,CAAA;AAClD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAG9C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA"}
|
|
@@ -4,6 +4,7 @@ export * from "./middleware/middleware-api.js";
|
|
|
4
4
|
export * from "./middleware/middleware.js";
|
|
5
5
|
export * from "./middleware/RouterMiddleware.js";
|
|
6
6
|
export * from "./middleware/RpcMiddleware.js";
|
|
7
|
+
export * from "./middleware/RpcMiddlewareX.js";
|
|
7
8
|
// codegen:end
|
|
8
9
|
export * as Middleware from "./middleware.js";
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSxjQUFjLG9DQUFvQyxDQUFBO0FBQ2xELGNBQWMsZ0NBQWdDLENBQUE7QUFDOUMsY0FBYyw0QkFBNEIsQ0FBQTtBQUMxQyxjQUFjLGtDQUFrQyxDQUFBO0FBQ2hELGNBQWMsK0JBQStCLENBQUE7QUFDN0MsY0FBYyxnQ0FBZ0MsQ0FBQTtBQUM5QyxjQUFjO0FBRWQsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "7.0.1",
|
|
15
15
|
"query-string": "^9.2.2",
|
|
16
|
-
"effect-app": "
|
|
16
|
+
"effect-app": "3.0.0"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.5.0",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"redis": "^3.1.2",
|
|
33
33
|
"redlock": "^4.2.0",
|
|
34
34
|
"strip-ansi": "^7.1.0",
|
|
35
|
-
"typescript": "
|
|
35
|
+
"typescript": "~5.8.3",
|
|
36
36
|
"vitest": "^3.2.4"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
@@ -313,6 +313,10 @@
|
|
|
313
313
|
"types": "./dist/api/routing/middleware/RpcMiddleware.d.ts",
|
|
314
314
|
"default": "./dist/api/routing/middleware/RpcMiddleware.js"
|
|
315
315
|
},
|
|
316
|
+
"./api/routing/middleware/RpcMiddlewareX": {
|
|
317
|
+
"types": "./dist/api/routing/middleware/RpcMiddlewareX.d.ts",
|
|
318
|
+
"default": "./dist/api/routing/middleware/RpcMiddlewareX.js"
|
|
319
|
+
},
|
|
316
320
|
"./api/routing/middleware/generic-middleware": {
|
|
317
321
|
"types": "./dist/api/routing/middleware/generic-middleware.d.ts",
|
|
318
322
|
"default": "./dist/api/routing/middleware/generic-middleware.js"
|
|
@@ -325,6 +329,10 @@
|
|
|
325
329
|
"types": "./dist/api/routing/middleware/middleware-api.d.ts",
|
|
326
330
|
"default": "./dist/api/routing/middleware/middleware-api.js"
|
|
327
331
|
},
|
|
332
|
+
"./api/routing/middleware/middleware-native": {
|
|
333
|
+
"types": "./dist/api/routing/middleware/middleware-native.d.ts",
|
|
334
|
+
"default": "./dist/api/routing/middleware/middleware-native.js"
|
|
335
|
+
},
|
|
328
336
|
"./api/routing/schema/jwt": {
|
|
329
337
|
"types": "./dist/api/routing/schema/jwt.d.ts",
|
|
330
338
|
"default": "./dist/api/routing/schema/jwt.js"
|
|
@@ -134,10 +134,11 @@ const makeReceiver = (name: string) =>
|
|
|
134
134
|
}
|
|
135
135
|
})
|
|
136
136
|
)
|
|
137
|
+
|
|
137
138
|
yield* Effect.acquireRelease(
|
|
138
139
|
Effect
|
|
139
|
-
.sync(() =>
|
|
140
|
-
r
|
|
140
|
+
.sync(() => {
|
|
141
|
+
const s = r
|
|
141
142
|
.subscribe({
|
|
142
143
|
processError: (err) =>
|
|
143
144
|
runEffect(
|
|
@@ -150,13 +151,14 @@ const makeReceiver = (name: string) =>
|
|
|
150
151
|
processMessage: (msg) => runEffect(hndlr.processMessage(msg))
|
|
151
152
|
// DO NOT CATCH ERRORS here as they should return to the queue!
|
|
152
153
|
})
|
|
153
|
-
|
|
154
|
+
return { close: Effect.promise(() => s.close()) }
|
|
155
|
+
})
|
|
154
156
|
.pipe(withSpanAndLog(`ServiceBus.subscription.create ${sessionId}`)),
|
|
155
157
|
(subscription) =>
|
|
156
|
-
|
|
158
|
+
subscription.close.pipe(
|
|
157
159
|
withSpanAndLog(`ServiceBus.subscription.close ${sessionId}`)
|
|
158
160
|
)
|
|
159
|
-
)
|
|
161
|
+
) as Effect<void, never, Scope> // wth is going on here
|
|
160
162
|
})
|
|
161
163
|
}
|
|
162
164
|
})
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
import { type RpcMiddleware } from "@effect/rpc"
|
|
4
5
|
import { type Context, type Layer } from "effect-app"
|
|
5
6
|
import type { GetContextConfig, RPCContextMap } from "effect-app/client/req"
|
|
6
7
|
import { type MiddlewareMakerId } from "./middleware-api.js"
|
|
7
|
-
import { type TagClass } from "./RpcMiddleware.js"
|
|
8
|
-
|
|
9
8
|
// module:
|
|
10
9
|
//
|
|
11
10
|
|
|
@@ -15,19 +14,21 @@ export type RouterMiddleware<
|
|
|
15
14
|
MakeMiddlewareR, // what the middlware requires to be constructed
|
|
16
15
|
ContextProviderA, // what the context provider provides
|
|
17
16
|
ContextProviderE, // what the context provider may fail with
|
|
18
|
-
|
|
17
|
+
_ContextProviderR // what the context provider requires
|
|
19
18
|
> =
|
|
20
|
-
& TagClass<
|
|
19
|
+
& RpcMiddleware.TagClass<
|
|
21
20
|
MiddlewareMakerId,
|
|
22
21
|
"MiddlewareMaker",
|
|
23
22
|
{
|
|
24
23
|
wrap: true
|
|
25
|
-
provides: [Context.Tag<ContextProviderA, ContextProviderA>] // ContextProviderA extends never ? never : [Context.Tag<ContextProviderA, ContextProviderA>] // TODO: Tag<A>, Tag<B>
|
|
26
|
-
|
|
24
|
+
// provides: [Context.Tag<ContextProviderA, ContextProviderA>] // ContextProviderA extends never ? never : [Context.Tag<ContextProviderA, ContextProviderA>] // TODO: Tag<A>, Tag<B>
|
|
25
|
+
provides: Context.Tag<ContextProviderA, ContextProviderA>
|
|
26
|
+
// requires: [Context.Tag<ContextProviderR, ContextProviderR>] // ContextProviderE extends never ? never : [Context.Tag<ContextProviderR, ContextProviderR>] // TODO: Tag<A>, Tag<B>
|
|
27
27
|
failure: ContextProviderE
|
|
28
28
|
}
|
|
29
29
|
>
|
|
30
30
|
& {
|
|
31
|
-
Default: Layer.Layer<MiddlewareMakerId, MakeMiddlewareE, MakeMiddlewareR>
|
|
32
|
-
requestContext: Context.Tag<"RequestContextConfig", GetContextConfig<RequestContextMap>>
|
|
31
|
+
readonly Default: Layer.Layer<MiddlewareMakerId, MakeMiddlewareE, MakeMiddlewareR>
|
|
32
|
+
readonly requestContext: Context.Tag<"RequestContextConfig", GetContextConfig<RequestContextMap>>
|
|
33
|
+
readonly requestContextMap: RequestContextMap
|
|
33
34
|
}
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
4
|
import { type Rpc, RpcMiddleware } from "@effect/rpc"
|
|
5
5
|
import { type SuccessValue, type TypeId } from "@effect/rpc/RpcMiddleware"
|
|
6
|
-
import { type Context, type Effect,
|
|
6
|
+
import { type Context, type Effect, type NonEmptyReadonlyArray, type Option, type S, type Schema, type Scope, Unify } from "effect-app"
|
|
7
7
|
import type { AnyService, ContextTagArray, RPCContextMap } from "effect-app/client/req"
|
|
8
8
|
import { type HttpHeaders } from "effect-app/http"
|
|
9
9
|
import { type TagUnify, type TagUnifyIgnore } from "effect/Context"
|
|
10
|
-
import { type Service } from "effect/Effect"
|
|
11
10
|
|
|
12
11
|
// updated to support Scope.Scope and Requires
|
|
13
12
|
export interface RpcMiddleware<Provides, E, Requires> {
|
|
@@ -28,7 +27,7 @@ export interface RpcMiddlewareWrap<Provides, E, Requires> {
|
|
|
28
27
|
}): Effect.Effect<SuccessValue, E, Scope.Scope | Requires>
|
|
29
28
|
}
|
|
30
29
|
|
|
31
|
-
type RpcOptionsOriginal = {
|
|
30
|
+
export type RpcOptionsOriginal = {
|
|
32
31
|
readonly wrap?: boolean
|
|
33
32
|
readonly optional?: boolean
|
|
34
33
|
readonly failure?: Schema.Schema.All
|
|
@@ -47,7 +46,7 @@ export type DependsOn = {
|
|
|
47
46
|
readonly dependsOn: NonEmptyReadonlyArray<AnyDynamic> | undefined
|
|
48
47
|
}
|
|
49
48
|
|
|
50
|
-
interface RpcOptionsDynamic<Key extends string, A extends RPCContextMap.Any> extends RpcOptionsOriginal {
|
|
49
|
+
export interface RpcOptionsDynamic<Key extends string, A extends RPCContextMap.Any> extends RpcOptionsOriginal {
|
|
51
50
|
readonly dynamic: RpcDynamic<Key, A>
|
|
52
51
|
readonly dependsOn?: NonEmptyReadonlyArray<AnyDynamic> | undefined
|
|
53
52
|
}
|
|
@@ -245,56 +244,10 @@ export const Tag = <Self>() =>
|
|
|
245
244
|
>(
|
|
246
245
|
id: Name,
|
|
247
246
|
options?: Options | undefined
|
|
248
|
-
) =>
|
|
249
|
-
<
|
|
250
|
-
LayerOpts extends {
|
|
251
|
-
effect: Effect.Effect<
|
|
252
|
-
Options extends RpcOptionsDynamic<any, any> ? TagClass.Wrap<Options> extends true ? RpcMiddlewareDynamicWrap<
|
|
253
|
-
TagClass.FailureService<Options>,
|
|
254
|
-
TagClass.Requires<Options>,
|
|
255
|
-
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
256
|
-
>
|
|
257
|
-
: RpcMiddlewareDynamicNormal<
|
|
258
|
-
TagClass.Service<Options>,
|
|
259
|
-
TagClass.FailureService<Options>,
|
|
260
|
-
TagClass.Requires<Options>,
|
|
261
|
-
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
262
|
-
>
|
|
263
|
-
: TagClass.Wrap<Options> extends true ? RpcMiddlewareWrap<
|
|
264
|
-
TagClass.Provides<Options>,
|
|
265
|
-
TagClass.Failure<Options>,
|
|
266
|
-
TagClass.Requires<Options>
|
|
267
|
-
>
|
|
268
|
-
: RpcMiddleware<
|
|
269
|
-
TagClass.Service<Options>,
|
|
270
|
-
TagClass.FailureService<Options>,
|
|
271
|
-
TagClass.Requires<Options>
|
|
272
|
-
>,
|
|
273
|
-
any,
|
|
274
|
-
any
|
|
275
|
-
>
|
|
276
|
-
// TODO: we really should only support NonEmtyReadonlyArray because ReadonlyArray fucks up once you have a Layer.empty in the list, as the whole thing resolves to never
|
|
277
|
-
dependencies?: NonEmptyReadonlyArray<Layer.Layer.Any> | ReadonlyArray<Layer.Layer.Any>
|
|
278
|
-
}
|
|
279
|
-
>(opts: LayerOpts): TagClass<Self, Name, Options> & {
|
|
280
|
-
Default: Layer.Layer<
|
|
281
|
-
Self,
|
|
282
|
-
| (LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _E
|
|
283
|
-
: never)
|
|
284
|
-
| Service.MakeDepsE<LayerOpts>,
|
|
285
|
-
| Exclude<
|
|
286
|
-
LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _R : never,
|
|
287
|
-
Service.MakeDepsOut<LayerOpts>
|
|
288
|
-
>
|
|
289
|
-
| Service.MakeDepsIn<LayerOpts>
|
|
290
|
-
>
|
|
291
|
-
} =>
|
|
247
|
+
): TagClass<Self, Name, Options> =>
|
|
292
248
|
class extends RpcMiddleware.Tag<Self>()(id, options as any) {
|
|
293
249
|
static readonly dynamic = options && "dynamic" in options ? options.dynamic : undefined
|
|
294
250
|
static readonly dependsOn = options && "dependsOn" in options ? options.dependsOn : undefined
|
|
295
|
-
static readonly Default = Layer.scoped(this, opts.effect as any).pipe(
|
|
296
|
-
Layer.provide([Layer.empty, ...opts.dependencies ?? []])
|
|
297
|
-
)
|
|
298
251
|
static override [Unify.typeSymbol]?: unknown
|
|
299
252
|
static override [Unify.unifySymbol]?: TagUnify<typeof this>
|
|
300
253
|
static override [Unify.ignoreSymbol]?: TagUnifyIgnore
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
import { type Effect, Layer, type NonEmptyReadonlyArray, Unify } from "effect-app"
|
|
5
|
+
import { type TagUnify, type TagUnifyIgnore } from "effect/Context"
|
|
6
|
+
import { type Service } from "effect/Effect"
|
|
7
|
+
import { type RpcMiddleware, type RpcMiddlewareDynamicNormal, type RpcMiddlewareDynamicWrap, type RpcMiddlewareWrap, type RpcOptionsDynamic, type RpcOptionsOriginal, Tag, type TagClass } from "./RpcMiddleware.js"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated - RPC groups are defined centrally and re-used between server and client,
|
|
11
|
+
* so layer implementation details should not be mixed.
|
|
12
|
+
*/
|
|
13
|
+
export const TagService = <Self>() =>
|
|
14
|
+
<
|
|
15
|
+
const Name extends string,
|
|
16
|
+
const Options extends RpcOptionsOriginal | RpcOptionsDynamic<any, any>
|
|
17
|
+
>(
|
|
18
|
+
id: Name,
|
|
19
|
+
options?: Options | undefined
|
|
20
|
+
) =>
|
|
21
|
+
<
|
|
22
|
+
LayerOpts extends {
|
|
23
|
+
effect: Effect.Effect<
|
|
24
|
+
Options extends RpcOptionsDynamic<any, any> ? TagClass.Wrap<Options> extends true ? RpcMiddlewareDynamicWrap<
|
|
25
|
+
TagClass.FailureService<Options>,
|
|
26
|
+
TagClass.Requires<Options>,
|
|
27
|
+
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
28
|
+
>
|
|
29
|
+
: RpcMiddlewareDynamicNormal<
|
|
30
|
+
TagClass.Service<Options>,
|
|
31
|
+
TagClass.FailureService<Options>,
|
|
32
|
+
TagClass.Requires<Options>,
|
|
33
|
+
{ [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] }
|
|
34
|
+
>
|
|
35
|
+
: TagClass.Wrap<Options> extends true ? RpcMiddlewareWrap<
|
|
36
|
+
TagClass.Provides<Options>,
|
|
37
|
+
TagClass.Failure<Options>,
|
|
38
|
+
TagClass.Requires<Options>
|
|
39
|
+
>
|
|
40
|
+
: RpcMiddleware<
|
|
41
|
+
TagClass.Service<Options>,
|
|
42
|
+
TagClass.FailureService<Options>,
|
|
43
|
+
TagClass.Requires<Options>
|
|
44
|
+
>,
|
|
45
|
+
any,
|
|
46
|
+
any
|
|
47
|
+
>
|
|
48
|
+
dependencies?: NonEmptyReadonlyArray<Layer.Layer.Any>
|
|
49
|
+
}
|
|
50
|
+
>(opts: LayerOpts): TagClass<Self, Name, Options> & {
|
|
51
|
+
Default: Layer.Layer<
|
|
52
|
+
Self,
|
|
53
|
+
| (LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _E
|
|
54
|
+
: never)
|
|
55
|
+
| Service.MakeDepsE<LayerOpts>,
|
|
56
|
+
| Exclude<
|
|
57
|
+
LayerOpts extends { effect: Effect<infer _A, infer _E, infer _R> } ? _R : never,
|
|
58
|
+
Service.MakeDepsOut<LayerOpts>
|
|
59
|
+
>
|
|
60
|
+
| Service.MakeDepsIn<LayerOpts>
|
|
61
|
+
>
|
|
62
|
+
} =>
|
|
63
|
+
class extends Tag<Self>()(id, options as any) {
|
|
64
|
+
static readonly Default = Layer.scoped(this, opts.effect as any).pipe(
|
|
65
|
+
Layer.provide([Layer.empty, ...opts.dependencies ?? []])
|
|
66
|
+
)
|
|
67
|
+
static override [Unify.typeSymbol]?: unknown
|
|
68
|
+
static override [Unify.unifySymbol]?: TagUnify<typeof this>
|
|
69
|
+
static override [Unify.ignoreSymbol]?: TagUnifyIgnore
|
|
70
|
+
} as any
|