{"version":3,"file":"wrapper.cjs","names":["AddonSymbol","PFrameError","#frame","#id","#logger","hashAddColumnEntry","hashColumnId","AbortError","PerfTimer","hashDataQuery","hashUniqueValuesRequestColumnId","#table"],"sources":["../export/wrapper.ts"],"sourcesContent":["import { ulid } from \"ulid\";\nimport {\n  AbortError,\n  PFrameError,\n  type PTableShape,\n  type PTableVector,\n  type TableRange,\n  type UniqueValuesResponse,\n  type DataQuery,\n  ensureError,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { PerfTimer } from \"@milaboratories/helpers\";\nimport type { CancellationTokenSymbol, NodeFrameSymbol, NodeTableSymbol } from \"./addon-def\";\nimport { AddonSymbol } from \"./addon\";\nimport {\n  dump,\n  hashColumnId,\n  hashAddColumnEntry,\n  hashUniqueValuesRequestColumnId,\n  hashDataQuery,\n} from \"./dump\";\n\n/**\n * Run `callback` with a native cancellation token bridged to a JS `AbortSignal`.\n *\n * The abort listener is registered with `{ once: true }` and removed in\n * `finally`, so it is always cleaned up — including when `throwIfAborted`\n * short-circuits an already-aborted signal before the addon is ever called.\n * Detecting whether the operation was actually cancelled is left to the caller\n * via `signal.aborted`.\n */\nasync function callAbortable<T>(\n  callback: (token: CancellationTokenSymbol | undefined) => Promise<T>,\n  signal: AbortSignal | undefined,\n): Promise<T> {\n  if (!signal) {\n    return await callback(undefined);\n  }\n  const token = AddonSymbol.cancellationTokenCreate();\n  const abort = (): void => AddonSymbol.cancellationTokenCancel(token);\n  try {\n    signal.addEventListener(\"abort\", abort, { once: true });\n    signal.throwIfAborted();\n    return await callback(token);\n  } finally {\n    signal.removeEventListener(\"abort\", abort);\n  }\n}\n\nexport async function pprofDump(): Promise<Uint8Array> {\n  try {\n    return await AddonSymbol.pprofDump();\n  } catch (err: unknown) {\n    const error = new PFrameError(`PFrame pprofDump failed`);\n    error.cause = ensureError(err);\n    throw error;\n  }\n}\n\nexport class PFrame implements PFrameInternal.PFrameV18 {\n  readonly #frame: NodeFrameSymbol;\n\n  readonly #id: PFrameInternal.PFrameId;\n\n  get id(): PFrameInternal.PFrameId {\n    return this.#id;\n  }\n\n  readonly #logger: PFrameInternal.Logger;\n\n  constructor(options: PFrameInternal.PFrameOptionsV2) {\n    this.#id = options.frameId;\n    this.#logger = options.logger ?? (() => {});\n\n    dump(\n      [`${this.id}`, `${this.id}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"create\",\n      },\n      this.#logger,\n    );\n\n    try {\n      this.#frame = AddonSymbol.pFrameCreate(options.spillPath, options.logger);\n      this.#logger(\"info\", `PFrame ${this.id} created`);\n    } catch (err: unknown) {\n      const error = new PFrameError(`PFrame creation failed`);\n      error.cause = new Error(\n        `PFrame ${this.id} creation failed, ` +\n          `logger: ${this.#logger?.toString()}, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    }\n  }\n\n  async addColumns(\n    columns: PFrameInternal.AddColumnEntryV2[],\n    ops?: {\n      signal?: AbortSignal;\n    },\n  ): Promise<void> {\n    const requestId = ulid();\n    dump(\n      [`${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"addColumns\",\n        requestData: {\n          columns: columns.map(hashAddColumnEntry),\n        },\n      },\n      this.#logger,\n    );\n\n    for (const column of columns) {\n      const hashedId = hashColumnId(column.id);\n      dump([`${this.id}`, `data`, `${hashedId}.datainfo`], { ...column.data }, this.#logger);\n    }\n\n    try {\n      return await callAbortable(\n        (token) => AddonSymbol.pFrameAddColumns(this.#frame, columns, token),\n        ops?.signal,\n      );\n    } catch (err: unknown) {\n      if (ops?.signal?.aborted) {\n        throw new AbortError(`PFrame ${this.id} addColumns request ${requestId} cancelled`);\n      }\n      const error = new PFrameError(`PFrame addColumns request failed`);\n      error.cause = new Error(\n        `PFrame ${this.id} addColumns request ${requestId} failed, ` +\n          `columns: ${JSON.stringify(columns)}, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    }\n  }\n\n  setDataSource(dataSource: PFrameInternal.PFrameDataSourceV2): void {\n    const requestId = ulid();\n    dump(\n      [`${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"setDataSource\",\n      },\n      this.#logger,\n    );\n\n    const wrappedDataSource = {\n      preloadBlob: async (blobIds: PFrameInternal.PFrameBlobId[]): Promise<void> => {\n        const requestId = ulid();\n        dump(\n          [`${this.id}`, `${requestId}.json`],\n          {\n            timeStamp: Date.now(),\n            requestType: \"preloadBlob\",\n            requestData: {\n              blobIds,\n            },\n          },\n          this.#logger,\n        );\n\n        this.#logger(\n          \"info\",\n          `PFrame ${this.id} preloadBlob started, blobIds: ${JSON.stringify(blobIds)}`,\n        );\n        const timer = PerfTimer.start();\n        try {\n          return await dataSource.preloadBlob(blobIds);\n        } finally {\n          this.#logger(\n            \"info\",\n            `PFrame ${this.id} preloadBlob finished, took ${timer.elapsed()} (${blobIds.length} blobs)`,\n          );\n        }\n      },\n      resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId): Promise<Uint8Array> => {\n        const requestId = ulid();\n        dump(\n          [`${this.id}`, `${requestId}.json`],\n          {\n            timeStamp: Date.now(),\n            requestType: \"resolveBlobContent\",\n            requestData: {\n              blobId,\n            },\n          },\n          this.#logger,\n        );\n\n        const blob = await dataSource.resolveBlobContent(blobId);\n        this.#logger(\"info\", `PFrame ${this.id} resolved blob ${blobId}`);\n        dump([`${this.id}`, `data`, `${blobId}`], blob, this.#logger);\n\n        return blob;\n      },\n      parquetServer: dataSource.parquetServer,\n    };\n\n    try {\n      return AddonSymbol.pFrameSetDataSource(this.#frame, wrappedDataSource);\n    } catch (err: unknown) {\n      const error = new PFrameError(`PFrame setDataSource request failed`);\n      error.cause = new Error(\n        `PFrame ${this.id} setDataSource request ${requestId} failed, ` +\n          `dataSource: ${dataSource.toString()}, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    }\n  }\n\n  dispose(): void {\n    const requestId = ulid();\n    dump(\n      [`${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"dispose\",\n      },\n      this.#logger,\n    );\n\n    try {\n      AddonSymbol.pFrameDispose(this.#frame);\n      this.#logger(\"info\", `PFrame ${this.id} disposed`);\n    } catch (err: unknown) {\n      const error = new PFrameError(`PFrame dispose request failed`);\n      error.cause = new Error(\n        `PFrame ${this.id} dispose request ${requestId} failed, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    }\n  }\n\n  [Symbol.dispose](): void {\n    this.dispose();\n  }\n\n  createTable(tableId: PFrameInternal.PTableId, dataQuery: DataQuery): PTable {\n    const timer = PerfTimer.start();\n    const dumpData = {\n      timeStamp: Date.now(),\n      requestType: \"createTable\",\n      requestData: hashDataQuery(dataQuery),\n    };\n    dump([`${this.id}`, `${tableId}.json`], dumpData, this.#logger);\n    dump([`${this.id}`, `${tableId}`, `${tableId}.json`], dumpData, this.#logger);\n\n    try {\n      const boxed = AddonSymbol.pFrameCreateTable(this.#frame, tableId, dataQuery);\n      return new PTable(this, tableId, boxed, this.#logger);\n    } catch (err: unknown) {\n      const error = new PFrameError(`PFrame createTable request failed`);\n      error.cause = new Error(\n        `PFrame ${this.id} createTable request ${tableId} failed, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    } finally {\n      this.#logger(\n        \"info\",\n        `PFrame ${this.id} createTable request ${tableId} took ${timer.elapsed()}`,\n      );\n    }\n  }\n\n  async getUniqueValues(\n    request: PFrameInternal.UniqueValuesRequestV2,\n    ops?: {\n      signal?: AbortSignal;\n    },\n  ): Promise<UniqueValuesResponse> {\n    const requestId = ulid() as PFrameInternal.PTableId;\n    dump(\n      [`${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"getUniqueValues\",\n        requestData: hashUniqueValuesRequestColumnId(request),\n      },\n      this.#logger,\n    );\n\n    this.#logger(\"info\", `PFrame ${this.id} getUniqueValues request ${requestId} started`);\n    const timer = PerfTimer.start();\n    try {\n      return await callAbortable(\n        (token) => AddonSymbol.pFrameGetUniqueValues(this.#frame, requestId, request, token),\n        ops?.signal,\n      );\n    } catch (err: unknown) {\n      if (ops?.signal?.aborted) {\n        throw new AbortError(`PFrame ${this.id} getUniqueValues request ${requestId} cancelled`);\n      }\n      const error = new PFrameError(`PFrame getUniqueValues request failed`);\n      error.cause = new Error(\n        `PFrame ${this.id} getUniqueValues request ${requestId} failed, ` +\n          `request: ${JSON.stringify(request)}, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    } finally {\n      this.#logger(\n        \"info\",\n        `PFrame ${this.id} getUniqueValues request ${requestId} finished, took ${timer.elapsed()}`,\n      );\n    }\n  }\n}\n\nclass PTable implements PFrameInternal.PTableV12 {\n  readonly #frame: PFrame;\n  readonly #table: NodeTableSymbol;\n\n  readonly #id: string;\n\n  get id(): string {\n    return this.#id;\n  }\n\n  readonly #logger: PFrameInternal.Logger;\n\n  constructor(frame: PFrame, id: string, table: NodeTableSymbol, logger: PFrameInternal.Logger) {\n    this.#frame = frame;\n    this.#table = table;\n    this.#id = id;\n    this.#logger = logger;\n    this.#logger(\"info\", `PTable ${this.id} created`);\n  }\n\n  async getFootprint(ops?: { withPredecessors?: boolean; signal?: AbortSignal }): Promise<number> {\n    const requestId = ulid();\n    dump(\n      [`${this.#frame.id}`, `${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"getFootprint\",\n      },\n      this.#logger,\n    );\n\n    try {\n      return await callAbortable(\n        (token) =>\n          AddonSymbol.pTableGetFootprint(this.#table, ops?.withPredecessors ?? false, token),\n        ops?.signal,\n      );\n    } catch (err: unknown) {\n      if (ops?.signal?.aborted) {\n        throw new AbortError(`PTable ${this.id} getFootprint request ${requestId} cancelled`);\n      }\n      const error = new PFrameError(`PTable getFootprint request failed`);\n      error.cause = new Error(\n        `PTable ${this.id} getFootprint request ${requestId} failed, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    }\n  }\n\n  async getShape(ops?: { signal?: AbortSignal }): Promise<PTableShape> {\n    const requestId = ulid();\n    dump(\n      [`${this.#frame.id}`, `${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"getShape\",\n      },\n      this.#logger,\n    );\n\n    this.#logger(\"info\", `PTable ${this.id} getShape request ${requestId} started`);\n    const timer = PerfTimer.start();\n    try {\n      return await callAbortable(\n        (token) => AddonSymbol.pTableGetShape(this.#table, token),\n        ops?.signal,\n      );\n    } catch (err: unknown) {\n      if (ops?.signal?.aborted) {\n        throw new AbortError(`PTable ${this.id} getShape request ${requestId} cancelled`);\n      }\n      const error = new PFrameError(`PTable getShape request failed`);\n      error.cause = new Error(\n        `PTable ${this.id} getShape request ${requestId} failed, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    } finally {\n      this.#logger(\n        \"info\",\n        `PTable ${this.id} getShape request ${requestId} finished, took ${timer.elapsed()}`,\n      );\n    }\n  }\n\n  async getData(\n    columnIndices: number[],\n    ops?: {\n      range?: TableRange | undefined;\n      signal?: AbortSignal | undefined;\n    },\n  ): Promise<PTableVector[]> {\n    const requestId = ulid() as PFrameInternal.PTableId;\n    dump(\n      [`${this.#frame.id}`, `${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"getData\",\n        requestData: {\n          columnIndices,\n          range: ops?.range ?? null,\n        },\n      },\n      this.#logger,\n    );\n\n    this.#logger(\"info\", `PTable ${this.id} getData request ${requestId} started`);\n    let rowCount = 0;\n    const timer = PerfTimer.start();\n    try {\n      const result = await callAbortable(\n        (token) => AddonSymbol.pTableGetData(this.#table, columnIndices, ops?.range, token),\n        ops?.signal,\n      );\n      rowCount = result[0].data.length;\n      return result;\n    } catch (err: unknown) {\n      if (ops?.signal?.aborted) {\n        throw new AbortError(`PTable ${this.id} getData request ${requestId} cancelled`);\n      }\n      const error = new PFrameError(`PTable getData request failed`);\n      error.cause = new Error(\n        `PTable ${this.id} getData request ${requestId} failed, ` +\n          `columnIndices: ${JSON.stringify(columnIndices)}, ` +\n          `range: ${ops?.range ? JSON.stringify(ops.range) : undefined}, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    } finally {\n      this.#logger(\n        \"info\",\n        `PTable ${this.id} getData request ${requestId} finished, took ${timer.elapsed()} (${rowCount} rows)`,\n      );\n    }\n  }\n\n  async export(\n    path: string,\n    ops?: {\n      headers: [number, string][];\n      signal?: AbortSignal;\n    },\n  ): Promise<void> {\n    const headers = ops?.headers ?? [];\n    const requestId = ulid() as PFrameInternal.PTableId;\n    dump(\n      [`${this.#frame.id}`, `${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"export\",\n        requestData: {\n          path,\n          headers,\n        },\n      },\n      this.#logger,\n    );\n\n    this.#logger(\"info\", `PTable ${this.id} export request ${requestId} started`);\n    const timer = PerfTimer.start();\n    try {\n      return await callAbortable(\n        (token) => AddonSymbol.pTableExport(this.#table, path, headers, token),\n        ops?.signal,\n      );\n    } catch (err: unknown) {\n      if (ops?.signal?.aborted) {\n        throw new AbortError(`PTable ${this.id} export request ${requestId} cancelled`);\n      }\n      const error = new PFrameError(`PTable export request failed`);\n      error.cause = new Error(\n        `PTable ${this.id} export request ${requestId} failed, ` +\n          `path: ${path}, ` +\n          `headers: ${JSON.stringify(headers)}, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    } finally {\n      this.#logger(\n        \"info\",\n        `PTable ${this.id} export request ${requestId} finished, took ${timer.elapsed()}`,\n      );\n    }\n  }\n\n  dispose() {\n    const requestId = ulid();\n    dump(\n      [`${this.#frame.id}`, `${this.id}`, `${requestId}.json`],\n      {\n        timeStamp: Date.now(),\n        requestType: \"dispose\",\n      },\n      this.#logger,\n    );\n\n    try {\n      AddonSymbol.pTableDispose(this.#table);\n      this.#logger(\"info\", `PTable ${this.id} disposed`);\n    } catch (err: unknown) {\n      const error = new PFrameError(`PTable dispose request failed`);\n      error.cause = new Error(\n        `PTable ${this.id} dispose request ${requestId} failed, ` +\n          `error:\\n` +\n          `${ensureError(err)}`,\n      );\n      throw error;\n    }\n  }\n\n  [Symbol.dispose]() {\n    this.dispose();\n  }\n}\n"],"mappings":"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"}