sliftutils 1.4.53 → 1.4.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -763,9 +763,9 @@ declare module "sliftutils/render-utils/observer" {
763
763
  }
764
764
 
765
765
  declare module "sliftutils/storage/BulkDatabase2/BulkDatabase2" {
766
- import { BulkDatabaseBase, ReactiveDeps, BulkDatabase2Config } from "./BulkDatabaseBase";
766
+ import { BulkDatabaseBase, ReactiveDeps, BulkDatabase2Config, BulkFileInfoListing } from "./BulkDatabaseBase";
767
767
  export { BulkDatabaseBase, noopReactiveDeps, bulkDatabase2Timing } from "./BulkDatabaseBase";
768
- export type { ReactiveDeps, StorageFactory, BulkDatabase2Config } from "./BulkDatabaseBase";
768
+ export type { ReactiveDeps, StorageFactory, BulkDatabase2Config, BulkFileDetails, BulkFileEntry, BulkFileInfoListing } from "./BulkDatabaseBase";
769
769
  /** Per-column on-disk size info, as reported by getColumnInfo/getReaderInfo. */
770
770
  export type BulkColumnInfo = {
771
771
  column: string;
@@ -873,15 +873,7 @@ declare module "sliftutils/storage/BulkDatabase2/BulkDatabase2" {
873
873
  * stream files still being appended). `bytes` is the actual on-disk size. Good for showing collection
874
874
  * size/fragmentation and deciding whether to call tryMergeNow()/compact().
875
875
  */
876
- getFileInfo(): Promise<{
877
- files: {
878
- name: string;
879
- type: "bulk" | "stream";
880
- bytes: number;
881
- }[];
882
- count: number;
883
- totalBytes: number;
884
- }>;
876
+ getFileInfo(): Promise<BulkFileInfoListing>;
885
877
  /** Consolidate on-disk files. Optional to call; the database also does this in the background. */
886
878
  compact(): Promise<void>;
887
879
  /**
@@ -1087,16 +1079,24 @@ declare module "sliftutils/storage/BulkDatabase2/BulkDatabaseBase" {
1087
1079
  byteSize: number;
1088
1080
  }[];
1089
1081
  }>;
1090
- getFileInfo(): Promise<{
1091
- files: {
1092
- name: string;
1093
- type: "bulk" | "stream";
1094
- bytes: number;
1095
- }[];
1096
- count: number;
1097
- totalBytes: number;
1098
- }>;
1082
+ getFileInfo(): Promise<BulkFileInfoListing>;
1099
1083
  }
1084
+ export type BulkFileDetails = {
1085
+ keys: string[];
1086
+ minTime: number;
1087
+ maxTime: number;
1088
+ };
1089
+ export type BulkFileEntry = {
1090
+ name: string;
1091
+ type: "bulk" | "stream";
1092
+ bytes: number;
1093
+ getDetails: () => Promise<BulkFileDetails>;
1094
+ };
1095
+ export type BulkFileInfoListing = {
1096
+ files: BulkFileEntry[];
1097
+ count: number;
1098
+ totalBytes: number;
1099
+ };
1100
1100
 
1101
1101
  }
1102
1102
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.4.53",
3
+ "version": "1.4.54",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -1,6 +1,6 @@
1
- import { BulkDatabaseBase, ReactiveDeps, BulkDatabase2Config } from "./BulkDatabaseBase";
1
+ import { BulkDatabaseBase, ReactiveDeps, BulkDatabase2Config, BulkFileInfoListing } from "./BulkDatabaseBase";
2
2
  export { BulkDatabaseBase, noopReactiveDeps, bulkDatabase2Timing } from "./BulkDatabaseBase";
3
- export type { ReactiveDeps, StorageFactory, BulkDatabase2Config } from "./BulkDatabaseBase";
3
+ export type { ReactiveDeps, StorageFactory, BulkDatabase2Config, BulkFileDetails, BulkFileEntry, BulkFileInfoListing } from "./BulkDatabaseBase";
4
4
  /** Per-column on-disk size info, as reported by getColumnInfo/getReaderInfo. */
5
5
  export type BulkColumnInfo = {
6
6
  column: string;
@@ -108,15 +108,7 @@ export interface IBulkDatabase2<T extends {
108
108
  * stream files still being appended). `bytes` is the actual on-disk size. Good for showing collection
109
109
  * size/fragmentation and deciding whether to call tryMergeNow()/compact().
110
110
  */
111
- getFileInfo(): Promise<{
112
- files: {
113
- name: string;
114
- type: "bulk" | "stream";
115
- bytes: number;
116
- }[];
117
- count: number;
118
- totalBytes: number;
119
- }>;
111
+ getFileInfo(): Promise<BulkFileInfoListing>;
120
112
  /** Consolidate on-disk files. Optional to call; the database also does this in the background. */
121
113
  compact(): Promise<void>;
122
114
  /**
@@ -1,9 +1,9 @@
1
1
  import { getFileStorageNested2 } from "../FileFolderAPI";
2
2
  import { observable, runInAction, onBecomeObserved, onBecomeUnobserved } from "../../render-utils/mobxTyped";
3
- import { BulkDatabaseBase, ReactiveDeps, BulkDatabase2Config } from "./BulkDatabaseBase";
3
+ import { BulkDatabaseBase, ReactiveDeps, BulkDatabase2Config, BulkFileInfoListing } from "./BulkDatabaseBase";
4
4
 
5
5
  export { BulkDatabaseBase, noopReactiveDeps, bulkDatabase2Timing } from "./BulkDatabaseBase";
6
- export type { ReactiveDeps, StorageFactory, BulkDatabase2Config } from "./BulkDatabaseBase";
6
+ export type { ReactiveDeps, StorageFactory, BulkDatabase2Config, BulkFileDetails, BulkFileEntry, BulkFileInfoListing } from "./BulkDatabaseBase";
7
7
 
8
8
  /** Per-column on-disk size info, as reported by getColumnInfo/getReaderInfo. */
9
9
  export type BulkColumnInfo = { column: string; byteSize: number };
@@ -96,7 +96,7 @@ export interface IBulkDatabase2<T extends { key: string }> {
96
96
  * stream files still being appended). `bytes` is the actual on-disk size. Good for showing collection
97
97
  * size/fragmentation and deciding whether to call tryMergeNow()/compact().
98
98
  */
99
- getFileInfo(): Promise<{ files: { name: string; type: "bulk" | "stream"; bytes: number }[]; count: number; totalBytes: number }>;
99
+ getFileInfo(): Promise<BulkFileInfoListing>;
100
100
 
101
101
  /** Consolidate on-disk files. Optional to call; the database also does this in the background. */
102
102
  compact(): Promise<void>;
@@ -155,13 +155,21 @@ export declare class BulkDatabaseBase<T extends {
155
155
  byteSize: number;
156
156
  }[];
157
157
  }>;
158
- getFileInfo(): Promise<{
159
- files: {
160
- name: string;
161
- type: "bulk" | "stream";
162
- bytes: number;
163
- }[];
164
- count: number;
165
- totalBytes: number;
166
- }>;
158
+ getFileInfo(): Promise<BulkFileInfoListing>;
167
159
  }
160
+ export type BulkFileDetails = {
161
+ keys: string[];
162
+ minTime: number;
163
+ maxTime: number;
164
+ };
165
+ export type BulkFileEntry = {
166
+ name: string;
167
+ type: "bulk" | "stream";
168
+ bytes: number;
169
+ getDetails: () => Promise<BulkFileDetails>;
170
+ };
171
+ export type BulkFileInfoListing = {
172
+ files: BulkFileEntry[];
173
+ count: number;
174
+ totalBytes: number;
175
+ };
@@ -923,15 +923,55 @@ export class BulkDatabaseBase<T extends { key: string }> {
923
923
  };
924
924
  }
925
925
 
926
- public async getFileInfo(): Promise<{ files: { name: string; type: "bulk" | "stream"; bytes: number }[]; count: number; totalBytes: number }> {
926
+ public async getFileInfo(): Promise<BulkFileInfoListing> {
927
927
  const { bulkFiles, streamFiles } = await this.listFiles();
928
928
  const storage = await this.storage();
929
929
  const sizeOf = async (name: string) => { try { return (await storage.getInfo(name))?.size ?? 0; } catch { return 0; } };
930
- const files = [
931
- ...await Promise.all(bulkFiles.map(async f => ({ name: f.fileName, type: "bulk" as const, bytes: await sizeOf(f.fileName) }))),
932
- ...await Promise.all(streamFiles.map(async f => ({ name: f.fileName, type: "stream" as const, bytes: await sizeOf(f.fileName) }))),
933
- ];
930
+ const bulkInfos = await Promise.all(bulkFiles.map(async f => ({
931
+ name: f.fileName,
932
+ type: "bulk" as const,
933
+ bytes: await sizeOf(f.fileName),
934
+ getDetails: async () => {
935
+ // Bulk: reader has keys + per-row keyTimes + header minTime/maxTime. Cached, so cheap.
936
+ const reader = await loadFileReader(this.name, storage, f, this.subCaches.bulk);
937
+ return { keys: reader.keys, minTime: reader.minTime, maxTime: reader.maxTime };
938
+ },
939
+ })));
940
+ const streamInfos = await Promise.all(streamFiles.map(async f => ({
941
+ name: f.fileName,
942
+ type: "stream" as const,
943
+ bytes: await sizeOf(f.fileName),
944
+ getDetails: async () => {
945
+ // Stream: must parse the file to walk every entry — header has no key/time bounds. Cached.
946
+ const data = await loadStreamEntries(this.name, storage, [f], this.subCaches.stream);
947
+ const keys = new Set<string>();
948
+ let minTime = Infinity, maxTime = -Infinity;
949
+ for (const e of data.entries) {
950
+ if (e.time < minTime) minTime = e.time;
951
+ if (e.time > maxTime) maxTime = e.time;
952
+ if (e.entry.row) keys.add(e.entry.row.key as string);
953
+ else if (e.entry.deletedKey !== undefined) keys.add(e.entry.deletedKey);
954
+ }
955
+ return {
956
+ keys: [...keys],
957
+ minTime: minTime === Infinity ? 0 : minTime,
958
+ maxTime: maxTime === -Infinity ? 0 : maxTime,
959
+ };
960
+ },
961
+ })));
962
+ const files = [...bulkInfos, ...streamInfos];
934
963
  return { files, count: files.length, totalBytes: files.reduce((a, f) => a + f.bytes, 0) };
935
964
  }
936
965
  }
937
966
 
967
+ export type BulkFileDetails = { keys: string[]; minTime: number; maxTime: number };
968
+ export type BulkFileEntry = {
969
+ name: string;
970
+ type: "bulk" | "stream";
971
+ bytes: number;
972
+ // Lazy: pulled from the cached sub-reader for bulk (free if loaded), or from a parse of the stream
973
+ // file (small — tier-0 size-capped, also cached). Call only when you need the per-file detail.
974
+ getDetails: () => Promise<BulkFileDetails>;
975
+ };
976
+ export type BulkFileInfoListing = { files: BulkFileEntry[]; count: number; totalBytes: number };
977
+