@shivaedev/platform 0.5.2 → 0.6.1

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 (214) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +359 -106
  3. package/dist/errors/rejectedField.d.ts +7 -0
  4. package/dist/errors/rejectedField.d.ts.map +1 -0
  5. package/dist/errors/{rejected-field.js → rejectedField.js} +4 -2
  6. package/dist/errors/rejectedField.js.map +1 -0
  7. package/dist/errors/taxonomy.d.ts +10 -0
  8. package/dist/errors/taxonomy.d.ts.map +1 -1
  9. package/dist/errors/taxonomy.js +4 -0
  10. package/dist/errors/taxonomy.js.map +1 -1
  11. package/dist/rpc/identity.d.ts.map +1 -1
  12. package/dist/rpc/identity.js.map +1 -1
  13. package/dist/rpc/middleware.d.ts.map +1 -1
  14. package/dist/rpc/middleware.js.map +1 -1
  15. package/dist/server/appHost.d.ts +56 -0
  16. package/dist/server/appHost.d.ts.map +1 -0
  17. package/dist/server/appHost.js +55 -0
  18. package/dist/server/appHost.js.map +1 -0
  19. package/dist/server/better-auth/adapter.d.ts +10 -0
  20. package/dist/server/better-auth/adapter.d.ts.map +1 -0
  21. package/dist/{better-auth → server/better-auth}/adapter.js +26 -14
  22. package/dist/server/better-auth/adapter.js.map +1 -0
  23. package/dist/{better-auth → server/better-auth}/relation.d.ts +15 -15
  24. package/dist/server/better-auth/relation.d.ts.map +1 -0
  25. package/dist/{better-auth → server/better-auth}/relation.js +3 -3
  26. package/dist/server/better-auth/relation.js.map +1 -0
  27. package/dist/server/better-auth/rowAdapter.d.ts +8 -0
  28. package/dist/server/better-auth/rowAdapter.d.ts.map +1 -0
  29. package/dist/server/better-auth/rowAdapter.js +52 -0
  30. package/dist/server/better-auth/rowAdapter.js.map +1 -0
  31. package/dist/{better-auth → server/better-auth}/where.d.ts +2 -2
  32. package/dist/server/better-auth/where.d.ts.map +1 -0
  33. package/dist/{better-auth → server/better-auth}/where.js +23 -19
  34. package/dist/server/better-auth/where.js.map +1 -0
  35. package/dist/{node-http/subscription-signal.d.ts → server/node-http/subscriptionSignal.d.ts} +2 -2
  36. package/dist/server/node-http/subscriptionSignal.d.ts.map +1 -0
  37. package/dist/{node-http/subscription-signal.js → server/node-http/subscriptionSignal.js} +20 -13
  38. package/dist/server/node-http/subscriptionSignal.js.map +1 -0
  39. package/dist/server/rpc-server/adapters/betterAuthSessions.d.ts +4 -0
  40. package/dist/server/rpc-server/adapters/betterAuthSessions.d.ts.map +1 -0
  41. package/dist/server/rpc-server/adapters/betterAuthSessions.js +14 -0
  42. package/dist/server/rpc-server/adapters/betterAuthSessions.js.map +1 -0
  43. package/dist/server/rpc-server/boundary.d.ts +9 -0
  44. package/dist/server/rpc-server/boundary.d.ts.map +1 -0
  45. package/dist/server/rpc-server/boundary.js +18 -0
  46. package/dist/server/rpc-server/boundary.js.map +1 -0
  47. package/dist/server/rpc-server/local.d.ts +7 -0
  48. package/dist/server/rpc-server/local.d.ts.map +1 -0
  49. package/dist/server/rpc-server/local.js +66 -0
  50. package/dist/server/rpc-server/local.js.map +1 -0
  51. package/dist/{rpc-server → server/rpc-server}/origin.d.ts +2 -2
  52. package/dist/server/rpc-server/origin.d.ts.map +1 -0
  53. package/dist/server/rpc-server/origin.js +16 -0
  54. package/dist/server/rpc-server/origin.js.map +1 -0
  55. package/dist/server/rpc-server/redact.d.ts +3 -0
  56. package/dist/server/rpc-server/redact.d.ts.map +1 -0
  57. package/dist/{rpc-server → server/rpc-server}/redact.js +9 -7
  58. package/dist/server/rpc-server/redact.js.map +1 -0
  59. package/dist/server/rpc-server/redactCause.d.ts +6 -0
  60. package/dist/server/rpc-server/redactCause.d.ts.map +1 -0
  61. package/dist/server/rpc-server/redactCause.js +36 -0
  62. package/dist/server/rpc-server/redactCause.js.map +1 -0
  63. package/dist/server/rpc-server/sensitive.d.ts +5 -0
  64. package/dist/server/rpc-server/sensitive.d.ts.map +1 -0
  65. package/dist/{rpc-server → server/rpc-server}/sensitive.js +21 -17
  66. package/dist/server/rpc-server/sensitive.js.map +1 -0
  67. package/dist/server/rpc-server/session.d.ts +21 -0
  68. package/dist/server/rpc-server/session.d.ts.map +1 -0
  69. package/dist/server/rpc-server/session.js +37 -0
  70. package/dist/server/rpc-server/session.js.map +1 -0
  71. package/dist/{rpc-server → server/rpc-server}/tracing.d.ts +1 -1
  72. package/dist/server/rpc-server/tracing.d.ts.map +1 -0
  73. package/dist/server/rpc-server/tracing.js +42 -0
  74. package/dist/server/rpc-server/tracing.js.map +1 -0
  75. package/dist/server/rpc-server/transportHeaders.d.ts +4 -0
  76. package/dist/server/rpc-server/transportHeaders.d.ts.map +1 -0
  77. package/dist/server/rpc-server/transportHeaders.js +6 -0
  78. package/dist/server/rpc-server/transportHeaders.js.map +1 -0
  79. package/dist/server/runtime/makePlatform.d.ts +4 -0
  80. package/dist/server/runtime/makePlatform.d.ts.map +1 -0
  81. package/dist/{runtime/make.js → server/runtime/makePlatform.js} +10 -8
  82. package/dist/server/runtime/makePlatform.js.map +1 -0
  83. package/dist/server/runtime/types.d.ts +19 -0
  84. package/dist/server/runtime/types.d.ts.map +1 -0
  85. package/dist/{runtime → server/runtime}/types.js.map +1 -1
  86. package/dist/server/testing/makePlatformIt.d.ts +8 -0
  87. package/dist/server/testing/makePlatformIt.d.ts.map +1 -0
  88. package/dist/{testing/vitest.js → server/testing/makePlatformIt.js} +9 -5
  89. package/dist/server/testing/makePlatformIt.js.map +1 -0
  90. package/dist/server/testing/types.d.ts +28 -0
  91. package/dist/server/testing/types.d.ts.map +1 -0
  92. package/dist/{testing → server/testing}/types.js.map +1 -1
  93. package/docs/north-star.md +36 -0
  94. package/docs/roadmap.md +30 -0
  95. package/package.json +324 -54
  96. package/src/errors/{rejected-field.ts → rejectedField.ts} +3 -6
  97. package/src/errors/taxonomy.ts +2 -8
  98. package/src/rpc/identity.ts +0 -4
  99. package/src/rpc/middleware.ts +18 -9
  100. package/src/server/appHost.ts +134 -0
  101. package/src/{better-auth → server/better-auth}/adapter.ts +27 -31
  102. package/src/{better-auth → server/better-auth}/relation.ts +18 -20
  103. package/src/{better-auth/row-adapter.ts → server/better-auth/rowAdapter.ts} +19 -21
  104. package/src/{better-auth → server/better-auth}/where.ts +23 -33
  105. package/src/{node-http/subscription-signal.ts → server/node-http/subscriptionSignal.ts} +19 -22
  106. package/src/{rpc-server/adapters/better-auth-sessions.ts → server/rpc-server/adapters/betterAuthSessions.ts} +9 -10
  107. package/src/server/rpc-server/boundary.ts +26 -0
  108. package/src/server/rpc-server/local.ts +70 -0
  109. package/src/{rpc-server → server/rpc-server}/origin.ts +10 -13
  110. package/src/{rpc-server → server/rpc-server}/redact.ts +9 -11
  111. package/src/server/rpc-server/redactCause.ts +40 -0
  112. package/src/{rpc-server → server/rpc-server}/sensitive.ts +17 -22
  113. package/src/{rpc-server → server/rpc-server}/session.ts +22 -23
  114. package/src/{rpc-server → server/rpc-server}/tracing.ts +15 -18
  115. package/src/{rpc-server/transport.ts → server/rpc-server/transportHeaders.ts} +3 -3
  116. package/src/{runtime/make.ts → server/runtime/makePlatform.ts} +18 -26
  117. package/src/server/runtime/types.ts +24 -0
  118. package/src/server/testing/makePlatformIt.ts +76 -0
  119. package/src/server/testing/types.ts +38 -0
  120. package/dist/better-auth/adapter.d.ts +0 -10
  121. package/dist/better-auth/adapter.d.ts.map +0 -1
  122. package/dist/better-auth/adapter.js.map +0 -1
  123. package/dist/better-auth/relation.d.ts.map +0 -1
  124. package/dist/better-auth/relation.js.map +0 -1
  125. package/dist/better-auth/row-adapter.d.ts +0 -8
  126. package/dist/better-auth/row-adapter.d.ts.map +0 -1
  127. package/dist/better-auth/row-adapter.js +0 -46
  128. package/dist/better-auth/row-adapter.js.map +0 -1
  129. package/dist/better-auth/where.d.ts.map +0 -1
  130. package/dist/better-auth/where.js.map +0 -1
  131. package/dist/better-auth.d.ts +0 -2
  132. package/dist/better-auth.d.ts.map +0 -1
  133. package/dist/better-auth.js +0 -2
  134. package/dist/better-auth.js.map +0 -1
  135. package/dist/errors/rejected-field.d.ts +0 -7
  136. package/dist/errors/rejected-field.d.ts.map +0 -1
  137. package/dist/errors/rejected-field.js.map +0 -1
  138. package/dist/errors.d.ts +0 -3
  139. package/dist/errors.d.ts.map +0 -1
  140. package/dist/errors.js +0 -3
  141. package/dist/errors.js.map +0 -1
  142. package/dist/node-http/subscription-signal.d.ts.map +0 -1
  143. package/dist/node-http/subscription-signal.js.map +0 -1
  144. package/dist/node-http.d.ts +0 -2
  145. package/dist/node-http.d.ts.map +0 -1
  146. package/dist/node-http.js +0 -2
  147. package/dist/node-http.js.map +0 -1
  148. package/dist/rpc-server/adapters/better-auth-sessions.d.ts +0 -4
  149. package/dist/rpc-server/adapters/better-auth-sessions.d.ts.map +0 -1
  150. package/dist/rpc-server/adapters/better-auth-sessions.js +0 -11
  151. package/dist/rpc-server/adapters/better-auth-sessions.js.map +0 -1
  152. package/dist/rpc-server/origin.d.ts.map +0 -1
  153. package/dist/rpc-server/origin.js +0 -12
  154. package/dist/rpc-server/origin.js.map +0 -1
  155. package/dist/rpc-server/redact-cause.d.ts +0 -6
  156. package/dist/rpc-server/redact-cause.d.ts.map +0 -1
  157. package/dist/rpc-server/redact-cause.js +0 -28
  158. package/dist/rpc-server/redact-cause.js.map +0 -1
  159. package/dist/rpc-server/redact.d.ts +0 -3
  160. package/dist/rpc-server/redact.d.ts.map +0 -1
  161. package/dist/rpc-server/redact.js.map +0 -1
  162. package/dist/rpc-server/sensitive.d.ts +0 -5
  163. package/dist/rpc-server/sensitive.d.ts.map +0 -1
  164. package/dist/rpc-server/sensitive.js.map +0 -1
  165. package/dist/rpc-server/session.d.ts +0 -21
  166. package/dist/rpc-server/session.d.ts.map +0 -1
  167. package/dist/rpc-server/session.js +0 -31
  168. package/dist/rpc-server/session.js.map +0 -1
  169. package/dist/rpc-server/tracing.d.ts.map +0 -1
  170. package/dist/rpc-server/tracing.js +0 -34
  171. package/dist/rpc-server/tracing.js.map +0 -1
  172. package/dist/rpc-server/transport.d.ts +0 -4
  173. package/dist/rpc-server/transport.d.ts.map +0 -1
  174. package/dist/rpc-server/transport.js +0 -4
  175. package/dist/rpc-server/transport.js.map +0 -1
  176. package/dist/rpc-server.d.ts +0 -9
  177. package/dist/rpc-server.d.ts.map +0 -1
  178. package/dist/rpc-server.js +0 -9
  179. package/dist/rpc-server.js.map +0 -1
  180. package/dist/rpc.d.ts +0 -3
  181. package/dist/rpc.d.ts.map +0 -1
  182. package/dist/rpc.js +0 -3
  183. package/dist/rpc.js.map +0 -1
  184. package/dist/runtime/make.d.ts +0 -4
  185. package/dist/runtime/make.d.ts.map +0 -1
  186. package/dist/runtime/make.js.map +0 -1
  187. package/dist/runtime/types.d.ts +0 -19
  188. package/dist/runtime/types.d.ts.map +0 -1
  189. package/dist/runtime.d.ts +0 -3
  190. package/dist/runtime.d.ts.map +0 -1
  191. package/dist/runtime.js +0 -2
  192. package/dist/runtime.js.map +0 -1
  193. package/dist/testing/types.d.ts +0 -26
  194. package/dist/testing/types.d.ts.map +0 -1
  195. package/dist/testing/vitest.d.ts +0 -8
  196. package/dist/testing/vitest.d.ts.map +0 -1
  197. package/dist/testing/vitest.js.map +0 -1
  198. package/dist/testing.d.ts +0 -3
  199. package/dist/testing.d.ts.map +0 -1
  200. package/dist/testing.js +0 -2
  201. package/dist/testing.js.map +0 -1
  202. package/src/better-auth.ts +0 -4
  203. package/src/errors.ts +0 -2
  204. package/src/node-http.ts +0 -5
  205. package/src/rpc-server/redact-cause.ts +0 -41
  206. package/src/rpc-server.ts +0 -15
  207. package/src/rpc.ts +0 -2
  208. package/src/runtime/types.ts +0 -24
  209. package/src/runtime.ts +0 -7
  210. package/src/testing/types.ts +0 -41
  211. package/src/testing/vitest.ts +0 -69
  212. package/src/testing.ts +0 -8
  213. /package/dist/{runtime → server/runtime}/types.js +0 -0
  214. /package/dist/{testing → server/testing}/types.js +0 -0
@@ -1,11 +1,15 @@
1
- const property = (value, key) => (typeof value === "object" && value !== null ? Reflect.get(value, key) : undefined);
2
- const isIncomingMessage = (value) => typeof property(value, "socket") === "object" && typeof property(value, "once") === "function";
3
- const nodeRequestFrom = (request) => {
1
+ function property(value, key) {
2
+ return typeof value === "object" && value !== null ? Reflect.get(value, key) : undefined;
3
+ }
4
+ function isIncomingMessage(value) {
5
+ return typeof property(value, "socket") === "object" && typeof property(value, "once") === "function";
6
+ }
7
+ function nodeRequestFrom(request) {
4
8
  const req = property(property(property(request, "runtime"), "node"), "req");
5
9
  return isIncomingMessage(req) ? req : undefined;
6
- };
10
+ }
7
11
  // Under Bun's node:http compatibility layer a Web request signal may miss an abandoned socket, so node close events cover long-lived responses.
8
- export const nodeSubscriptionSignal = (options) => {
12
+ export function nodeSubscriptionSignal(options) {
9
13
  const controller = new AbortController();
10
14
  const signals = [controller.signal];
11
15
  if (options.request !== undefined) {
@@ -18,15 +22,18 @@ export const nodeSubscriptionSignal = (options) => {
18
22
  }
19
23
  const nodeRequest = options.nodeRequest ?? nodeRequestFrom(options.request);
20
24
  if (nodeRequest === undefined) {
21
- return { dispose: () => { }, signal: AbortSignal.any(signals) };
25
+ return { dispose: () => undefined, signal: AbortSignal.any(signals) };
22
26
  }
23
- const socket = nodeRequest.socket;
24
- const onRequestClose = () => {
25
- if (!nodeRequest.complete) {
27
+ const request = nodeRequest;
28
+ const socket = request.socket;
29
+ function onRequestClose() {
30
+ if (!request.complete) {
26
31
  controller.abort();
27
32
  }
28
- };
29
- const onSocketClose = () => controller.abort();
33
+ }
34
+ function onSocketClose() {
35
+ return controller.abort();
36
+ }
30
37
  nodeRequest.once("close", onRequestClose);
31
38
  socket.once("close", onSocketClose);
32
39
  if (nodeRequest.destroyed || socket.destroyed) {
@@ -44,5 +51,5 @@ export const nodeSubscriptionSignal = (options) => {
44
51
  },
45
52
  signal: AbortSignal.any(signals),
46
53
  };
47
- };
48
- //# sourceMappingURL=subscription-signal.js.map
54
+ }
55
+ //# sourceMappingURL=subscriptionSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionSignal.js","sourceRoot":"","sources":["../../../src/server/node-http/subscriptionSignal.ts"],"names":[],"mappings":"AAUA,SAAS,QAAQ,CAAC,KAAc,EAAE,GAAW;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AACD,SAAS,iBAAiB,CAAC,KAAc;IACxC,OAAO,OAAO,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC;AACvG,CAAC;AACD,SAAS,eAAe,CAAC,OAA4B;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5E,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AACD,gJAAgJ;AAChJ,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC5E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,GAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,SAAS,cAAc;QACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvB,UAAU,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACF,CAAC;IACD,SAAS,aAAa;QACrB,OAAO,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACpC,IAAI,WAAW,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/C,UAAU,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACN,OAAO,EAAE,GAAG,EAAE;YACb,IAAI,QAAQ,EAAE,CAAC;gBACd,OAAO;YACR,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACpD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;KAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SessionProvider, SessionShape } from "#rpc-server/session.ts";
2
+ export type GetSession<TSession extends SessionShape> = (headers: globalThis.Headers) => Promise<TSession | null>;
3
+ export declare function betterAuthSessions<TSession extends SessionShape>(getSession: GetSession<TSession>): SessionProvider<TSession>;
4
+ //# sourceMappingURL=betterAuthSessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"betterAuthSessions.d.ts","sourceRoot":"","sources":["../../../../src/server/rpc-server/adapters/betterAuthSessions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC5E,MAAM,MAAM,UAAU,CAAC,QAAQ,SAAS,YAAY,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAOlH,wBAAgB,kBAAkB,CAAC,QAAQ,SAAS,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAQ7H"}
@@ -0,0 +1,14 @@
1
+ import { Effect, Option } from "effect";
2
+ import { AuthUnavailable } from "#errors/taxonomy.ts";
3
+ import { redact } from "#rpc-server/redact.ts";
4
+ function unavailable(cause) {
5
+ return Effect.andThen(Effect.logError("Authentication provider failed", redact(cause)), Effect.fail(new AuthUnavailable({ message: "Authentication is temporarily unavailable" })));
6
+ }
7
+ export function betterAuthSessions(getSession) {
8
+ const betterAuthSession = Effect.fn("PlatformRpc.betterAuthSession")(function* (headers) {
9
+ const session = yield* Effect.tryPromise(() => getSession(new globalThis.Headers(headers))).pipe(Effect.catch((error) => unavailable(error.cause)));
10
+ return Option.fromNullishOr(session);
11
+ });
12
+ return { get: betterAuthSession };
13
+ }
14
+ //# sourceMappingURL=betterAuthSessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"betterAuthSessions.js","sourceRoot":"","sources":["../../../../src/server/rpc-server/adapters/betterAuthSessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,SAAS,WAAW,CAAC,KAAc;IAClC,OAAO,MAAM,CAAC,OAAO,CACpB,MAAM,CAAC,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAChE,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC,CAC1F,CAAC;AACH,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAgC,UAAgC;IACjG,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAwB;QACvG,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/F,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACjD,CAAC;QACF,OAAO,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Effect, Schema } from "effect";
2
+ export interface RpcBoundaryOptions<E> {
3
+ readonly message?: string;
4
+ readonly unexpected: (message: string) => E;
5
+ }
6
+ export declare function rpcBoundary<TSchema extends Schema.ConstraintDecoder<{
7
+ readonly message: string;
8
+ }>>(schema: TSchema, options: RpcBoundaryOptions<TSchema["Type"]>): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, TSchema["Type"], R>;
9
+ //# sourceMappingURL=boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/boundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE/C,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC;CAC5C;AACD,wBAAgB,WAAW,CAC1B,OAAO,SAAS,MAAM,CAAC,iBAAiB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB,CAAC,EACD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAEtD,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAapF"}
@@ -0,0 +1,18 @@
1
+ import { Cause, Effect, Schema } from "effect";
2
+ import { isSensitiveKey, redactText } from "./sensitive.js";
3
+ export function rpcBoundary(schema, options) {
4
+ const declared = Schema.is(schema);
5
+ return (self) => Effect.catchCause(self, (cause) => {
6
+ if (Cause.hasInterruptsOnly(cause)) {
7
+ return Effect.failCause(Cause.fromReasons(cause.reasons.filter(Cause.isInterruptReason)));
8
+ }
9
+ const reason = cause.reasons[0];
10
+ if (cause.reasons.length === 1 && reason && Cause.isFailReason(reason) && declared(reason.error)) {
11
+ return Effect.fail(reason.error);
12
+ }
13
+ const rejection = options.unexpected(redactText(options.message ?? "Internal server error", isSensitiveKey));
14
+ Object.defineProperty(rejection, "cause", { configurable: true, enumerable: false, value: cause });
15
+ return Effect.failCause(Cause.fromReasons([...Cause.fail(rejection).reasons, ...cause.reasons.filter(Cause.isInterruptReason)]));
16
+ });
17
+ }
18
+ //# sourceMappingURL=boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../../src/server/rpc-server/boundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAK5D,MAAM,UAAU,WAAW,CAIzB,MAAe,EAAE,OAA4C;IAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAU,IAA4B,EAAwC,EAAE,CACtF,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClG,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,IAAI,uBAAuB,EAAE,cAAc,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACnG,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClI,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Effect } from "effect";
2
+ import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
3
+ import { RpcSerialization } from "effect/unstable/rpc";
4
+ export declare function sameOrigin(request: HttpServerRequest.HttpServerRequest): boolean;
5
+ export declare function loopbackOnly<E, R>(handler: (request: HttpServerRequest.HttpServerRequest) => Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>): (request: HttpServerRequest.HttpServerRequest) => Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>;
6
+ export declare const localRpcGuard: <E, R>(effect: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>, trustedProxy?: string | undefined) => Effect.Effect<HttpServerResponse.HttpServerResponse, E, R | HttpServerRequest.HttpServerRequest | RpcSerialization.RpcSerialization>;
7
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAoBvD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,iBAAiB,GAAG,OAAO,CAWhF;AACD,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAChC,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC,aAEpG,iBAAiB,CAAC,iBAAiB,gEAIpD;AAiBD,eAAO,MAAM,aAAa,GAAgC,CAAC,EAAE,CAAC,gPAW5D,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { Effect, Option } from "effect";
2
+ import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
3
+ import { RpcSerialization } from "effect/unstable/rpc";
4
+ function loopbackAddress(address) {
5
+ const unmapped = unmapAddress(address);
6
+ return unmapped === "::1" || (/^127(?:\.\d{1,3}){3}$/u.test(unmapped) && unmapped.split(".").every((part) => Number(part) <= 255));
7
+ }
8
+ function unmapAddress(address) {
9
+ return address.replace(/^::ffff:/iu, "");
10
+ }
11
+ function loopbackHost(host) {
12
+ if (host === undefined) {
13
+ return false;
14
+ }
15
+ const authority = /^(?<hostname>\[[^\]]+\]|[^:]+)(?::(?<port>\d{1,5}))?$/u.exec(host)?.groups;
16
+ if (authority === undefined || (authority.port !== undefined && Number(authority.port) > 65_535)) {
17
+ return false;
18
+ }
19
+ const hostname = authority.hostname?.toLowerCase();
20
+ return hostname !== undefined && (hostname === "localhost" || hostname === "[::1]" || loopbackAddress(hostname));
21
+ }
22
+ export function sameOrigin(request) {
23
+ const origin = request.headers.origin;
24
+ if (origin === undefined) {
25
+ return true;
26
+ }
27
+ try {
28
+ const url = new URL(origin);
29
+ return url.protocol === "http:" && url.origin === origin && url.host === request.headers.host;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ export function loopbackOnly(handler) {
36
+ return (request) => loopbackHost(request.headers.host) && Option.match(request.remoteAddress, { onNone: () => true, onSome: loopbackAddress })
37
+ ? handler(request)
38
+ : Effect.succeed(HttpServerResponse.text("Only loopback hosts are served", { status: 403 }));
39
+ }
40
+ function proxyOrigin(request, trustedProxy) {
41
+ if (trustedProxy === undefined || !Option.exists(request.remoteAddress, (address) => unmapAddress(address) === unmapAddress(trustedProxy))) {
42
+ return false;
43
+ }
44
+ const host = request.headers["x-forwarded-host"];
45
+ const protocol = request.headers["x-forwarded-proto"];
46
+ if (host === undefined || !/^(?:\[[\da-f:]+\]|[\da-z.-]+)(?::\d{1,5})?$/iu.test(host) || (protocol !== "http" && protocol !== "https")) {
47
+ return false;
48
+ }
49
+ try {
50
+ const url = new URL(`${protocol}://${host}`);
51
+ return request.headers.origin === undefined || request.headers.origin === url.origin;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ export const localRpcGuard = Effect.fnUntraced(function* (effect, trustedProxy) {
58
+ const request = yield* HttpServerRequest.HttpServerRequest;
59
+ const serialization = yield* RpcSerialization.RpcSerialization;
60
+ const local = loopbackHost(request.headers.host) && Option.exists(request.remoteAddress, loopbackAddress);
61
+ const contentType = request.headers["content-type"]?.split(";")[0]?.trim().toLowerCase();
62
+ return ((local && sameOrigin(request)) || proxyOrigin(request, trustedProxy)) && contentType === serialization.contentType
63
+ ? yield* effect
64
+ : HttpServerResponse.text("Local same-origin requests only", { status: 403 });
65
+ });
66
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/server/rpc-server/local.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,6 @@ export interface TrustedOriginsOptions {
10
10
  readonly allow: readonly string[];
11
11
  readonly missing: "allow" | "reject";
12
12
  }
13
- export declare const trustedOrigins: (options: TrustedOriginsOptions) => OriginPolicy;
14
- export declare const originRequest: (headers: Headers.Headers, rpc: string) => OriginRequest;
13
+ export declare function trustedOrigins(options: TrustedOriginsOptions): OriginPolicy;
14
+ export declare function originRequest(headers: Headers.Headers, rpc: string): OriginRequest;
15
15
  //# sourceMappingURL=origin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;AAC/D,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC;CACrC;AACD,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,YAAY,CAM3E;AACD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAMlF"}
@@ -0,0 +1,16 @@
1
+ import { Option } from "effect";
2
+ import { Headers } from "effect/unstable/http";
3
+ export function trustedOrigins(options) {
4
+ return ({ origin }) => Option.match(origin, {
5
+ onNone: () => options.missing === "allow",
6
+ onSome: (value) => options.allow.includes(value),
7
+ });
8
+ }
9
+ export function originRequest(headers, rpc) {
10
+ return {
11
+ headers,
12
+ origin: Headers.get(headers, "origin"),
13
+ rpc,
14
+ };
15
+ }
16
+ //# sourceMappingURL=origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.js","sourceRoot":"","sources":["../../../src/server/rpc-server/origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAW/C,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CACrB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO;QACzC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;KAChD,CAAC,CAAC;AACL,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,OAAwB,EAAE,GAAW;IAClE,OAAO;QACN,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;QACtC,GAAG;KACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type SensitiveKey } from "./sensitive.ts";
2
+ export declare function redact(value: unknown, sensitive?: SensitiveKey): unknown;
3
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/redact.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoDzF,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,GAAE,YAA6B,GAAG,OAAO,CAExF"}
@@ -2,7 +2,7 @@ import { Predicate, Redacted } from "effect";
2
2
  import { isSensitiveKey, REDACTED, redactText } from "./sensitive.js";
3
3
  const MAX_DEPTH = 8;
4
4
  const MAX_ENTRIES = 50;
5
- const binary = (value) => {
5
+ function binary(value) {
6
6
  if (ArrayBuffer.isView(value)) {
7
7
  return `<${value.constructor.name} ${value.byteLength} bytes>`;
8
8
  }
@@ -10,8 +10,8 @@ const binary = (value) => {
10
10
  return `<ArrayBuffer ${value.byteLength} bytes>`;
11
11
  }
12
12
  return undefined;
13
- };
14
- const entriesOf = (value) => {
13
+ }
14
+ function entriesOf(value) {
15
15
  const entries = Object.entries(value);
16
16
  if (!Predicate.isError(value)) {
17
17
  return entries;
@@ -22,8 +22,8 @@ const entriesOf = (value) => {
22
22
  ["stack", value.stack],
23
23
  ];
24
24
  return value.cause === undefined ? [...shape, ...entries] : [...shape, ...entries, ["cause", value.cause]];
25
- };
26
- const walk = (value, sensitive, depth) => {
25
+ }
26
+ function walk(value, sensitive, depth) {
27
27
  if (Redacted.isRedacted(value)) {
28
28
  return REDACTED;
29
29
  }
@@ -49,6 +49,8 @@ const walk = (value, sensitive, depth) => {
49
49
  .slice(0, MAX_ENTRIES)
50
50
  .map(([key, nested]) => [key, sensitive(key) ? REDACTED : walk(nested, sensitive, depth + 1)]);
51
51
  return Object.fromEntries(entries.length > MAX_ENTRIES ? [...kept, ["<truncated>", `${entries.length - MAX_ENTRIES} more keys`]] : kept);
52
- };
53
- export const redact = (value, sensitive = isSensitiveKey) => walk(value, sensitive, 0);
52
+ }
53
+ export function redact(value, sensitive = isSensitiveKey) {
54
+ return walk(value, sensitive, 0);
55
+ }
54
56
  //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/server/rpc-server/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Cause, ErrorReporter } from "effect";
2
+ import { type SensitiveKey } from "./sensitive.ts";
3
+ export declare function redactDefect(defect: unknown, sensitive?: SensitiveKey): unknown;
4
+ export declare function redactCause<E>(cause: Cause.Cause<E>, sensitive?: SensitiveKey): Cause.Cause<E>;
5
+ export declare function redactingErrorReporter(reporter: ErrorReporter.ErrorReporter, sensitive?: SensitiveKey): ErrorReporter.ErrorReporter;
6
+ //# sourceMappingURL=redactCause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactCause.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/redactCause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAW,aAAa,EAAa,MAAM,QAAQ,CAAC;AAElE,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoB/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,GAAE,YAA6B,GAAG,OAAO,CAE/F;AACD,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,GAAE,YAA6B,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAQ9G;AACD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,CAAC,aAAa,EAAE,SAAS,GAAE,YAA6B,GAAG,aAAa,CAAC,aAAa,CAKnJ"}
@@ -0,0 +1,36 @@
1
+ import { Cause, Context, ErrorReporter, Predicate } from "effect";
2
+ import { redact } from "./redact.js";
3
+ import { isSensitiveKey, redactText } from "./sensitive.js";
4
+ function reporterHints(error, sensitive) {
5
+ return {
6
+ ...(ErrorReporter.isIgnored(error) ? { [ErrorReporter.ignore]: true } : {}),
7
+ ...(ErrorReporter.severity in error ? { [ErrorReporter.severity]: ErrorReporter.getSeverity(error) } : {}),
8
+ ...(ErrorReporter.attributes in error ? { [ErrorReporter.attributes]: redact(ErrorReporter.getAttributes(error), sensitive) } : {}),
9
+ };
10
+ }
11
+ function redactError(error, sensitive) {
12
+ const options = error.cause === undefined ? undefined : { cause: redact(error.cause, sensitive) };
13
+ const copy = new Error(redactText(error.message, sensitive), options);
14
+ Object.defineProperty(copy, "name", { configurable: true, value: error.name, writable: true });
15
+ Object.defineProperty(copy, "stack", {
16
+ configurable: true,
17
+ value: error.stack === undefined ? undefined : redactText(error.stack, sensitive),
18
+ writable: true,
19
+ });
20
+ return Object.assign(copy, redact(Object.fromEntries(Object.entries(error)), sensitive), reporterHints(error, sensitive));
21
+ }
22
+ export function redactDefect(defect, sensitive = isSensitiveKey) {
23
+ return Predicate.isError(defect) ? redactError(defect, sensitive) : redact(defect, sensitive);
24
+ }
25
+ export function redactCause(cause, sensitive = isSensitiveKey) {
26
+ return Cause.fromReasons(cause.reasons.flatMap((reason) => Cause.isDieReason(reason)
27
+ ? Cause.annotate(Cause.die(redactDefect(reason.defect, sensitive)), Context.makeUnsafe(reason.annotations)).reasons
28
+ : [reason]));
29
+ }
30
+ export function redactingErrorReporter(reporter, sensitive = isSensitiveKey) {
31
+ return {
32
+ [ErrorReporter.TypeId]: ErrorReporter.TypeId,
33
+ report: (options) => reporter.report({ ...options, cause: redactCause(options.cause, sensitive) }),
34
+ };
35
+ }
36
+ //# sourceMappingURL=redactCause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactCause.js","sourceRoot":"","sources":["../../../src/server/rpc-server/redactCause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAqB,MAAM,gBAAgB,CAAC;AAE/E,SAAS,aAAa,CAAC,KAAY,EAAE,SAAuB;IAC3D,OAAO;QACN,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,aAAa,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1G,GAAG,CAAC,aAAa,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnI,CAAC;AACH,CAAC;AACD,SAAS,WAAW,CAAC,KAAY,EAAE,SAAuB;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAClG,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;QACpC,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;QACjF,QAAQ,EAAE,IAAI;KACd,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3H,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,SAAS,GAAiB,cAAc;IACrF,OAAO,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC/F,CAAC;AACD,MAAM,UAAU,WAAW,CAAI,KAAqB,EAAE,SAAS,GAAiB,cAAc;IAC7F,OAAO,KAAK,CAAC,WAAW,CACvB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAkB,CAAC,MAAM,EAAE,EAAE,CACjD,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;QACxB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;QACnH,CAAC,CAAC,CAAC,MAAM,CAAC,CACX,CACD,CAAC;AACH,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,QAAqC,EAAE,SAAS,GAAiB,cAAc;IACrH,OAAO;QACN,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM;QAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;KAClG,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const REDACTED = "<redacted>";
2
+ export type SensitiveKey = (key: string) => boolean;
3
+ export declare function isSensitiveKey(key: string): boolean;
4
+ export declare function redactText(text: string, sensitive: SensitiveKey): string;
5
+ //# sourceMappingURL=sensitive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/sensitive.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,eAAe,CAAC;AAwBrC,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;AAQpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAYD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,MAAM,CAGxE"}
@@ -22,28 +22,32 @@ const SENSITIVE_PARTS = [
22
22
  ];
23
23
  const SENSITIVE_WORDS = ["otp", "pin", "cvv", "cvc", "ssn", "iban"];
24
24
  const SENSITIVE_NAMES = ["session", "pan"];
25
- const wordsOf = (key) => key
26
- .replaceAll(/([a-z0-9])([A-Z])/gu, "$1 $2")
27
- .replaceAll(/([A-Z])([A-Z][a-z])/gu, "$1 $2")
28
- .toLowerCase()
29
- .split(/[\s_-]+/u);
30
- export const isSensitiveKey = (key) => {
25
+ function wordsOf(key) {
26
+ return key
27
+ .replaceAll(/(?<lower>[a-z0-9])(?<upper>[A-Z])/gu, "$<lower> $<upper>")
28
+ .replaceAll(/(?<initial>[A-Z])(?<word>[A-Z][a-z])/gu, "$<initial> $<word>")
29
+ .toLowerCase()
30
+ .split(/[\s_-]+/u);
31
+ }
32
+ export function isSensitiveKey(key) {
31
33
  const normalized = key.toLowerCase().replaceAll(/[-_]/gu, "");
32
34
  return (SENSITIVE_NAMES.includes(normalized)
33
35
  || SENSITIVE_PARTS.some((part) => normalized.includes(part))
34
36
  || wordsOf(key).some((word) => SENSITIVE_WORDS.includes(word)));
35
- };
36
- const AUTH_SCHEME = /\b(Bearer|Basic)\s+[A-Za-z0-9._~+/-]+=*/giu;
37
+ }
38
+ const AUTH_SCHEME = /\b(?<scheme>Bearer|Basic)\s+[A-Za-z0-9._~+/-]+=*/giu;
37
39
  const JWT = /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/gu;
38
- const URL_PASSWORD = /(\/\/[^:/\s@]+:)[^@/\s]+@/gu;
39
- const ASSIGNMENT = /([A-Za-z][\w.-]*)(["']?\s*[=:]\s*["']?)([^\s"'&,;]+)/gu;
40
- const scrub = (text, sensitive) => text
41
- .replaceAll(AUTH_SCHEME, `$1 ${REDACTED}`)
42
- .replaceAll(JWT, REDACTED)
43
- .replaceAll(URL_PASSWORD, `$1${REDACTED}@`)
44
- .replaceAll(ASSIGNMENT, (match, key, separator) => (sensitive(key) ? `${key}${separator}${REDACTED}` : match));
45
- export const redactText = (text, sensitive) => {
40
+ const URL_PASSWORD = /(?<authority>\/\/[^:/\s@]+:)[^@/\s]+@/gu;
41
+ const ASSIGNMENT = /(?<key>[A-Za-z][\w.-]*)(?<separator>["']?\s*[=:]\s*["']?)(?<value>[^\s"'&,;]+)/gu;
42
+ function scrub(text, sensitive) {
43
+ return text
44
+ .replaceAll(AUTH_SCHEME, `$<scheme> ${REDACTED}`)
45
+ .replaceAll(JWT, REDACTED)
46
+ .replaceAll(URL_PASSWORD, `$<authority>${REDACTED}@`)
47
+ .replaceAll(ASSIGNMENT, (match, key, separator) => (sensitive(key) ? `${key}${separator}${REDACTED}` : match));
48
+ }
49
+ export function redactText(text, sensitive) {
46
50
  const scrubbed = scrub(text, sensitive);
47
51
  return scrubbed.length > MAX_STRING ? `${scrubbed.slice(0, MAX_STRING)}…<${scrubbed.length - MAX_STRING} more chars>` : scrubbed;
48
- };
52
+ }
49
53
  //# sourceMappingURL=sensitive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive.js","sourceRoot":"","sources":["../../../src/server/rpc-server/sensitive.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,eAAe,GAAG;IACvB,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,KAAK;IACL,QAAQ;IACR,WAAW;IACX,WAAW;IACX,YAAY;IACZ,eAAe;IACf,MAAM;IACN,MAAM;CACN,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACpE,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAE3C,SAAS,OAAO,CAAC,GAAW;IAC3B,OAAO,GAAG;SACR,UAAU,CAAC,qCAAqC,EAAE,mBAAmB,CAAC;SACtE,UAAU,CAAC,wCAAwC,EAAE,oBAAoB,CAAC;SAC1E,WAAW,EAAE;SACb,KAAK,CAAC,UAAU,CAAC,CAAC;AACrB,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,CACN,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;WACjC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WACzD,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAC9D,CAAC;AACH,CAAC;AACD,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAC1E,MAAM,GAAG,GAAG,uDAAuD,CAAC;AACpE,MAAM,YAAY,GAAG,yCAAyC,CAAC;AAC/D,MAAM,UAAU,GAAG,kFAAkF,CAAC;AACtG,SAAS,KAAK,CAAC,IAAY,EAAE,SAAuB;IACnD,OAAO,IAAI;SACT,UAAU,CAAC,WAAW,EAAE,aAAa,QAAQ,EAAE,CAAC;SAChD,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,YAAY,EAAE,eAAe,QAAQ,GAAG,CAAC;SACpD,UAAU,CAAC,UAAU,EAAE,CAAC,KAAa,EAAE,GAAW,EAAE,SAAiB,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACzI,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,SAAuB;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,UAAU,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClI,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Effect, Layer, Option } from "effect";
2
+ import type { Headers } from "effect/unstable/http";
3
+ import { type AuthUnavailable, Forbidden } from "#errors/taxonomy.ts";
4
+ import { Authenticated, MaybeAuthenticated } from "#rpc/middleware.ts";
5
+ import { type OriginPolicy } from "./origin.ts";
6
+ export interface SessionShape {
7
+ readonly user: {
8
+ readonly id: string;
9
+ };
10
+ }
11
+ export interface SessionProvider<TSession extends SessionShape> {
12
+ readonly get: (headers: Headers.Headers) => Effect.Effect<Option.Option<TSession>, AuthUnavailable>;
13
+ }
14
+ export interface SessionPolicy<TSession extends SessionShape> {
15
+ readonly origin: OriginPolicy;
16
+ readonly provider: SessionProvider<TSession>;
17
+ }
18
+ export declare const resolveSession: <TSession extends SessionShape>(policy: SessionPolicy<TSession>, headers: Headers.Headers, rpc: string) => Effect.Effect<Option.Option<TSession>, AuthUnavailable | Forbidden>;
19
+ export declare function authenticatedLayer<TSession extends SessionShape>(policy: SessionPolicy<TSession>): Layer.Layer<Authenticated>;
20
+ export declare function maybeAuthenticatedLayer<TSession extends SessionShape>(policy: SessionPolicy<TSession>): Layer.Layer<MaybeAuthenticated>;
21
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,eAAe,EAAE,SAAS,EAAgB,MAAM,qBAAqB,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACd,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;KACpB,CAAC;CACF;AACD,MAAM,WAAW,eAAe,CAAC,QAAQ,SAAS,YAAY;IAC7D,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;CACpG;AACD,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,YAAY;IAC3D,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;CAC7C;AACD,eAAO,MAAM,cAAc,EAAE,CAAC,QAAQ,SAAS,YAAY,EAC1D,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,GAAG,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,CAQrE,CAAC;AAIH,wBAAgB,kBAAkB,CAAC,QAAQ,SAAS,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAW7H;AACD,wBAAgB,uBAAuB,CAAC,QAAQ,SAAS,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAWvI"}
@@ -0,0 +1,37 @@
1
+ import { Effect, Layer, Option } from "effect";
2
+ import { Forbidden, Unauthorized } from "#errors/taxonomy.ts";
3
+ import { Identity, OptionalIdentity } from "#rpc/identity.ts";
4
+ import { Authenticated, MaybeAuthenticated } from "#rpc/middleware.ts";
5
+ import { originRequest } from "./origin.js";
6
+ import { transportHeaders } from "./transportHeaders.js";
7
+ export const resolveSession = Effect.fn("PlatformRpc.resolveSession")(function* (policy, headers, rpc) {
8
+ const transport = yield* transportHeaders(headers);
9
+ if (!policy.origin(originRequest(transport, rpc))) {
10
+ return yield* new Forbidden({ message: "Origin not allowed" });
11
+ }
12
+ return yield* policy.provider.get(transport);
13
+ });
14
+ function identified(id) {
15
+ return Effect.andThen(Effect.annotateCurrentSpan("user.id", id), Effect.succeed(id));
16
+ }
17
+ export function authenticatedLayer(policy) {
18
+ return Layer.succeed(Authenticated, (effect, { headers, rpc }) => Effect.gen(function* () {
19
+ const session = yield* resolveSession(policy, headers, rpc._tag);
20
+ if (Option.isNone(session)) {
21
+ return yield* new Unauthorized({ message: "Authentication required" });
22
+ }
23
+ const id = yield* identified(session.value.user.id);
24
+ return yield* effect.pipe(Effect.provideService(Identity, { id }), Effect.annotateLogs({ userId: id }));
25
+ }));
26
+ }
27
+ export function maybeAuthenticatedLayer(policy) {
28
+ return Layer.succeed(MaybeAuthenticated, (effect, { headers, rpc }) => Effect.gen(function* () {
29
+ const session = yield* resolveSession(policy, headers, rpc._tag);
30
+ if (Option.isNone(session)) {
31
+ return yield* Effect.provideService(effect, OptionalIdentity, Option.none());
32
+ }
33
+ const id = yield* identified(session.value.user.id);
34
+ return yield* effect.pipe(Effect.provideService(OptionalIdentity, Option.some({ id })), Effect.annotateLogs({ userId: id }));
35
+ }));
36
+ }
37
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/server/rpc-server/session.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,5 @@ export interface RequestTracingOptions {
5
5
  readonly header?: string;
6
6
  readonly sensitive?: SensitiveKey;
7
7
  }
8
- export declare const requestTracingLayer: (options?: RequestTracingOptions) => Layer.Layer<RequestTracing>;
8
+ export declare function requestTracingLayer(options?: RequestTracingOptions): Layer.Layer<RequestTracing>;
9
9
  //# sourceMappingURL=tracing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,EAA6B,MAAM,QAAQ,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;CAClC;AAgCD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,qBAA0B,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAcpG"}
@@ -0,0 +1,42 @@
1
+ import { Cause, Effect, Layer, Option, Predicate, Random } from "effect";
2
+ import { Headers } from "effect/unstable/http";
3
+ import { RequestId } from "#rpc/identity.ts";
4
+ import { RequestTracing } from "#rpc/middleware.ts";
5
+ import { redact } from "./redact.js";
6
+ import { redactCause } from "./redactCause.js";
7
+ const ACCEPTED_REQUEST_ID = /^[A-Za-z0-9._:-]{1,128}$/u;
8
+ function hex(byte) {
9
+ return byte.toString(16).padStart(2, "0");
10
+ }
11
+ const generateRequestId = Effect.map(Effect.all(Array.from({ length: 16 }, () => Random.nextIntBetween(0, 255))), (bytes) => bytes.map(hex).join(""));
12
+ function requestIdOf(headers, header) {
13
+ return Option.match(Option.filter(Headers.get(headers, header), (value) => ACCEPTED_REQUEST_ID.test(value)), {
14
+ onNone: () => generateRequestId,
15
+ onSome: Effect.succeed,
16
+ });
17
+ }
18
+ function failureTag(cause) {
19
+ return Option.match(Cause.findErrorOption(cause), {
20
+ onNone: () => "unknown",
21
+ onSome: (error) => (Predicate.hasProperty(error, "_tag") && Predicate.isString(error._tag) ? error._tag : "unknown"),
22
+ });
23
+ }
24
+ function logFailure(cause, payload, sensitive) {
25
+ if (Cause.hasInterruptsOnly(cause)) {
26
+ return Effect.void;
27
+ }
28
+ const annotations = { "rpc.payload": redact(payload, sensitive) };
29
+ if (!Cause.hasDies(cause)) {
30
+ return Effect.annotateLogs(Effect.logInfo("RPC failure"), { ...annotations, "rpc.failure": failureTag(cause) });
31
+ }
32
+ const defects = cause.reasons.filter(Cause.isDieReason).map((reason) => redact(reason.defect, sensitive));
33
+ return Effect.annotateLogs(Effect.logError("RPC defect"), { ...annotations, "rpc.defect": defects });
34
+ }
35
+ export function requestTracingLayer(options = {}) {
36
+ return Layer.succeed(RequestTracing, (effect, { headers, payload, rpc }) => Effect.gen(function* () {
37
+ const requestId = yield* requestIdOf(headers, options.header ?? "x-request-id");
38
+ yield* Effect.annotateCurrentSpan({ "request.id": requestId, "rpc.method": rpc._tag });
39
+ return yield* effect.pipe(Effect.catchCauseIf(Cause.hasDies, (cause) => Effect.failCause(redactCause(cause, options.sensitive))), Effect.tapCause((cause) => logFailure(cause, payload, options.sensitive)), Effect.provideService(RequestId, requestId), Effect.annotateLogs({ requestId, "rpc.method": rpc._tag }), Effect.withLogSpan("rpc.duration"));
40
+ }));
41
+ }
42
+ //# sourceMappingURL=tracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/server/rpc-server/tracing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Effect } from "effect";
2
+ import { type Headers } from "effect/unstable/http";
3
+ export declare function transportHeaders(rpcHeaders: Headers.Headers): Effect.Effect<Headers.Headers>;
4
+ //# sourceMappingURL=transportHeaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportHeaders.d.ts","sourceRoot":"","sources":["../../../src/server/rpc-server/transportHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,KAAK,OAAO,EAAqB,MAAM,sBAAsB,CAAC;AACvE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAK5F"}
@@ -0,0 +1,6 @@
1
+ import { Effect, Option } from "effect";
2
+ import { HttpServerRequest } from "effect/unstable/http";
3
+ export function transportHeaders(rpcHeaders) {
4
+ return Effect.map(Effect.serviceOption(HttpServerRequest.HttpServerRequest), Option.match({ onNone: () => rpcHeaders, onSome: (request) => request.headers }));
5
+ }
6
+ //# sourceMappingURL=transportHeaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportHeaders.js","sourceRoot":"","sources":["../../../src/server/rpc-server/transportHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAgB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvE,MAAM,UAAU,gBAAgB,CAAC,UAA2B;IAC3D,OAAO,MAAM,CAAC,GAAG,CAChB,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EACzD,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAChF,CAAC;AACH,CAAC"}