@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.
Files changed (54) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/Emailer/service.d.ts +1 -1
  3. package/dist/MainFiberSet.d.ts +1 -1
  4. package/dist/Operations.d.ts +1 -1
  5. package/dist/RequestFiberSet.d.ts +1 -1
  6. package/dist/Store/service.d.ts +2 -2
  7. package/dist/adapters/SQL/Model.d.ts +6 -6
  8. package/dist/adapters/ServiceBus.d.ts +2 -2
  9. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  10. package/dist/adapters/ServiceBus.js +13 -10
  11. package/dist/adapters/memQueue.d.ts +1 -1
  12. package/dist/api/routing/middleware/RouterMiddleware.d.ts +6 -6
  13. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  14. package/dist/api/routing/middleware/RpcMiddleware.d.ts +4 -15
  15. package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +1 -1
  16. package/dist/api/routing/middleware/RpcMiddleware.js +3 -4
  17. package/dist/api/routing/middleware/RpcMiddlewareX.d.ts +18 -0
  18. package/dist/api/routing/middleware/RpcMiddlewareX.d.ts.map +1 -0
  19. package/dist/api/routing/middleware/RpcMiddlewareX.js +16 -0
  20. package/dist/api/routing/middleware/generic-middleware.d.ts +22 -8
  21. package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
  22. package/dist/api/routing/middleware/generic-middleware.js +59 -62
  23. package/dist/api/routing/middleware/middleware-api.d.ts +51 -32
  24. package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
  25. package/dist/api/routing/middleware/middleware-api.js +54 -24
  26. package/dist/api/routing/middleware/middleware-native.d.ts +23 -0
  27. package/dist/api/routing/middleware/middleware-native.d.ts.map +1 -0
  28. package/dist/api/routing/middleware/middleware-native.js +19 -0
  29. package/dist/api/routing/middleware/middleware.d.ts +7 -27
  30. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  31. package/dist/api/routing/middleware/middleware.js +73 -88
  32. package/dist/api/routing/middleware.d.ts +1 -0
  33. package/dist/api/routing/middleware.d.ts.map +1 -1
  34. package/dist/api/routing/middleware.js +2 -1
  35. package/package.json +11 -3
  36. package/src/adapters/ServiceBus.ts +7 -5
  37. package/src/api/routing/middleware/RouterMiddleware.ts +9 -8
  38. package/src/api/routing/middleware/RpcMiddleware.ts +4 -51
  39. package/src/api/routing/middleware/RpcMiddlewareX.ts +70 -0
  40. package/src/api/routing/middleware/generic-middleware.ts +142 -107
  41. package/src/api/routing/middleware/middleware-api.ts +239 -61
  42. package/src/api/routing/middleware/middleware-native.ts +23 -0
  43. package/src/api/routing/middleware/middleware.ts +37 -40
  44. package/src/api/routing/middleware.ts +1 -0
  45. package/test/controller.test.ts +39 -14
  46. package/test/dist/controller.test.d.ts.map +1 -1
  47. package/test/dist/fixtures.d.ts +48 -32
  48. package/test/dist/fixtures.d.ts.map +1 -1
  49. package/test/dist/fixtures.js +76 -47
  50. package/test/dist/requires.test.d.ts.map +1 -1
  51. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -0
  52. package/test/fixtures.ts +70 -16
  53. package/test/requires.test.ts +15 -50
  54. package/test/rpc-multi-middleware.test.ts +134 -0
@@ -1,98 +1,83 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
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 { Tag } from "./RpcMiddleware.js";
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 class DevMode extends Context.Reference()("DevMode", { defaultValue: () => false }) {
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 class ConfigureInterruptibilityMiddleware extends Tag()("ConfigureInterruptibilityMiddleware", { wrap: true })({
20
- effect: Effect.gen(function* () {
21
- const cache = new Map();
22
- const getCached = (key, schema) => {
23
- const existing = cache.get(key);
24
- if (existing)
25
- return existing;
26
- const n = determineMethod(key, schema);
27
- cache.set(key, n);
28
- return n;
29
- };
30
- return ({ next, rpc }) => {
31
- const method = getCached(rpc._tag, rpc.payloadSchema);
32
- next = isCommand(method)
33
- ? Effect.retry(Effect.uninterruptible(next), optimisticConcurrencySchedule)
34
- : Effect.interruptible(next);
35
- return next;
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
- export class LoggerMiddleware extends Tag()("LoggerMiddleware", { wrap: true })({
41
- effect: Effect.gen(function* () {
42
- const devMode = yield* DevMode;
43
- return ({ headers, next, payload, rpc }) => Effect
44
- .annotateCurrentSpan({
45
- "request.name": rpc._tag,
46
- "requestInput": typeof payload === "object" && payload !== null
47
- ? Object.entries(payload).reduce((prev, [key, value]) => {
48
- prev[key] = key === "password"
49
- ? "<redacted>"
50
- : typeof value === "string" || typeof value === "number" || typeof value === "boolean"
51
- ? typeof value === "string" && value.length > 256
52
- ? (value.substring(0, 253) + "...")
53
- : value
54
- : Array.isArray(value)
55
- ? `Array[${value.length}]`
56
- : value === null || value === undefined
57
- ? `${value}`
58
- : typeof value === "object" && value
59
- ? `Object[${Object.keys(value).length}]`
60
- : typeof value;
61
- return prev;
62
- }, {})
63
- : payload
64
- })
65
- .pipe(
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBZSxNQUFNLFFBQVEsQ0FBQTtBQUNwRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHdCQUF3QixDQUFBO0FBRTFELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMzQyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUVqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FDOUMsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNwRSxFQUNELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFDN0IsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUMvQixDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdB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
@@ -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;AAG7C,OAAO,KAAK,UAAU,MAAM,iBAAiB,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSxjQUFjLG9DQUFvQyxDQUFBO0FBQ2xELGNBQWMsZ0NBQWdDLENBQUE7QUFDOUMsY0FBYyw0QkFBNEIsQ0FBQTtBQUMxQyxjQUFjLGtDQUFrQyxDQUFBO0FBQ2hELGNBQWMsK0JBQStCLENBQUE7QUFDN0MsY0FBYztBQUVkLE9BQU8sS0FBSyxVQUFVLE1BQU0saUJBQWlCLENBQUEifQ==
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": "2.94.0",
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": "2.56.0"
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": "^5.8.3",
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
- Effect.promise(() => subscription.close()).pipe(
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
- ContextProviderR // what the context provider requires
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
- requires: [Context.Tag<ContextProviderR, ContextProviderR>] // ContextProviderE extends never ? never : [Context.Tag<ContextProviderR, ContextProviderR>] // TODO: Tag<A>, Tag<B>
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, Layer, type NonEmptyReadonlyArray, type Option, type S, type Schema, type Scope, Unify } from "effect-app"
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