@shivaedev/server 0.0.0 → 0.2.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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -1
  3. package/dist/AppHostFactory.d.ts +15 -0
  4. package/dist/AppHostFactory.d.ts.map +1 -0
  5. package/dist/AppHostFactory.js +2 -0
  6. package/dist/AppHostFactory.js.map +1 -0
  7. package/dist/AppHostInput.d.ts +13 -0
  8. package/dist/AppHostInput.d.ts.map +1 -0
  9. package/dist/AppHostInput.js +2 -0
  10. package/dist/AppHostInput.js.map +1 -0
  11. package/dist/MigrationOptions.d.ts +15 -0
  12. package/dist/MigrationOptions.d.ts.map +1 -0
  13. package/dist/MigrationOptions.js +2 -0
  14. package/dist/MigrationOptions.js.map +1 -0
  15. package/dist/RedactionPolicy.d.ts +4 -0
  16. package/dist/RedactionPolicy.d.ts.map +1 -0
  17. package/dist/RedactionPolicy.js +4 -0
  18. package/dist/RedactionPolicy.js.map +1 -0
  19. package/dist/appHost.d.ts +47 -0
  20. package/dist/appHost.d.ts.map +1 -0
  21. package/dist/appHost.js +17 -0
  22. package/dist/appHost.js.map +1 -0
  23. package/dist/appHostHttp.d.ts +88 -0
  24. package/dist/appHostHttp.d.ts.map +1 -0
  25. package/dist/appHostHttp.js +66 -0
  26. package/dist/appHostHttp.js.map +1 -0
  27. package/dist/boundedRpcRequest.d.ts +3 -0
  28. package/dist/boundedRpcRequest.d.ts.map +1 -0
  29. package/dist/boundedRpcRequest.js +22 -0
  30. package/dist/boundedRpcRequest.js.map +1 -0
  31. package/dist/databaseAddress.d.ts +4 -0
  32. package/dist/databaseAddress.d.ts.map +1 -0
  33. package/dist/databaseAddress.js +25 -0
  34. package/dist/databaseAddress.js.map +1 -0
  35. package/dist/databaseLayer.d.ts +14 -0
  36. package/dist/databaseLayer.d.ts.map +1 -0
  37. package/dist/databaseLayer.js +100 -0
  38. package/dist/databaseLayer.js.map +1 -0
  39. package/dist/development.d.ts +10 -0
  40. package/dist/development.d.ts.map +1 -0
  41. package/dist/development.js +20 -0
  42. package/dist/development.js.map +1 -0
  43. package/dist/healthRoute.d.ts +3 -0
  44. package/dist/healthRoute.d.ts.map +1 -0
  45. package/dist/healthRoute.js +18 -0
  46. package/dist/healthRoute.js.map +1 -0
  47. package/dist/hostChanges.d.ts +7 -0
  48. package/dist/hostChanges.d.ts.map +1 -0
  49. package/dist/hostChanges.js +25 -0
  50. package/dist/hostChanges.js.map +1 -0
  51. package/dist/hostOptions.d.ts +34 -0
  52. package/dist/hostOptions.d.ts.map +1 -0
  53. package/dist/hostOptions.js +2 -0
  54. package/dist/hostOptions.js.map +1 -0
  55. package/dist/hostTransport.d.ts +18 -0
  56. package/dist/hostTransport.d.ts.map +1 -0
  57. package/dist/hostTransport.js +26 -0
  58. package/dist/hostTransport.js.map +1 -0
  59. package/dist/nativeClientOrigins.d.ts +4 -0
  60. package/dist/nativeClientOrigins.d.ts.map +1 -0
  61. package/dist/nativeClientOrigins.js +38 -0
  62. package/dist/nativeClientOrigins.js.map +1 -0
  63. package/dist/node-http/subscriptionSignal.d.ts +12 -0
  64. package/dist/node-http/subscriptionSignal.d.ts.map +1 -0
  65. package/dist/node-http/subscriptionSignal.js +55 -0
  66. package/dist/node-http/subscriptionSignal.js.map +1 -0
  67. package/dist/otlpHttpClient.d.ts +4 -0
  68. package/dist/otlpHttpClient.d.ts.map +1 -0
  69. package/dist/otlpHttpClient.js +36 -0
  70. package/dist/otlpHttpClient.js.map +1 -0
  71. package/dist/otlpTracing.d.ts +3 -0
  72. package/dist/otlpTracing.d.ts.map +1 -0
  73. package/dist/otlpTracing.js +35 -0
  74. package/dist/otlpTracing.js.map +1 -0
  75. package/dist/redactOtlpUrl.d.ts +2 -0
  76. package/dist/redactOtlpUrl.d.ts.map +1 -0
  77. package/dist/redactOtlpUrl.js +41 -0
  78. package/dist/redactOtlpUrl.js.map +1 -0
  79. package/dist/redactingDiagnostics.d.ts +5 -0
  80. package/dist/redactingDiagnostics.d.ts.map +1 -0
  81. package/dist/redactingDiagnostics.js +25 -0
  82. package/dist/redactingDiagnostics.js.map +1 -0
  83. package/dist/redactingRpcSerialization.d.ts +4 -0
  84. package/dist/redactingRpcSerialization.d.ts.map +1 -0
  85. package/dist/redactingRpcSerialization.js +74 -0
  86. package/dist/redactingRpcSerialization.js.map +1 -0
  87. package/dist/redactingTracer.d.ts +4 -0
  88. package/dist/redactingTracer.d.ts.map +1 -0
  89. package/dist/redactingTracer.js +32 -0
  90. package/dist/redactingTracer.js.map +1 -0
  91. package/dist/rpc-server/publicConfigLayer.d.ts +4 -0
  92. package/dist/rpc-server/publicConfigLayer.d.ts.map +1 -0
  93. package/dist/rpc-server/publicConfigLayer.js +9 -0
  94. package/dist/rpc-server/publicConfigLayer.js.map +1 -0
  95. package/dist/runtime/makePlatform.d.ts +4 -0
  96. package/dist/runtime/makePlatform.d.ts.map +1 -0
  97. package/dist/runtime/makePlatform.js +65 -0
  98. package/dist/runtime/makePlatform.js.map +1 -0
  99. package/dist/runtime/types.d.ts +19 -0
  100. package/dist/runtime/types.d.ts.map +1 -0
  101. package/dist/runtime/types.js +2 -0
  102. package/dist/runtime/types.js.map +1 -0
  103. package/dist/safeOtlpSerialization.d.ts +6 -0
  104. package/dist/safeOtlpSerialization.d.ts.map +1 -0
  105. package/dist/safeOtlpSerialization.js +67 -0
  106. package/dist/safeOtlpSerialization.js.map +1 -0
  107. package/dist/schemaSensitiveKeys.d.ts +5 -0
  108. package/dist/schemaSensitiveKeys.d.ts.map +1 -0
  109. package/dist/schemaSensitiveKeys.js +143 -0
  110. package/dist/schemaSensitiveKeys.js.map +1 -0
  111. package/dist/setupDatabases.d.ts +3 -0
  112. package/dist/setupDatabases.d.ts.map +1 -0
  113. package/dist/setupDatabases.js +12 -0
  114. package/dist/setupDatabases.js.map +1 -0
  115. package/dist/tracedGroup.d.ts +4 -0
  116. package/dist/tracedGroup.d.ts.map +1 -0
  117. package/dist/tracedGroup.js +13 -0
  118. package/dist/tracedGroup.js.map +1 -0
  119. package/package.json +107 -4
  120. package/src/AppHostFactory.ts +121 -0
  121. package/src/AppHostInput.ts +74 -0
  122. package/src/MigrationOptions.ts +15 -0
  123. package/src/RedactionPolicy.ts +4 -0
  124. package/src/appHost.ts +117 -0
  125. package/src/appHostHttp.ts +149 -0
  126. package/src/boundedRpcRequest.ts +28 -0
  127. package/src/databaseAddress.ts +25 -0
  128. package/src/databaseLayer.ts +127 -0
  129. package/src/development.ts +34 -0
  130. package/src/healthRoute.ts +27 -0
  131. package/src/hostChanges.ts +34 -0
  132. package/src/hostOptions.ts +30 -0
  133. package/src/hostTransport.ts +39 -0
  134. package/src/nativeClientOrigins.ts +44 -0
  135. package/src/node-http/subscriptionSignal.ts +64 -0
  136. package/src/otlpHttpClient.ts +54 -0
  137. package/src/otlpTracing.ts +61 -0
  138. package/src/redactOtlpUrl.ts +48 -0
  139. package/src/redactingDiagnostics.ts +33 -0
  140. package/src/redactingRpcSerialization.ts +85 -0
  141. package/src/redactingTracer.ts +37 -0
  142. package/src/rpc-server/publicConfigLayer.ts +12 -0
  143. package/src/runtime/makePlatform.ts +75 -0
  144. package/src/runtime/types.ts +24 -0
  145. package/src/safeOtlpSerialization.ts +73 -0
  146. package/src/schemaSensitiveKeys.ts +148 -0
  147. package/src/setupDatabases.ts +12 -0
  148. package/src/tracedGroup.ts +14 -0
@@ -0,0 +1,25 @@
1
+ import { Context, Effect, Layer, Option, Stream } from "effect";
2
+ import { resolveChanges } from "@shivaedev/identity/server/sessionKeys.ts";
3
+ export function hostChanges(group, changesService) {
4
+ return Layer.effectContext(Effect.gen(function* () {
5
+ const changes = yield* Effect.serviceOption(changesService);
6
+ const services = yield* Effect.context();
7
+ const handlers = new Map();
8
+ for (const rpc of group.requests.values()) {
9
+ if (!rpc._tag.endsWith(".$changes")) {
10
+ continue;
11
+ }
12
+ const provided = services.mapUnsafe.get(rpc.key);
13
+ if (Option.isNone(changes) && provided !== undefined) {
14
+ handlers.set(rpc.key, provided);
15
+ continue;
16
+ }
17
+ function handler({ queries }) {
18
+ return Stream.unwrap(Effect.map(resolveChanges(rpc, queries), ({ keys, context }) => Option.isSome(changes) ? changes.value.stream(keys, context) : Stream.never));
19
+ }
20
+ handlers.set(rpc.key, { context: services, handler, tag: rpc._tag });
21
+ }
22
+ return Context.makeUnsafe(handlers);
23
+ }));
24
+ }
25
+ //# sourceMappingURL=hostChanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostChanges.js","sourceRoot":"","sources":["../src/hostChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,MAAM,UAAU,WAAW,CAAoB,KAA2B,EAAE,cAAiC;IAC5G,OAAO,KAAK,CAAC,aAAa,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACtD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAChC,SAAS;YACV,CAAC;YACD,SAAS,OAAO,CAAC,EAAE,OAAO,EAAmD;gBAC5E,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAC3E,CACD,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,OAAO,CAAC,UAAU,CAAqE,QAAQ,CAAC,CAAC;IACzG,CAAC,CAAC,CACF,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { Duration, Layer } from "effect";
2
+ import type { HttpRouter, HttpStaticServer } from "effect/http";
3
+ import type { Rpc, RpcGroup } from "effect/rpc";
4
+ import type { SessionPolicy, SessionShape } from "@shivaedev/identity/server/session.ts";
5
+ import type { AppDatabaseOptions } from "./appHost.ts";
6
+ export type HostOptions<TRpcs extends Rpc.Any, THandlers, THandlerError, THandlerRequirements, TServices, TServiceError, TServiceRequirements> = {
7
+ readonly assets?: string | Parameters<typeof HttpStaticServer.layer>[0];
8
+ readonly config?: AppDatabaseOptions["config"] & {
9
+ readonly port?: number;
10
+ readonly host?: string;
11
+ readonly trustedProxy?: string;
12
+ readonly maxBodySize?: number;
13
+ readonly sensitiveKeys?: readonly string[];
14
+ readonly disablePreemptiveShutdown?: boolean;
15
+ readonly gracefulShutdownTimeout?: Duration.Input;
16
+ };
17
+ readonly group: RpcGroup.RpcGroup<TRpcs>;
18
+ readonly handlers: Layer.Layer<THandlers, THandlerError, THandlerRequirements>;
19
+ readonly nativeOrigins?: readonly string[];
20
+ readonly routes?: Layer.Layer<never, never, HttpRouter.HttpRouter | HttpRouter.Request<"Error", unknown>>;
21
+ readonly rpcPath?: HttpRouter.PathInput;
22
+ } & ({
23
+ readonly services: Layer.Layer<TServices, TServiceError, TServiceRequirements>;
24
+ } | ([TServices | TServiceError | TServiceRequirements] extends [never] ? {
25
+ readonly services?: never;
26
+ } : never));
27
+ export type HostPolicy<TSession extends SessionShape> = {
28
+ readonly policy?: undefined;
29
+ readonly sessions: SessionPolicy<TSession>;
30
+ } | {
31
+ readonly policy: "loopback";
32
+ readonly sessions?: never;
33
+ };
34
+ //# sourceMappingURL=hostOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostOptions.d.ts","sourceRoot":"","sources":["../src/hostOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,WAAW,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,IAAI;IAChJ,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAAG;QAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;QAC7C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;KAClD,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1G,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC;CACxC,GAAG,CACD;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAA;CAAE,GAClF,CAAC,CAAC,SAAS,GAAG,aAAa,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,KAAK,CAAC,CAC9G,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,QAAQ,SAAS,YAAY,IACjD;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hostOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostOptions.js","sourceRoot":"","sources":["../src/hostOptions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { Config, Effect } from "effect";
2
+ interface Options {
3
+ readonly config?: {
4
+ readonly host?: string;
5
+ readonly maxBodySize?: number;
6
+ readonly trustedProxy?: string;
7
+ };
8
+ readonly nativeOrigins?: readonly string[];
9
+ readonly policy?: "loopback" | undefined;
10
+ }
11
+ export declare const hostTransport: (options: Options) => Effect.Effect<{
12
+ bodySize: number;
13
+ host: string;
14
+ nativeOrigins: readonly string[];
15
+ trustedProxy: string | undefined;
16
+ }, Config.ConfigError, never>;
17
+ export {};
18
+ //# sourceMappingURL=hostTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostTransport.d.ts","sourceRoot":"","sources":["../src/hostTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAA0B,MAAM,QAAQ,CAAC;AAKhE,UAAU,OAAO;IAChB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5G,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACzC;AACD,eAAO,MAAM,aAAa;;;;;6BA4BxB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Config, Effect, Option, Result, Schema } from "effect";
2
+ import * as NetAddress from "effect/net/NetAddress";
3
+ import { TrustedProxy } from "@shivaedev/identity/server/trustedProxy.ts";
4
+ import { NativeOrigins } from "#nativeClientOrigins.ts";
5
+ export const hostTransport = Effect.fn("Platform.hostTransport")(function* (options) {
6
+ const maxBodySize = options.config?.maxBodySize ?? (yield* Config.Int("MAX_BODY_SIZE").pipe(Config.withDefault(1024 * 1024)));
7
+ const bodySize = yield* Schema.decodeUnknownEffect(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)))(maxBodySize).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
8
+ const trustedProxy = options.policy === "loopback"
9
+ ? undefined
10
+ : (options.config?.trustedProxy ?? Option.getOrUndefined(yield* Config.String("TRUSTED_PROXY").pipe(Config.option)));
11
+ if (trustedProxy !== undefined) {
12
+ yield* Schema.decodeUnknownEffect(TrustedProxy)(trustedProxy).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
13
+ }
14
+ const host = options.config?.host ?? (yield* Config.String("HOST").pipe(Config.withDefault("127.0.0.1")));
15
+ const loopback = host.toLowerCase() === "localhost"
16
+ || Result.match(NetAddress.ipFromString(host), {
17
+ onFailure: () => false,
18
+ onSuccess: (address) => NetAddress.isLoopback(NetAddress.toCanonical(address)),
19
+ });
20
+ if (options.policy !== "loopback" && !loopback && trustedProxy === undefined) {
21
+ yield* Effect.logWarning("RPC forwarding is refused without a trusted proxy. Set TRUSTED_PROXY or config.trustedProxy for this non-loopback HOST.");
22
+ }
23
+ const nativeOrigins = yield* Schema.decodeUnknownEffect(NativeOrigins)(options.nativeOrigins ?? []).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
24
+ return { bodySize, host, nativeOrigins, trustedProxy };
25
+ });
26
+ //# sourceMappingURL=hostTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostTransport.js","sourceRoot":"","sources":["../src/hostTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Schema } from "effect";
2
+ export declare const NativeOrigins: Schema.$Array<Schema.String>;
3
+ export declare function nativeClientOrigins(origins: readonly string[], trustedProxy: string | undefined, auth?: boolean): import("effect/Layer").Layer<never, never, never>;
4
+ //# sourceMappingURL=nativeClientOrigins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeClientOrigins.d.ts","sourceRoot":"","sources":["../src/nativeClientOrigins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIxC,eAAO,MAAM,aAAa,8BAYzB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,UAAQ,qDAyB7G"}
@@ -0,0 +1,38 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { Headers, HttpMiddleware, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/http";
3
+ import { localTransport } from "@shivaedev/identity/server/local.ts";
4
+ export const NativeOrigins = Schema.Array(Schema.String.check(Schema.makeFilter((origin) => {
5
+ try {
6
+ const url = new URL(origin);
7
+ const authority = url.origin === "null" ? `${url.protocol}//${url.host}` : url.origin;
8
+ return url.host !== "" && !origin.includes("*") && authority === origin;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ })));
14
+ export function nativeClientOrigins(origins, trustedProxy, auth = false) {
15
+ const allowed = localTransport(trustedProxy, origins);
16
+ const cors = HttpMiddleware.cors({
17
+ allowedHeaders: ["Authorization", "Content-Type"],
18
+ allowedMethods: auth ? ["GET", "POST"] : ["POST"],
19
+ allowedOrigins: (origin) => origins.includes(origin),
20
+ credentials: false,
21
+ exposedHeaders: auth ? ["set-auth-token"] : [],
22
+ });
23
+ return HttpRouter.middleware((effect) => Effect.gen(function* () {
24
+ const request = yield* HttpServerRequest.HttpServerRequest;
25
+ if (auth && !request.url.split("?")[0]?.startsWith("/api/auth/")) {
26
+ return yield* effect;
27
+ }
28
+ if ((auth || request.method === "OPTIONS") && !allowed(request)) {
29
+ return HttpServerResponse.text("Local same-origin requests only", { status: 403 });
30
+ }
31
+ if (!origins.includes(request.headers.origin ?? "")) {
32
+ return yield* effect;
33
+ }
34
+ const native = request.modify({ headers: Headers.remove(request.headers, "cookie") });
35
+ return yield* cors(effect).pipe(Effect.provideService(HttpServerRequest.HttpServerRequest, native));
36
+ })).layer;
37
+ }
38
+ //# sourceMappingURL=nativeClientOrigins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeClientOrigins.js","sourceRoot":"","sources":["../src/nativeClientOrigins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ export interface NodeSubscriptionSignalOptions {
3
+ readonly nodeRequest?: IncomingMessage | undefined;
4
+ readonly request?: Request | undefined;
5
+ readonly signals?: Iterable<AbortSignal | undefined>;
6
+ }
7
+ export interface NodeSubscriptionSignal {
8
+ readonly dispose: () => void;
9
+ readonly signal: AbortSignal;
10
+ }
11
+ export declare function nodeSubscriptionSignal(options: NodeSubscriptionSignalOptions): NodeSubscriptionSignal;
12
+ //# sourceMappingURL=subscriptionSignal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionSignal.d.ts","sourceRoot":"","sources":["../../src/node-http/subscriptionSignal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;CACrD;AACD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC7B;AAYD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,sBAAsB,CA0CrG"}
@@ -0,0 +1,55 @@
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) {
8
+ const req = property(property(property(request, "runtime"), "node"), "req");
9
+ return isIncomingMessage(req) ? req : undefined;
10
+ }
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.
12
+ export function nodeSubscriptionSignal(options) {
13
+ const controller = new AbortController();
14
+ const signals = [controller.signal];
15
+ if (options.request !== undefined) {
16
+ signals.push(options.request.signal);
17
+ }
18
+ for (const signal of options.signals ?? []) {
19
+ if (signal !== undefined) {
20
+ signals.push(signal);
21
+ }
22
+ }
23
+ const nodeRequest = options.nodeRequest ?? nodeRequestFrom(options.request);
24
+ if (nodeRequest === undefined) {
25
+ return { dispose: () => undefined, signal: AbortSignal.any(signals) };
26
+ }
27
+ const request = nodeRequest;
28
+ const socket = request.socket;
29
+ function onRequestClose() {
30
+ if (!request.complete) {
31
+ controller.abort();
32
+ }
33
+ }
34
+ function onSocketClose() {
35
+ return controller.abort();
36
+ }
37
+ nodeRequest.once("close", onRequestClose);
38
+ socket.once("close", onSocketClose);
39
+ if (nodeRequest.destroyed || socket.destroyed) {
40
+ controller.abort();
41
+ }
42
+ let disposed = false;
43
+ return {
44
+ dispose: () => {
45
+ if (disposed) {
46
+ return;
47
+ }
48
+ disposed = true;
49
+ nodeRequest.removeListener("close", onRequestClose);
50
+ socket.removeListener("close", onSocketClose);
51
+ },
52
+ signal: AbortSignal.any(signals),
53
+ };
54
+ }
55
+ //# sourceMappingURL=subscriptionSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionSignal.js","sourceRoot":"","sources":["../../src/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 { Layer } from "effect";
2
+ import { HttpClient } from "effect/http";
3
+ export declare function otlpHttpClient(timeout?: number): Layer.Layer<HttpClient.HttpClient, never, never>;
4
+ //# sourceMappingURL=otlpHttpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlpHttpClient.d.ts","sourceRoot":"","sources":["../src/otlpHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAmB,UAAU,EAA2C,MAAM,aAAa,CAAC;AAUnG,wBAAgB,cAAc,CAAC,OAAO,SAAS,oDA0C9C"}
@@ -0,0 +1,36 @@
1
+ import { Effect, Layer } from "effect";
2
+ import { FetchHttpClient, HttpClient, HttpClientError } from "effect/http";
3
+ import { RedactionPolicy } from "#RedactionPolicy.ts";
4
+ import { redactOtlpText } from "#safeOtlpSerialization.ts";
5
+ function timeoutError(request) {
6
+ return new HttpClientError.HttpClientError({
7
+ reason: new HttpClientError.TransportError({ description: "OTLP export request timed out", request }),
8
+ });
9
+ }
10
+ export function otlpHttpClient(timeout = 10_000) {
11
+ return Layer.effect(HttpClient.HttpClient, Effect.gen(function* () {
12
+ const client = yield* HttpClient.HttpClient;
13
+ const sensitive = yield* RedactionPolicy;
14
+ let warned = false;
15
+ function warnOnce(diagnostic) {
16
+ return Effect.suspend(() => {
17
+ if (warned) {
18
+ return Effect.void;
19
+ }
20
+ warned = true;
21
+ return Effect.flatMap(diagnostic, (annotations) => Effect.logWarning("OTLP trace export failed").pipe(Effect.annotateLogs(annotations)));
22
+ });
23
+ }
24
+ return client.pipe(HttpClient.tap((response) => response.arrayBuffer), HttpClient.transform((requestEffect, request) => requestEffect.pipe(Effect.timeoutOrElse({
25
+ duration: timeout,
26
+ orElse: () => Effect.fail(timeoutError(request)),
27
+ }))), HttpClient.tap((response) => {
28
+ if (response.status >= 200 && response.status < 300) {
29
+ warned = false;
30
+ return Effect.void;
31
+ }
32
+ return warnOnce(response.text.pipe(Effect.orElseSucceed(() => "Unable to read collector response"), Effect.map((body) => ({ "otlp.response": redactOtlpText(body, "", sensitive), "otlp.status": response.status }))));
33
+ }), HttpClient.tapError((error) => warnOnce(Effect.succeed({ "otlp.failure": error.reason._tag }))));
34
+ })).pipe(Layer.provide(FetchHttpClient.layer));
35
+ }
36
+ //# sourceMappingURL=otlpHttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlpHttpClient.js","sourceRoot":"","sources":["../src/otlpHttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Config, Layer } from "effect";
2
+ export declare const otlpTracing: Layer.Layer<never, Config.ConfigError>;
3
+ //# sourceMappingURL=otlpTracing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlpTracing.d.ts","sourceRoot":"","sources":["../src/otlpTracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,KAAK,EAAU,MAAM,QAAQ,CAAC;AAOvD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAqD9D,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Config, Effect, Layer, Schema } from "effect";
2
+ import { OtlpSerialization, OtlpTracer } from "effect/observability";
3
+ import { otlpHttpClient } from "#otlpHttpClient.ts";
4
+ import { RedactionPolicy } from "#RedactionPolicy.ts";
5
+ import { redactingTracer } from "#redactingTracer.ts";
6
+ import { safeOtlpSerialization } from "#safeOtlpSerialization.ts";
7
+ export const otlpTracing = Layer.unwrap(Effect.gen(function* () {
8
+ const endpoint = yield* Config.URL("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT").pipe(Config.orElse(() => Config.URL("OTEL_EXPORTER_OTLP_ENDPOINT").pipe(Config.map((url) => {
9
+ url.pathname = `${url.pathname.replace(/\/$/u, "")}/v1/traces`;
10
+ return url;
11
+ }))), Config.withDefault(undefined));
12
+ if (endpoint === undefined) {
13
+ return Layer.empty;
14
+ }
15
+ const configuredProtocol = yield* Config.String("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL").pipe(Config.orElse(() => Config.String("OTEL_EXPORTER_OTLP_PROTOCOL")), Config.withDefault("http/protobuf"));
16
+ const protocol = yield* Schema.decodeUnknownEffect(Schema.Literals(["http/protobuf", "http/json"]), { reportInput: true })(configuredProtocol).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
17
+ const attributes = yield* Config.Record(Schema.StringFromUriComponent, Schema.StringFromUriComponent, "OTEL_RESOURCE_ATTRIBUTES").pipe(Config.withDefault({}));
18
+ const serviceName = yield* Config.String("OTEL_SERVICE_NAME").pipe(Config.withDefault(attributes["service.name"] ?? "unknown_service"));
19
+ const serviceVersion = yield* Config.String("OTEL_SERVICE_VERSION").pipe(Config.withDefault(undefined));
20
+ const headers = yield* Config.Record(Schema.String, Schema.StringFromUriComponent, "OTEL_EXPORTER_OTLP_HEADERS").pipe(Config.withDefault({}));
21
+ const requestTimeout = yield* Config.Int("OTEL_EXPORTER_OTLP_TRACES_TIMEOUT").pipe(Config.orElse(() => Config.Int("OTEL_EXPORTER_OTLP_TIMEOUT")), Config.withDefault(10_000));
22
+ const exportInterval = yield* Config.Int("OTEL_BSP_SCHEDULE_DELAY").pipe(Config.withDefault(5000));
23
+ const maxBatchSize = yield* Config.Int("OTEL_BSP_MAX_EXPORT_BATCH_SIZE").pipe(Config.withDefault(1000));
24
+ const exportTimeout = yield* Config.Int("OTEL_BSP_EXPORT_TIMEOUT").pipe(Config.withDefault(3000));
25
+ const tracer = OtlpTracer.layer({
26
+ exportInterval,
27
+ headers,
28
+ maxBatchSize,
29
+ resource: { attributes, serviceName, serviceVersion },
30
+ shutdownTimeout: Math.min(exportTimeout, requestTimeout),
31
+ url: endpoint.toString(),
32
+ }).pipe(Layer.provide(safeOtlpSerialization.pipe(Layer.provide(protocol === "http/protobuf" ? OtlpSerialization.layerProtobuf : OtlpSerialization.layerJson))), Layer.provide(otlpHttpClient(requestTimeout)));
33
+ return redactingTracer(yield* RedactionPolicy).pipe(Layer.provideMerge(tracer));
34
+ }));
35
+ //# sourceMappingURL=otlpTracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlpTracing.js","sourceRoot":"","sources":["../src/otlpTracing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function redactOtlpUrl(value: string, key?: string): string;
2
+ //# sourceMappingURL=redactOtlpUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactOtlpUrl.d.ts","sourceRoot":"","sources":["../src/redactOtlpUrl.ts"],"names":[],"mappings":"AA6BA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAkB7D"}
@@ -0,0 +1,41 @@
1
+ import { REDACTED } from "@shivaedev/errors/sensitive.ts";
2
+ function query(value) {
3
+ return value
4
+ .split("&")
5
+ .map((part) => (part === "" ? part : `${part.split("=", 1)[0]}=${REDACTED}`))
6
+ .join("&");
7
+ }
8
+ function url(value) {
9
+ const fragment = value.indexOf("#");
10
+ const target = fragment === -1 ? value : value.slice(0, fragment);
11
+ const separator = target.indexOf("?");
12
+ return ((separator === -1 ? target : `${target.slice(0, separator + 1)}${query(target.slice(separator + 1))}`).replaceAll(/(?<authority>(?:\b[a-z][a-z0-9+.-]*:)?\/\/)[^/?#]*@/giu, `$<authority>${REDACTED}@`) + (fragment === -1 ? "" : `#${REDACTED}`));
13
+ }
14
+ function structured(value) {
15
+ try {
16
+ return JSON.stringify(JSON.parse(value, (key, item) => (typeof item === "string" ? redactOtlpUrl(item, key) : item)));
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ export function redactOtlpUrl(value, key = "") {
23
+ if (/(?:^|[._-])(?:fragment|userinfo|username|password)$/iu.test(key)) {
24
+ return REDACTED;
25
+ }
26
+ if (/(?:^|[._-])query$/iu.test(key)) {
27
+ return url(`?${value}`).slice(1);
28
+ }
29
+ if (/(?:^|[._-])(?:url|uri|target)(?:$|[._-])/iu.test(key) || /(?:^|[._-])(?:referer|referrer|location|origin)$/iu.test(key)) {
30
+ return url(value);
31
+ }
32
+ if (/^\s*[[{]/u.test(value)) {
33
+ const redacted = structured(value);
34
+ if (redacted !== undefined) {
35
+ return redacted;
36
+ }
37
+ }
38
+ // Quotes and whitespace can belong to secret values, so free text has no safe closing delimiter.
39
+ return value.replaceAll(/(?:[a-z][a-z0-9+.-]*:\/\/|[/?#]).*/gisu, url);
40
+ }
41
+ //# sourceMappingURL=redactOtlpUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactOtlpUrl.js","sourceRoot":"","sources":["../src/redactOtlpUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE1D,SAAS,KAAK,CAAC,KAAa;IAC3B,OAAO,KAAK;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;SAC5E,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,CACN,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAChH,wDAAwD,EACxD,eAAe,QAAQ,GAAG,CAC1B,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAC3C,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAChC,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,IAAa,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxI,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAG,GAAG,EAAE;IACpD,IAAI,uDAAuD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,oDAAoD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9H,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC;IACD,iGAAiG;IACjG,OAAO,KAAK,CAAC,UAAU,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Layer } from "effect";
2
+ import type { SensitiveKey } from "@shivaedev/errors/sensitive.ts";
3
+ export declare function redactRecord(values: Readonly<Record<string, unknown>>, sensitive: SensitiveKey): Record<string, unknown>;
4
+ export declare function redactingDiagnostics(sensitive: SensitiveKey): Layer.Layer<never, never, never>;
5
+ //# sourceMappingURL=redactingDiagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactingDiagnostics.d.ts","sourceRoot":"","sources":["../src/redactingDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,EAAsB,MAAM,QAAQ,CAAC;AAGnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAExH;AACD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,YAAY,oCAwB3D"}
@@ -0,0 +1,25 @@
1
+ import { Context, Effect, ErrorReporter, Layer, Logger, References } from "effect";
2
+ import { redact } from "@shivaedev/errors/redact.ts";
3
+ import { redactDiagnosticCause, redactingErrorReporter } from "@shivaedev/errors/redactCause.ts";
4
+ export function redactRecord(values, sensitive) {
5
+ return Object.fromEntries(Object.entries(values).map(([key, value]) => [key, sensitive(key) ? "<redacted>" : redact(value, sensitive)]));
6
+ }
7
+ export function redactingDiagnostics(sensitive) {
8
+ return Layer.effectContext(Effect.gen(function* () {
9
+ const loggers = yield* Logger.CurrentLoggers;
10
+ const reporters = yield* ErrorReporter.CurrentErrorReporters;
11
+ const safeLoggers = new Set([...loggers].map((logger) => Logger.make((options) => {
12
+ const context = options.fiber.context;
13
+ const annotations = redactRecord(options.fiber.getRef(References.CurrentLogAnnotations), sensitive);
14
+ options.fiber.setContext(Context.add(context, References.CurrentLogAnnotations, annotations));
15
+ try {
16
+ return logger.log({ ...options, cause: redactDiagnosticCause(options.cause, sensitive), message: redact(options.message, sensitive) });
17
+ }
18
+ finally {
19
+ options.fiber.setContext(context);
20
+ }
21
+ })));
22
+ return Context.make(Logger.CurrentLoggers, safeLoggers).pipe(Context.add(ErrorReporter.CurrentErrorReporters, new Set([...reporters].map((reporter) => redactingErrorReporter(reporter, sensitive)))));
23
+ }));
24
+ }
25
+ //# sourceMappingURL=redactingDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactingDiagnostics.js","sourceRoot":"","sources":["../src/redactingDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAGjG,MAAM,UAAU,YAAY,CAAC,MAAyC,EAAE,SAAuB;IAC9F,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1I,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,SAAuB;IAC3D,OAAO,KAAK,CAAC,aAAa,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;QAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,qBAAqB,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAC1B,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACvB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YACtC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,SAAS,CAAC,CAAC;YACpG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC;gBACJ,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YACxI,CAAC;oBAAS,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACF,CAAC,CAAC,CACF,CACD,CAAC;QACF,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CAC3D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,qBAAqB,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,sBAAsB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CACxI,CAAC;IACH,CAAC,CAAC,CACF,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RpcSerialization } from "effect/rpc";
2
+ import { type SensitiveKey } from "@shivaedev/errors/sensitive.ts";
3
+ export declare function redactingRpcSerialization(wire: RpcSerialization.RpcSerialization["Service"], sensitive: SensitiveKey, maskFailure?: (tag: string | undefined, reason: "Fail" | "Die") => boolean): typeof wire;
4
+ //# sourceMappingURL=redactingRpcSerialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactingRpcSerialization.d.ts","sourceRoot":"","sources":["../src/redactingRpcSerialization.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAK7E,wBAAgB,yBAAyB,CACxC,IAAI,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAClD,SAAS,EAAE,YAAY,EACvB,WAAW,GAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,KAAK,OAAqB,GACrF,OAAO,IAAI,CAwEb"}
@@ -0,0 +1,74 @@
1
+ import { Predicate } from "effect";
2
+ import { redactWire } from "@shivaedev/errors/redact.ts";
3
+ import { REDACTED } from "@shivaedev/errors/sensitive.ts";
4
+ function isRequestId(value) {
5
+ return typeof value === "string" || typeof value === "number";
6
+ }
7
+ export function redactingRpcSerialization(wire, sensitive, maskFailure = () => false) {
8
+ function reason(value, tag) {
9
+ const redacted = redactWire(value, sensitive);
10
+ if (Predicate.isObjectOrArray(redacted)) {
11
+ if (Predicate.isTagged(value, "Fail") && maskFailure(tag, "Fail")) {
12
+ return { ...redacted, _tag: "Fail", error: REDACTED };
13
+ }
14
+ if (Predicate.isTagged(value, "Die") && maskFailure(tag, "Die")) {
15
+ return { ...redacted, _tag: "Die", defect: REDACTED };
16
+ }
17
+ }
18
+ if ((Predicate.isTagged(value, "Fail") || Predicate.isTagged(value, "Die") || Predicate.isTagged(value, "Interrupt"))
19
+ && Predicate.isObjectOrArray(redacted)) {
20
+ return { ...redacted, _tag: value._tag };
21
+ }
22
+ return redacted;
23
+ }
24
+ function exit(value, tag) {
25
+ if (Predicate.isTagged(value, "Failure") && Predicate.hasProperty(value, "cause")) {
26
+ const cause = Array.isArray(value.cause) ? value.cause.map((item) => reason(item, tag)) : redactWire(value.cause, sensitive);
27
+ return { ...value, cause };
28
+ }
29
+ return value;
30
+ }
31
+ return {
32
+ ...wire,
33
+ makeUnsafe: () => {
34
+ const parser = wire.makeUnsafe();
35
+ const requests = new Map();
36
+ function response(value) {
37
+ if (Array.isArray(value)) {
38
+ return value.map(response);
39
+ }
40
+ if (Predicate.isTagged(value, "Defect") && Predicate.hasProperty(value, "defect")) {
41
+ return { ...value, defect: maskFailure(undefined, "Die") ? REDACTED : redactWire(value.defect, sensitive) };
42
+ }
43
+ if (Predicate.isTagged(value, "Exit")
44
+ && Predicate.hasProperty(value, "requestId")
45
+ && isRequestId(value.requestId)
46
+ && Predicate.hasProperty(value, "exit")) {
47
+ const tag = requests.get(value.requestId);
48
+ requests.delete(value.requestId);
49
+ return { ...value, exit: exit(value.exit, tag) };
50
+ }
51
+ return value;
52
+ }
53
+ return {
54
+ ...parser,
55
+ decode: (data) => {
56
+ const decoded = parser.decode(data);
57
+ for (const request of decoded) {
58
+ if (Predicate.isTagged(request, "Request")
59
+ && Predicate.hasProperty(request, "id")
60
+ && isRequestId(request.id)
61
+ && Predicate.hasProperty(request, "tag")
62
+ && typeof request.tag === "string"
63
+ && !requests.has(request.id)) {
64
+ requests.set(request.id, request.tag);
65
+ }
66
+ }
67
+ return decoded;
68
+ },
69
+ encode: (value) => parser.encode(response(value)),
70
+ };
71
+ },
72
+ };
73
+ }
74
+ //# sourceMappingURL=redactingRpcSerialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactingRpcSerialization.js","sourceRoot":"","sources":["../src/redactingRpcSerialization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Layer } from "effect";
2
+ import { type SensitiveKey } from "@shivaedev/errors/sensitive.ts";
3
+ export declare function redactingTracer(sensitive: SensitiveKey): Layer.Layer<never, never, never>;
4
+ //# sourceMappingURL=redactingTracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactingTracer.d.ts","sourceRoot":"","sources":["../src/redactingTracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAU,MAAM,QAAQ,CAAC;AAGrD,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAuB7E,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,oCAUtD"}