log.mjs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
  2. import { hasOwn } from "./values.mjs";
  3. const levelNumbers = {
  4. off: 0,
  5. error: 200,
  6. warn: 300,
  7. info: 400,
  8. debug: 500,
  9. };
  10. export const parseLogLevel = (maybeLevel, sourceName, client) => {
  11. if (!maybeLevel) {
  12. return undefined;
  13. }
  14. if (hasOwn(levelNumbers, maybeLevel)) {
  15. return maybeLevel;
  16. }
  17. loggerFor(client).warn(`${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify(Object.keys(levelNumbers))}`);
  18. return undefined;
  19. };
  20. function noop() { }
  21. function makeLogFn(fnLevel, logger, logLevel) {
  22. if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) {
  23. return noop;
  24. }
  25. else {
  26. // Don't wrap logger functions, we want the stacktrace intact!
  27. return logger[fnLevel].bind(logger);
  28. }
  29. }
  30. const noopLogger = {
  31. error: noop,
  32. warn: noop,
  33. info: noop,
  34. debug: noop,
  35. };
  36. let cachedLoggers = /* @__PURE__ */ new WeakMap();
  37. export function loggerFor(client) {
  38. const logger = client.logger;
  39. const logLevel = client.logLevel ?? 'off';
  40. if (!logger) {
  41. return noopLogger;
  42. }
  43. const cachedLogger = cachedLoggers.get(logger);
  44. if (cachedLogger && cachedLogger[0] === logLevel) {
  45. return cachedLogger[1];
  46. }
  47. const levelLogger = {
  48. error: makeLogFn('error', logger, logLevel),
  49. warn: makeLogFn('warn', logger, logLevel),
  50. info: makeLogFn('info', logger, logLevel),
  51. debug: makeLogFn('debug', logger, logLevel),
  52. };
  53. cachedLoggers.set(logger, [logLevel, levelLogger]);
  54. return levelLogger;
  55. }
  56. export const formatRequestDetails = (details) => {
  57. if (details.options) {
  58. details.options = { ...details.options };
  59. delete details.options['headers']; // redundant + leaks internals
  60. }
  61. if (details.headers) {
  62. details.headers = Object.fromEntries((details.headers instanceof Headers ? [...details.headers] : Object.entries(details.headers)).map(([name, value]) => [
  63. name,
  64. (name.toLowerCase() === 'x-api-key' ||
  65. name.toLowerCase() === 'authorization' ||
  66. name.toLowerCase() === 'cookie' ||
  67. name.toLowerCase() === 'set-cookie') ?
  68. '***'
  69. : value,
  70. ]));
  71. }
  72. if ('retryOfRequestLogID' in details) {
  73. if (details.retryOfRequestLogID) {
  74. details.retryOf = details.retryOfRequestLogID;
  75. }
  76. delete details.retryOfRequestLogID;
  77. }
  78. return details;
  79. };
  80. //# sourceMappingURL=log.mjs.map