{"version":3,"file":"StreamingDataFrame.cjs","sources":["../../../src/dataframe/StreamingDataFrame.ts"],"sourcesContent":["import { AlignedData } from 'uplot';\n\nimport { join } from '../transformations/transformers/joinDataFrames';\nimport { Labels, QueryResultMeta } from '../types/data';\nimport { FieldDTO, DataFrame, Field, FieldType } from '../types/dataFrame';\nimport { parseLabels } from '../utils/labels';\nimport { renderLegendFormat } from '../utils/legend';\n\nimport { DataFrameJSON, decodeFieldValueEntities, FieldSchema } from './DataFrameJSON';\nimport { guessFieldTypeFromValue, toFilteredDataFrameDTO } from './processDataFrame';\n\n/**\n * Indicate if the frame is appened or replace\n *\n * @alpha\n */\nexport enum StreamingFrameAction {\n  Append = 'append',\n  Replace = 'replace',\n}\n\n/**\n * @alpha\n * */\nexport interface StreamingFrameOptions {\n  maxLength: number; // 1000\n  maxDelta: number; // how long to keep things\n  action: StreamingFrameAction; // default will append\n\n  /** optionally format field names based on labels */\n  displayNameFormat?: string;\n}\n\n/**\n * Stream packet info is attached to StreamingDataFrames and indicate how many\n * rows were added to the end of the frame.  The number of discarded rows can be\n * calculated from previous state\n */\nexport interface StreamPacketInfo {\n  number: number;\n  action: StreamingFrameAction;\n  length: number;\n  schemaChanged: boolean;\n}\n\nconst PROM_STYLE_METRIC_LABEL = '__name__';\n\nenum PushMode {\n  wide,\n  labels,\n  // long\n}\n\nexport type SerializedStreamingDataFrame = {\n  name?: string;\n  fields: FieldDTO[];\n  refId?: string;\n  meta: QueryResultMeta;\n  schemaFields: FieldSchema[];\n  timeFieldIndex: number;\n  pushMode: PushMode;\n  length: number;\n  packetInfo: StreamPacketInfo;\n  options: StreamingFrameOptions;\n  labels: Set<string>;\n};\n\n/**\n * Unlike a circular buffer, this will append and periodically slice the front\n */\nexport class StreamingDataFrame implements DataFrame {\n  name?: string;\n  refId?: string;\n  meta: QueryResultMeta = {};\n\n  fields: Field[] = [];\n  length = 0;\n\n  private schemaFields: FieldSchema[] = [];\n  private timeFieldIndex = -1;\n  private pushMode = PushMode.wide;\n\n  // current labels\n  private labels: Set<string> = new Set();\n  readonly packetInfo: StreamPacketInfo = {\n    schemaChanged: true,\n    number: 0,\n    action: StreamingFrameAction.Replace,\n    length: 0,\n  };\n\n  private constructor(public options: StreamingFrameOptions) {\n    // Get Length to show up if you use spread\n    Object.defineProperty(this, 'length', {\n      enumerable: true,\n    });\n\n    // Get fields to show up if you use spread\n    Object.defineProperty(this, 'fields', {\n      enumerable: true,\n    });\n  }\n\n  serialize = (\n    fieldPredicate?: (f: Field) => boolean,\n    optionsOverride?: Partial<StreamingFrameOptions>,\n    trimValues?: {\n      maxLength?: number;\n    }\n  ): SerializedStreamingDataFrame => {\n    const options = optionsOverride ? Object.assign({}, { ...this.options, ...optionsOverride }) : this.options;\n    const dataFrameDTO = toFilteredDataFrameDTO(this, fieldPredicate);\n\n    const numberOfItemsToRemove = getNumberOfItemsToRemove(\n      dataFrameDTO.fields.map((f) => f.values ?? []),\n      typeof trimValues?.maxLength === 'number' ? Math.min(trimValues.maxLength, options.maxLength) : options.maxLength,\n      this.timeFieldIndex,\n      options.maxDelta\n    );\n\n    dataFrameDTO.fields = dataFrameDTO.fields.map((f) => ({\n      ...f,\n      values: f.values?.slice(numberOfItemsToRemove),\n    }));\n\n    const length = dataFrameDTO.fields[0]?.values?.length ?? 0;\n\n    return {\n      ...dataFrameDTO,\n      // TODO: Labels and schema are not filtered by field\n      labels: this.labels,\n      schemaFields: this.schemaFields,\n\n      name: this.name,\n      refId: this.refId,\n      meta: this.meta,\n      length,\n      timeFieldIndex: this.timeFieldIndex,\n      pushMode: this.pushMode,\n      packetInfo: this.packetInfo,\n      options,\n    };\n  };\n\n  private initFromSerialized = (serialized: Omit<SerializedStreamingDataFrame, 'options'>) => {\n    this.name = serialized.name;\n    this.refId = serialized.refId;\n    this.meta = serialized.meta;\n    this.length = serialized.length;\n    this.labels = serialized.labels;\n    this.schemaFields = serialized.schemaFields;\n    this.timeFieldIndex = serialized.timeFieldIndex;\n    this.pushMode = serialized.pushMode;\n    this.packetInfo.length = serialized.packetInfo.length;\n    this.packetInfo.number = serialized.packetInfo.number;\n    this.packetInfo.action = StreamingFrameAction.Replace;\n    this.packetInfo.schemaChanged = true;\n    this.fields = serialized.fields.map((f) => ({\n      ...f,\n      type: f.type ?? FieldType.other,\n      config: f.config ?? {},\n      values: f.values ?? [],\n    }));\n\n    assureValuesAreWithinLengthLimit(\n      this.fields.map((f) => f.values),\n      this.options.maxLength,\n      this.timeFieldIndex,\n      this.options.maxDelta\n    );\n  };\n\n  static deserialize = (serialized: SerializedStreamingDataFrame) => {\n    const frame = new StreamingDataFrame(serialized.options);\n    frame.initFromSerialized(serialized);\n    return frame;\n  };\n\n  static empty = (opts?: Partial<StreamingFrameOptions>): StreamingDataFrame =>\n    new StreamingDataFrame(getStreamingFrameOptions(opts));\n\n  static fromDataFrameJSON = (frame: DataFrameJSON, opts?: Partial<StreamingFrameOptions>): StreamingDataFrame => {\n    const streamingDataFrame = new StreamingDataFrame(getStreamingFrameOptions(opts));\n    streamingDataFrame.push(frame);\n    return streamingDataFrame;\n  };\n\n  private get alwaysReplace() {\n    return this.options.action === StreamingFrameAction.Replace;\n  }\n\n  needsResizing = ({ maxLength, maxDelta }: StreamingFrameOptions) => {\n    const needsMoreLength = maxLength && this.options.maxLength < maxLength;\n    const needsBiggerDelta = maxDelta && this.options.maxDelta < maxDelta;\n    const needsToOverrideDefaultInfinityDelta = maxDelta && this.options.maxDelta === Infinity;\n    return Boolean(needsMoreLength || needsBiggerDelta || needsToOverrideDefaultInfinityDelta);\n  };\n\n  resize = ({ maxLength, maxDelta }: Partial<StreamingFrameOptions>) => {\n    if (maxDelta) {\n      if (this.options.maxDelta === Infinity) {\n        this.options.maxDelta = maxDelta;\n      } else {\n        this.options.maxDelta = Math.max(maxDelta, this.options.maxDelta);\n      }\n    }\n    this.options.maxLength = Math.max(this.options.maxLength, maxLength ?? 0);\n  };\n\n  /**\n   * apply the new message to the existing data.  This will replace the existing schema\n   * if a new schema is included in the message, or append data matching the current schema\n   */\n  push(msg: DataFrameJSON): StreamPacketInfo {\n    const { schema, data } = msg;\n\n    this.packetInfo.number++;\n    this.packetInfo.length = 0;\n    this.packetInfo.schemaChanged = false;\n\n    if (schema) {\n      this.pushMode = PushMode.wide;\n      this.timeFieldIndex = schema.fields.findIndex((f) => f.type === FieldType.time);\n      const firstField = schema.fields[0];\n      if (\n        this.timeFieldIndex === 1 &&\n        firstField.type === FieldType.string &&\n        (firstField.name === 'labels' || firstField.name === 'Labels')\n      ) {\n        this.pushMode = PushMode.labels;\n        this.timeFieldIndex = 0; // after labels are removed!\n      }\n\n      const niceSchemaFields = this.pushMode === PushMode.labels ? schema.fields.slice(1) : schema.fields;\n\n      this.refId = schema.refId;\n      if (schema.meta) {\n        this.meta = { ...schema.meta };\n      }\n\n      const { displayNameFormat } = this.options;\n      if (hasSameStructure(this.schemaFields, niceSchemaFields)) {\n        const len = niceSchemaFields.length;\n        this.fields.forEach((f, idx) => {\n          const sf = niceSchemaFields[idx % len];\n          f.config = sf.config ?? {};\n          f.labels = sf.labels;\n        });\n        if (displayNameFormat) {\n          this.fields.forEach((f) => {\n            const labels = { [PROM_STYLE_METRIC_LABEL]: f.name, ...f.labels };\n            f.config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n          });\n        }\n      } else {\n        this.packetInfo.schemaChanged = true;\n        const isWide = this.pushMode === PushMode.wide;\n        this.fields = niceSchemaFields.map((f) => {\n          const config = f.config ?? {};\n          if (displayNameFormat) {\n            const labels = { [PROM_STYLE_METRIC_LABEL]: f.name, ...f.labels };\n            config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n          }\n          return {\n            config,\n            name: f.name,\n            labels: f.labels,\n            type: f.type ?? FieldType.other,\n            // transfer old values by type & name, unless we relied on labels to match fields\n            values: isWide\n              ? (this.fields.find((of) => of.name === f.name && f.type === of.type)?.values ??\n                Array(this.length).fill(undefined))\n              : [],\n          };\n        });\n      }\n\n      this.schemaFields = niceSchemaFields;\n    }\n\n    if (data && data.values.length && data.values[0].length) {\n      let { values, entities } = data;\n\n      if (entities) {\n        entities.forEach((ents, i) => {\n          if (ents) {\n            decodeFieldValueEntities(ents, values[i]);\n            // TODO: append replacements to field\n          }\n        });\n      }\n\n      if (this.pushMode === PushMode.labels) {\n        // augment and transform data to match current schema for standard circPush() path\n        const labeledTables = transpose(values);\n\n        // make sure fields are initalized for each label\n        for (const label of labeledTables.keys()) {\n          if (!this.labels.has(label)) {\n            this.packetInfo.schemaChanged = true;\n            this.addLabel(label);\n          }\n        }\n\n        // TODO: cache higher up\n        let dummyTable = Array(this.schemaFields.length).fill([]);\n\n        let tables: AlignedData[] = [];\n        this.labels.forEach((label) => {\n          tables.push(labeledTables.get(label) ?? dummyTable);\n        });\n\n        values = join(tables);\n      }\n\n      if (values.length !== this.fields.length) {\n        if (this.fields.length) {\n          throw new Error(\n            `push message mismatch.  Expected: ${this.fields.length}, received: ${values.length} (labels=${\n              this.pushMode === PushMode.labels\n            })`\n          );\n        }\n\n        this.fields = values.map((vals, idx) => {\n          let name = `Field ${idx}`;\n          let type = guessFieldTypeFromValue(vals[0]);\n          const isTime = idx === 0 && type === FieldType.number && (vals as number[])[0] > 1600016688632;\n          if (isTime) {\n            type = FieldType.time;\n            name = 'Time';\n          }\n\n          return {\n            name,\n            type,\n            config: {},\n            values: [],\n          };\n        });\n      }\n\n      let appended = values;\n      this.packetInfo.length = values[0].length;\n\n      if (this.alwaysReplace || !this.length) {\n        this.packetInfo.action = StreamingFrameAction.Replace;\n      } else {\n        this.packetInfo.action = StreamingFrameAction.Append;\n\n        // mutates appended\n        appended = this.fields.map((f) => f.values);\n        circPush(appended, values, this.options.maxLength, this.timeFieldIndex, this.options.maxDelta);\n      }\n\n      appended.forEach((v, i) => {\n        const field = this.fields[i];\n        const { state } = field;\n        field.values = v;\n        if (state) {\n          state.calcs = undefined;\n        }\n      });\n\n      // Update the frame length\n      this.length = appended[0].length;\n    }\n\n    return {\n      ...this.packetInfo,\n    };\n  }\n\n  pushNewValues = (values: unknown[][]) => {\n    if (!values?.length) {\n      return;\n    }\n\n    this.packetInfo.action = this.options.action;\n    this.packetInfo.number++;\n    this.packetInfo.length = values[0].length;\n    this.packetInfo.schemaChanged = false;\n\n    if (this.options.action === StreamingFrameAction.Append) {\n      circPush(\n        this.fields.map((f) => f.values),\n        values,\n        this.options.maxLength,\n        this.timeFieldIndex,\n        this.options.maxDelta\n      );\n    } else {\n      values.forEach((v, i) => {\n        if (this.fields[i]) {\n          this.fields[i].values = v;\n        }\n      });\n\n      assureValuesAreWithinLengthLimit(\n        this.fields.map((f) => f.values),\n        this.options.maxLength,\n        this.timeFieldIndex,\n        this.options.maxDelta\n      );\n    }\n    const newLength = this.fields?.[0]?.values.length;\n    if (newLength !== undefined) {\n      this.length = newLength;\n    }\n  };\n\n  resetStateCalculations = () => {\n    this.fields.forEach((f) => {\n      f.state = {\n        ...(f.state ?? {}),\n        calcs: undefined,\n        range: undefined,\n      };\n    });\n  };\n\n  getMatchingFieldIndexes = (fieldPredicate: (f: Field) => boolean): number[] =>\n    this.fields.map((f, index) => (fieldPredicate(f) ? index : undefined)).filter((val) => val !== undefined);\n\n  getValuesFromLastPacket = (): unknown[][] =>\n    this.fields.map((f) => {\n      const values = f.values;\n      return values.slice(Math.max(values.length - this.packetInfo.length));\n    });\n\n  hasAtLeastOnePacket = () => Boolean(this.packetInfo.length);\n\n  // adds a set of fields for a new label\n  private addLabel(label: string) {\n    const { displayNameFormat } = this.options;\n    const labelCount = this.labels.size;\n\n    // parse labels\n    const parsedLabels = parseLabelsFromField(label);\n\n    if (labelCount === 0) {\n      // mutate existing fields and add labels\n      this.fields.forEach((f, i) => {\n        if (i > 0) {\n          f.labels = parsedLabels;\n          if (displayNameFormat) {\n            const labels = { [PROM_STYLE_METRIC_LABEL]: f.name, ...parsedLabels };\n            f.config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n          }\n        }\n      });\n    } else {\n      for (let i = 1; i < this.schemaFields.length; i++) {\n        let proto = this.schemaFields[i] as Field;\n        const config = proto.config ?? {};\n        if (displayNameFormat) {\n          const labels = { [PROM_STYLE_METRIC_LABEL]: proto.name, ...parsedLabels };\n          config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n        }\n        this.fields.push({\n          ...proto,\n          config,\n          labels: parsedLabels,\n          values: Array(this.length).fill(undefined),\n        });\n      }\n    }\n\n    this.labels.add(label);\n  }\n\n  getOptions = (): Readonly<StreamingFrameOptions> => this.options;\n}\n\nexport function getStreamingFrameOptions(opts?: Partial<StreamingFrameOptions>): StreamingFrameOptions {\n  return {\n    maxLength: opts?.maxLength ?? 1000,\n    maxDelta: opts?.maxDelta ?? Infinity,\n    action: opts?.action ?? StreamingFrameAction.Append,\n    displayNameFormat: opts?.displayNameFormat,\n  };\n}\n\n// converts vertical insertion records with table keys in [0] and column values in [1...N]\n// to join()-able tables with column arrays\nexport function transpose(vrecs: unknown[][]) {\n  let tableKeys = new Set(vrecs[0]);\n  let tables = new Map();\n\n  tableKeys.forEach((key) => {\n    let cols = Array(vrecs.length - 1)\n      .fill(null)\n      .map(() => []);\n\n    tables.set(key, cols);\n  });\n\n  for (let r = 0; r < vrecs[0].length; r++) {\n    let table = tables.get(vrecs[0][r]);\n    for (let c = 1; c < vrecs.length; c++) {\n      table[c - 1].push(vrecs[c][r]);\n    }\n  }\n\n  return tables;\n}\n\n// binary search for index of closest value\nexport function closestIdx(num: number, arr: number[], lo?: number, hi?: number) {\n  let mid;\n  lo = lo || 0;\n  hi = hi || arr.length - 1;\n  let bitwise = hi <= 2147483647;\n\n  while (hi - lo > 1) {\n    mid = bitwise ? (lo + hi) >> 1 : Math.floor((lo + hi) / 2);\n\n    if (arr[mid] < num) {\n      lo = mid;\n    } else {\n      hi = mid;\n    }\n  }\n\n  if (num - arr[lo] <= arr[hi] - num) {\n    return lo;\n  }\n\n  return hi;\n}\n\nexport function parseLabelsFromField(str: string): Labels {\n  if (!str.length) {\n    return {};\n  }\n  if (str.charAt(0) === '{') {\n    return parseLabels(str);\n  }\n  const parsedLabels: Labels = {};\n  str.split(',').forEach((kv) => {\n    const [key, val] = kv.trim().split('=');\n    parsedLabels[key] = val;\n  });\n  return parsedLabels;\n}\n\n/**\n * @internal // not exported in yet\n */\nexport function getLastStreamingDataFramePacket(frame: DataFrame) {\n  if (frame instanceof StreamingDataFrame) {\n    const pi = frame.packetInfo;\n    return pi.action;\n  }\n  return undefined;\n}\n\n// mutable circular push\nfunction circPush(data: unknown[][], newData: unknown[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n  for (let i = 0; i < data.length; i++) {\n    for (let k = 0; k < newData[i].length; k++) {\n      data[i].push(newData[i][k]);\n    }\n  }\n\n  return assureValuesAreWithinLengthLimit(data, maxLength, deltaIdx, maxDelta);\n}\n\nfunction assureValuesAreWithinLengthLimit(data: unknown[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n  const count = getNumberOfItemsToRemove(data, maxLength, deltaIdx, maxDelta);\n\n  if (count) {\n    for (let i = 0; i < data.length; i++) {\n      data[i].splice(0, count);\n    }\n  }\n\n  return count;\n}\n\nfunction getNumberOfItemsToRemove(data: unknown[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n  if (!data[0]?.length) {\n    return 0;\n  }\n\n  const nlen = data[0].length;\n\n  let sliceIdx = 0;\n\n  if (nlen > maxLength) {\n    sliceIdx = nlen - maxLength;\n  }\n\n  if (maxDelta !== Infinity && deltaIdx >= 0) {\n    const deltaLookup = data[deltaIdx] as number[];\n\n    const low = deltaLookup[sliceIdx];\n    const high = deltaLookup[nlen - 1];\n\n    if (high - low > maxDelta) {\n      sliceIdx = closestIdx(high - maxDelta, deltaLookup, sliceIdx);\n    }\n  }\n\n  return sliceIdx;\n}\n\nfunction hasSameStructure(a: FieldSchema[], b: FieldSchema[]): boolean {\n  if (a?.length !== b.length) {\n    return false;\n  }\n  for (let i = 0; i < a.length; i++) {\n    const fA = a[i];\n    const fB = b[i];\n    if (fA.name !== fB.name || fA.type !== fB.type) {\n      return false;\n    }\n  }\n  return true;\n}\n"],"names":["StreamingFrameAction","PushMode","toFilteredDataFrameDTO","_a","FieldType","renderLegendFormat","decodeFieldValueEntities","join","guessFieldTypeFromValue","parseLabels"],"mappings":"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"}