@shivaedev/server 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +323 -2
- package/dist/AppHostFactory.d.ts +15 -0
- package/dist/AppHostFactory.d.ts.map +1 -0
- package/dist/AppHostFactory.js +2 -0
- package/dist/AppHostFactory.js.map +1 -0
- package/dist/AppHostInput.d.ts +13 -0
- package/dist/AppHostInput.d.ts.map +1 -0
- package/dist/AppHostInput.js +2 -0
- package/dist/AppHostInput.js.map +1 -0
- package/dist/MigrationOptions.d.ts +15 -0
- package/dist/MigrationOptions.d.ts.map +1 -0
- package/dist/MigrationOptions.js +2 -0
- package/dist/MigrationOptions.js.map +1 -0
- package/dist/RedactionPolicy.d.ts +4 -0
- package/dist/RedactionPolicy.d.ts.map +1 -0
- package/dist/RedactionPolicy.js +4 -0
- package/dist/RedactionPolicy.js.map +1 -0
- package/dist/appHost.d.ts +47 -0
- package/dist/appHost.d.ts.map +1 -0
- package/dist/appHost.js +17 -0
- package/dist/appHost.js.map +1 -0
- package/dist/appHostHttp.d.ts +88 -0
- package/dist/appHostHttp.d.ts.map +1 -0
- package/dist/appHostHttp.js +67 -0
- package/dist/appHostHttp.js.map +1 -0
- package/dist/boundedRpcRequest.d.ts +3 -0
- package/dist/boundedRpcRequest.d.ts.map +1 -0
- package/dist/boundedRpcRequest.js +22 -0
- package/dist/boundedRpcRequest.js.map +1 -0
- package/dist/databaseAddress.d.ts +4 -0
- package/dist/databaseAddress.d.ts.map +1 -0
- package/dist/databaseAddress.js +25 -0
- package/dist/databaseAddress.js.map +1 -0
- package/dist/databaseLayer.d.ts +14 -0
- package/dist/databaseLayer.d.ts.map +1 -0
- package/dist/databaseLayer.js +100 -0
- package/dist/databaseLayer.js.map +1 -0
- package/dist/development.d.ts +10 -0
- package/dist/development.d.ts.map +1 -0
- package/dist/development.js +20 -0
- package/dist/development.js.map +1 -0
- package/dist/healthRoute.d.ts +3 -0
- package/dist/healthRoute.d.ts.map +1 -0
- package/dist/healthRoute.js +18 -0
- package/dist/healthRoute.js.map +1 -0
- package/dist/hostChanges.d.ts +7 -0
- package/dist/hostChanges.d.ts.map +1 -0
- package/dist/hostChanges.js +25 -0
- package/dist/hostChanges.js.map +1 -0
- package/dist/hostOptions.d.ts +34 -0
- package/dist/hostOptions.d.ts.map +1 -0
- package/dist/hostOptions.js +2 -0
- package/dist/hostOptions.js.map +1 -0
- package/dist/hostTransport.d.ts +16 -0
- package/dist/hostTransport.d.ts.map +1 -0
- package/dist/hostTransport.js +16 -0
- package/dist/hostTransport.js.map +1 -0
- package/dist/nativeClientOrigins.d.ts +4 -0
- package/dist/nativeClientOrigins.d.ts.map +1 -0
- package/dist/nativeClientOrigins.js +38 -0
- package/dist/nativeClientOrigins.js.map +1 -0
- package/dist/node-http/subscriptionSignal.d.ts +12 -0
- package/dist/node-http/subscriptionSignal.d.ts.map +1 -0
- package/dist/node-http/subscriptionSignal.js +55 -0
- package/dist/node-http/subscriptionSignal.js.map +1 -0
- package/dist/otlpHttpClient.d.ts +4 -0
- package/dist/otlpHttpClient.d.ts.map +1 -0
- package/dist/otlpHttpClient.js +36 -0
- package/dist/otlpHttpClient.js.map +1 -0
- package/dist/otlpTracing.d.ts +3 -0
- package/dist/otlpTracing.d.ts.map +1 -0
- package/dist/otlpTracing.js +35 -0
- package/dist/otlpTracing.js.map +1 -0
- package/dist/redactOtlpUrl.d.ts +2 -0
- package/dist/redactOtlpUrl.d.ts.map +1 -0
- package/dist/redactOtlpUrl.js +41 -0
- package/dist/redactOtlpUrl.js.map +1 -0
- package/dist/redactingDiagnostics.d.ts +5 -0
- package/dist/redactingDiagnostics.d.ts.map +1 -0
- package/dist/redactingDiagnostics.js +25 -0
- package/dist/redactingDiagnostics.js.map +1 -0
- package/dist/redactingRpcSerialization.d.ts +4 -0
- package/dist/redactingRpcSerialization.d.ts.map +1 -0
- package/dist/redactingRpcSerialization.js +74 -0
- package/dist/redactingRpcSerialization.js.map +1 -0
- package/dist/redactingTracer.d.ts +4 -0
- package/dist/redactingTracer.d.ts.map +1 -0
- package/dist/redactingTracer.js +32 -0
- package/dist/redactingTracer.js.map +1 -0
- package/dist/rpc-server/publicConfigLayer.d.ts +4 -0
- package/dist/rpc-server/publicConfigLayer.d.ts.map +1 -0
- package/dist/rpc-server/publicConfigLayer.js +9 -0
- package/dist/rpc-server/publicConfigLayer.js.map +1 -0
- package/dist/runtime/makePlatform.d.ts +4 -0
- package/dist/runtime/makePlatform.d.ts.map +1 -0
- package/dist/runtime/makePlatform.js +65 -0
- package/dist/runtime/makePlatform.js.map +1 -0
- package/dist/runtime/types.d.ts +19 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/safeOtlpSerialization.d.ts +6 -0
- package/dist/safeOtlpSerialization.d.ts.map +1 -0
- package/dist/safeOtlpSerialization.js +67 -0
- package/dist/safeOtlpSerialization.js.map +1 -0
- package/dist/schemaSensitiveKeys.d.ts +5 -0
- package/dist/schemaSensitiveKeys.d.ts.map +1 -0
- package/dist/schemaSensitiveKeys.js +143 -0
- package/dist/schemaSensitiveKeys.js.map +1 -0
- package/dist/setupDatabases.d.ts +3 -0
- package/dist/setupDatabases.d.ts.map +1 -0
- package/dist/setupDatabases.js +12 -0
- package/dist/setupDatabases.js.map +1 -0
- package/dist/tracedGroup.d.ts +4 -0
- package/dist/tracedGroup.d.ts.map +1 -0
- package/dist/tracedGroup.js +13 -0
- package/dist/tracedGroup.js.map +1 -0
- package/package.json +110 -3
- package/src/AppHostFactory.ts +121 -0
- package/src/AppHostInput.ts +74 -0
- package/src/MigrationOptions.ts +15 -0
- package/src/RedactionPolicy.ts +4 -0
- package/src/appHost.ts +117 -0
- package/src/appHostHttp.ts +147 -0
- package/src/boundedRpcRequest.ts +28 -0
- package/src/databaseAddress.ts +25 -0
- package/src/databaseLayer.ts +127 -0
- package/src/development.ts +34 -0
- package/src/healthRoute.ts +27 -0
- package/src/hostChanges.ts +34 -0
- package/src/hostOptions.ts +30 -0
- package/src/hostTransport.ts +26 -0
- package/src/nativeClientOrigins.ts +44 -0
- package/src/node-http/subscriptionSignal.ts +64 -0
- package/src/otlpHttpClient.ts +54 -0
- package/src/otlpTracing.ts +61 -0
- package/src/redactOtlpUrl.ts +48 -0
- package/src/redactingDiagnostics.ts +33 -0
- package/src/redactingRpcSerialization.ts +85 -0
- package/src/redactingTracer.ts +37 -0
- package/src/rpc-server/publicConfigLayer.ts +12 -0
- package/src/runtime/makePlatform.ts +75 -0
- package/src/runtime/types.ts +24 -0
- package/src/safeOtlpSerialization.ts +73 -0
- package/src/schemaSensitiveKeys.ts +148 -0
- package/src/setupDatabases.ts +12 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"hostOptions.js","sourceRoot":"","sources":["../src/hostOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Config, Effect } from "effect";
|
|
2
|
+
interface Options {
|
|
3
|
+
readonly config?: {
|
|
4
|
+
readonly maxBodySize?: number;
|
|
5
|
+
readonly trustedProxy?: string;
|
|
6
|
+
};
|
|
7
|
+
readonly nativeOrigins?: readonly string[];
|
|
8
|
+
readonly policy?: "loopback" | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare const hostTransport: (options: Options) => Effect.Effect<{
|
|
11
|
+
bodySize: number;
|
|
12
|
+
nativeOrigins: readonly string[];
|
|
13
|
+
trustedProxy: string | undefined;
|
|
14
|
+
}, Config.ConfigError, never>;
|
|
15
|
+
export {};
|
|
16
|
+
//# 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,EAAkB,MAAM,QAAQ,CAAC;AAIxD,UAAU,OAAO;IAChB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACzC;AACD,eAAO,MAAM,aAAa;;;;6BAgBxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Config, Effect, Option, Schema } from "effect";
|
|
2
|
+
import { TrustedProxy } from "@shivaedev/identity/server/trustedProxy.ts";
|
|
3
|
+
import { NativeOrigins } from "#nativeClientOrigins.ts";
|
|
4
|
+
export const hostTransport = Effect.fn("Platform.hostTransport")(function* (options) {
|
|
5
|
+
const maxBodySize = options.config?.maxBodySize ?? (yield* Config.Int("MAX_BODY_SIZE").pipe(Config.withDefault(1024 * 1024)));
|
|
6
|
+
const bodySize = yield* Schema.decodeUnknownEffect(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)))(maxBodySize).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
|
|
7
|
+
const trustedProxy = options.policy === "loopback"
|
|
8
|
+
? undefined
|
|
9
|
+
: (options.config?.trustedProxy ?? Option.getOrUndefined(yield* Config.String("TRUSTED_PROXY").pipe(Config.option)));
|
|
10
|
+
if (trustedProxy !== undefined) {
|
|
11
|
+
yield* Schema.decodeUnknownEffect(TrustedProxy)(trustedProxy).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
|
|
12
|
+
}
|
|
13
|
+
const nativeOrigins = yield* Schema.decodeUnknownEffect(NativeOrigins)(options.nativeOrigins ?? []).pipe(Effect.mapError((cause) => new Config.ConfigError(cause)));
|
|
14
|
+
return { bodySize, nativeOrigins, trustedProxy };
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=hostTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostTransport.js","sourceRoot":"","sources":["../src/hostTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAOxD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAgB;IAC3F,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9H,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CACvH,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IACF,MAAM,YAAY,GACjB,OAAO,CAAC,MAAM,KAAK,UAAU;QAC5B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvH,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/H,CAAC;IACD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,CACvG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAClD,CAAC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAA0B,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,SAAS,YAAY,CAAC,OAA4C;IACjE,OAAO,IAAI,eAAe,CAAC,eAAe,CAAC;QAC1C,MAAM,EAAE,IAAI,eAAe,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,OAAO,EAAE,CAAC;KACrG,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAO,GAAG,MAAM;IAC9C,OAAO,KAAK,CAAC,MAAM,CAClB,UAAU,CAAC,UAAU,EACrB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC;QACzC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,SAAS,QAAQ,CAAC,UAAkD;YACnE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC1B,IAAI,MAAM,EAAE,CAAC;oBACZ,OAAO,MAAM,CAAC,IAAI,CAAC;gBACpB,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC1I,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CACjB,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAClD,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAC/C,aAAa,CAAC,IAAI,CACjB,MAAM,CAAC,aAAa,CAAC;YACpB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAChD,CAAC,CACF,CACD,EACD,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3B,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACrD,MAAM,GAAG,KAAK,CAAC;gBACf,OAAO,MAAM,CAAC,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,QAAQ,CACd,QAAQ,CAAC,IAAI,CAAC,IAAI,CACjB,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,mCAAmC,CAAC,EAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAChH,CACD,CAAC;QACH,CAAC,CAAC,EACF,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAC/F,CAAC;IACH,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Effect, Exit, Layer, Tracer } from "effect";
|
|
2
|
+
import { redact } from "@shivaedev/errors/redact.ts";
|
|
3
|
+
import { redactDiagnosticCause } from "@shivaedev/errors/redactCause.ts";
|
|
4
|
+
import { REDACTED } from "@shivaedev/errors/sensitive.ts";
|
|
5
|
+
import { redactRecord } from "#redactingDiagnostics.ts";
|
|
6
|
+
function redactLinks(values, sensitive) {
|
|
7
|
+
return values.map((link) => ({ ...link, attributes: redactRecord(link.attributes, sensitive) }));
|
|
8
|
+
}
|
|
9
|
+
function redactSpan(span, sensitive) {
|
|
10
|
+
const end = span.end.bind(span);
|
|
11
|
+
const attribute = span.attribute.bind(span);
|
|
12
|
+
const event = span.event.bind(span);
|
|
13
|
+
const addLinks = span.addLinks.bind(span);
|
|
14
|
+
return Object.assign(span, {
|
|
15
|
+
addLinks: (values) => addLinks(redactLinks(values, sensitive)),
|
|
16
|
+
attribute: (key, value) => attribute(key, sensitive(key) ? REDACTED : redact(value, sensitive)),
|
|
17
|
+
end: (time, exit) => {
|
|
18
|
+
for (const [key, value] of span.attributes) {
|
|
19
|
+
attribute(key, sensitive(key) ? REDACTED : redact(value, sensitive));
|
|
20
|
+
}
|
|
21
|
+
end(time, Exit.isFailure(exit) ? Exit.failCause(redactDiagnosticCause(exit.cause, sensitive)) : exit);
|
|
22
|
+
},
|
|
23
|
+
event: (name, time, attributes) => event(name, time, attributes && redactRecord(attributes, sensitive)),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function redactingTracer(sensitive) {
|
|
27
|
+
return Layer.effect(Tracer.Tracer, Effect.map(Tracer.Tracer, (tracer) => Tracer.make({
|
|
28
|
+
...tracer,
|
|
29
|
+
span: (options) => redactSpan(tracer.span({ ...options, links: redactLinks(options.links, sensitive) }), sensitive),
|
|
30
|
+
})));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=redactingTracer.js.map
|