effect icon indicating copy to clipboard operation
effect copied to clipboard

allow setting a custom Redacted.toString

Open jessekelly881 opened this issue 1 year ago • 4 comments

Allow setting a custom string when creating redacted values e.g. "REDACTED_TOKEN" which is logged as:

level=INFO msg="permission granted" user=Perry token=REDACTED_TOKEN

Redacted.make("abc", "REDACTED_TOKEN")

This is useful for keeping tract of redacted values between log statements and is a feature provided by a few other logging libraries.

jessekelly881 avatar Nov 20 '24 07:11 jessekelly881

🦋 Changeset detected

Latest commit: 76fca8e30ee5159ec67db2b48d61f8b687de4e29

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 34 packages
Name Type
effect Minor
@effect/cli Major
@effect/cluster-browser Major
@effect/cluster-node Major
@effect/cluster-workflow Major
@effect/cluster Major
@effect/experimental Major
@effect/opentelemetry Major
@effect/platform-browser Major
@effect/platform-bun Major
@effect/platform-node-shared Major
@effect/platform-node Major
@effect/platform Major
@effect/printer-ansi Major
@effect/printer Major
@effect/rpc-http Major
@effect/rpc Major
@effect/sql-clickhouse Major
@effect/sql-d1 Major
@effect/sql-drizzle Major
@effect/sql-kysely Major
@effect/sql-libsql Major
@effect/sql-mssql Major
@effect/sql-mysql2 Major
@effect/sql-pg Major
@effect/sql-sqlite-bun Major
@effect/sql-sqlite-node Major
@effect/sql-sqlite-react-native Major
@effect/sql-sqlite-wasm Major
@effect/sql Major
@effect/typeclass Major
@effect/vitest Major
@effect/ai Major
@effect/ai-openai Major

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

changeset-bot[bot] avatar Nov 20 '24 07:11 changeset-bot[bot]

A better approach might be to use a ref = {} prop on the Redacted object and allow the other meta data on the Redacted object to be changed directly.

jessekelly881 avatar Nov 20 '24 08:11 jessekelly881

I started working on this idea yesterday) I agree that it is convenient. but I came to a slightly different implementation.

proto = {
...
  label: "redacted",
  toString() {
    return `<${this.label}>`
  },
  toJSON() {
    return `<${this.label}>`
  },
  [NodeInspectSymbol]() {
    return `<${this.label}>`
  },
...
}
export const make = <T>(
  value: T,
  options?: {
    label?: string | undefined
  } | undefined
): Redacted.Redacted<T> => {
  const redacted = Object.create(proto)
  if (options?.label !== undefined) {
    redacted.label = options?.label
  }
  redactedRegistry.set(redacted, value)
  return redacted
}

Could you please integrate this idea into this places as well?

  • Schema.Redacted/RedactedFromSelf
  • Config.redacted
  • Options.redacted in cli package

KhraksMamtsov avatar Nov 20 '24 10:11 KhraksMamtsov

I think having a custom string is much better than forcing the "<>" wrapper. I was looking at the Config.redacted implementation as well and I think it makes more sense to use a Redacted.setString fn which can be mapped inside of Config.map, etc. But as far as I can tell that requires having a .ref prop that actually points to the value rather than using the Redacted instance itself as the ref. But at least for the moment this clashes with the deprecated Secret module.

jessekelly881 avatar Nov 20 '24 18:11 jessekelly881