{"version":3,"sources":["../../../src/shared/logging/logEvents.ts"],"names":["isTagNotification","notification","isLogNotification","tagsFromLogOn","notifications","filter","logOnFromParam","on","Array","isArray","set","Set","entry","buildSimpleLog","paramsRaw","info","params","description","prefix","tags","logger","log","value","suffix","error","err","buildAuditLog","lastValue","logEventsParams","arg","defaultLogger","logEvents","project","logOn","observables","isObservable","operator","includes","length","pipe","stream","shared","taggedLogEventsFactory","startWith","fn","taggedlogEvents","withTags","extraTags","createTaggedLogEvents"],"mappings":"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","sourcesContent":["import { OperatorFunction, Observable, merge, isObservable, empty } from 'rxjs';\nimport { BasicLogger, defaultBasicLogger } from './basicLogger';\nimport {\n  TagNotification,\n  executeOnNotifications,\n  NotificationInfo,\n} from '../notifications';\nimport { registerError } from '../registerError';\nimport { onLoggingAudit } from './loggingAuditAction';\nimport { mapTo, ignoreElements, publish } from 'rxjs/operators';\n\nexport type LogNotification = TagNotification | 'audit';\n\nexport interface ILogTextParams {\n  prefix: string;\n  tags?: unknown[];\n  suffix?: unknown[];\n}\n\nexport type LogOn<K extends string = string> = Array<\n  LogNotification | Observable<K>\n>;\n\nexport interface ILogStreamParamsCore<T, Y> extends ILogTextParams {\n  on?: LogOn;\n  project?: (stream: Observable<T>) => Observable<Y>;\n  logger?: BasicLogger;\n}\n\nexport type LogTextParamsMap = Partial<Record<LogNotification, ILogTextParams>>;\n\nexport type LogStreamParams<T, Y> = ILogStreamParamsCore<T, Y> &\n  LogTextParamsMap;\n\nfunction isTagNotification(\n  notification: LogNotification\n): notification is TagNotification {\n  return notification !== 'audit';\n}\n\nfunction isLogNotification(\n  notification: LogNotification | Observable<string>\n): notification is TagNotification {\n  return typeof notification === 'string';\n}\n\nfunction tagsFromLogOn(notifications: LogOn): TagNotification[] {\n  return notifications.filter(isTagNotification);\n}\n\nfunction logOnFromParam(on?: LogOn): LogOn {\n  if (Array.isArray(on)) {\n    const set = new Set<LogNotification>(on.filter(isLogNotification));\n    return [...set, ...on.filter(entry => !isLogNotification(entry))];\n  } else {\n    // default:\n    return ['next', 'error', 'complete', 'subscribe', 'unsubscribe'];\n  }\n}\n\nconst buildSimpleLog = <T, Y>(\n  paramsRaw: LogStreamParams<T, Y> & { logger: BasicLogger }\n) => {\n  return (info: NotificationInfo<T | Y, 'audit'>) => {\n    const params = {\n      ...paramsRaw,\n      ...paramsRaw[info.notification],\n    };\n\n    try {\n      const description = [\n        params.prefix,\n        `(${info.notification})`,\n        ...(params.tags || []),\n      ];\n\n      switch (info.notification) {\n        case 'next':\n          params.logger.log(\n            ...description,\n            info.value,\n            ...(params.suffix ?? [])\n          );\n          break;\n        case 'error':\n          params.logger.error(\n            ...description,\n            info.error,\n            ...(params.suffix ?? [])\n          );\n          break;\n        default:\n          params.logger.log(...description, ...(params.suffix ?? []));\n          break;\n      }\n    } catch (err) {\n      registerError(err);\n      params.logger.error('💥  Something bad happened when logging', err);\n    }\n  };\n};\n\nconst buildAuditLog = <T, Y>(\n  paramsRaw: LogStreamParams<T, Y> & { logger: BasicLogger }\n) => (info: NotificationInfo<T | Y, 'audit'>) => {\n  const params = {\n    ...paramsRaw,\n    ...paramsRaw[info.notification],\n  };\n\n  try {\n    const description = [params.prefix, ...(params.tags || [])];\n\n    switch (info.notification) {\n      case 'audit':\n        if (!info.lastValue) {\n          break;\n        }\n        params.logger.log(\n          ...description,\n          'last-observed:',\n          info.lastValue,\n          ...(params.suffix ?? [])\n        );\n        break;\n      case 'unsubscribe':\n        params.logger.log(\n          ...description,\n          'last-observed:',\n          info.lastValue,\n          ...(params.suffix ?? [])\n        );\n        break;\n      case 'next':\n        params.logger.log(...description, info.value, ...(params.suffix ?? []));\n        break;\n      case 'error':\n        params.logger.log(...description, info.error, ...(params.suffix ?? []));\n        break;\n      default:\n        params.logger.log(...description, ...(params.suffix ?? []));\n        break;\n    }\n  } catch (err) {\n    registerError(err);\n    params.logger.error('💥  Something bad happened when logging', err);\n  }\n};\n\nexport type LogEventsArg<T, Y> = LogStreamParams<T, Y> | string;\n\nexport function logEventsParams<T, Y>(\n  arg: LogEventsArg<T, Y>,\n  defaultLogger = defaultBasicLogger()\n): LogStreamParams<T, Y> & { logger: BasicLogger } {\n  return {\n    logger: defaultLogger,\n    ...(typeof arg === 'string'\n      ? {\n          prefix: arg,\n        }\n      : arg),\n  };\n}\n\nexport function logEvents<T, Y>(\n  paramsRaw: LogEventsArg<T, Y>\n): OperatorFunction<T, T> {\n  const params = logEventsParams<T, Y>(paramsRaw);\n\n  const project = params.project;\n  const logOn = logOnFromParam(params.on);\n  const tags = tagsFromLogOn(logOn);\n  const observables = logOn.filter(isObservable) as Array<Observable<string>>;\n\n  // When the triggering event is another observable we want to\n  // log the latest value from source stream\n  const operator =\n    logOn.includes('audit') || observables.length > 0\n      ? executeOnNotifications(\n          [\n            ...tags,\n            (logOn.includes('audit') &&\n              onLoggingAudit().pipe(mapTo('audit' as const))) ||\n              empty(),\n          ],\n          buildAuditLog(params),\n          params.logger\n        )\n      : executeOnNotifications(tags, buildSimpleLog(params), params.logger);\n\n  if (!project) {\n    return stream => stream.pipe(operator);\n  } else {\n    return stream =>\n      stream.pipe(\n        publish(shared =>\n          merge(shared, shared.pipe(project, operator, ignoreElements()))\n        )\n      );\n  }\n}\n\nexport type LogEventsOperator<T, Y> = (\n  paramsRaw: LogEventsArg<T, Y>\n) => OperatorFunction<T, T>;\n\nfunction taggedLogEventsFactory(\n  startWith: unknown[] = [],\n  logger: BasicLogger = defaultBasicLogger(),\n  fn = logEvents\n) {\n  const tags = [...startWith];\n  const taggedlogEvents = <T, Y>(paramsRaw: LogEventsArg<T, Y>) => {\n    const params = logEventsParams(paramsRaw, logger);\n    return fn<T, Y>({\n      ...params,\n      tags: [...(params.tags ?? []), ...tags],\n    });\n  };\n  taggedlogEvents.withTags = (...extraTags: unknown[]) => {\n    return taggedLogEventsFactory([...tags, ...extraTags], logger, fn);\n  };\n  return taggedlogEvents;\n}\n\nexport function createTaggedLogEvents(\n  tags: unknown[],\n  logger = defaultBasicLogger()\n) {\n  return taggedLogEventsFactory(tags, logger);\n}\n\nexport type TaggedLogEventsOperator = ReturnType<typeof createTaggedLogEvents>;\n"],"file":"logEvents.js"}