@milaboratories/pl-middle-layer 1.43.12 → 1.43.13

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.
@@ -36,7 +36,8 @@ const DefaultDriverKitOpsSettings = {
36
36
  pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores
37
37
  pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI
38
38
  pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame
39
- pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache
39
+ pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at lease 2GB)
40
+ pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at lease 8GB)
40
41
  },
41
42
  };
42
43
  function DefaultDriverKitOpsPaths(workDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"ops.cjs","sources":["../../src/middle_layer/ops.ts"],"sourcesContent":["import type { TemporalSynchronizedTreeOps } from './types';\nimport type {\n DownloadBlobToURLDriverOps,\n DownloadDriverOps,\n DownloadUrlDriverOps,\n OpenFileDialogCallback,\n VirtualLocalStorageSpec,\n} from '@milaboratories/pl-drivers';\nimport type { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport type { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport type { LocalStorageProjection } from '@milaboratories/pl-drivers';\nimport path from 'node:path';\nimport type { PFrameDriverOps } from '../pool/driver';\n\n/** Paths part of {@link DriverKitOps}. */\nexport type DriverKitOpsPaths = {\n /** Common root where to put downloaded blobs / downloaded blob cache */\n readonly blobDownloadPath: string;\n\n /** Common root for a cache for range queries. */\n readonly blobDownloadRangesCachePath: string;\n\n /** Common root where to put downloaded blobs with */\n readonly downloadBlobToURLPath: string;\n\n /**\n * List of pl storages that have projections in local file system.\n *\n * This option affect two drivers:\n *\n * (1) LS driver generates \"index\" handles instead of \"upload\" for paths inside those locations\n *\n * (2) Download driver directly serves content retrieval requests for blobs from listed storages,\n * and don't apply any caching for such blobs (i.e. preventing duplication of files for Downloaded\n * type handles, making OnDemand and Downloaded handles equivalent)\n *\n * */\n readonly localProjections: LocalStorageProjection[];\n\n /**\n * List of virtual storages that will allow homogeneous access to local FSs through LS API.\n * If undefined, default list will be created.\n * */\n readonly virtualLocalStoragesOverride?: VirtualLocalStorageSpec[];\n\n /** Path to the directory where pframes will spill temporary files and store materialized views */\n readonly pframesSpillPath: string;\n};\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOpsSettings = {\n //\n // Common\n //\n\n readonly logger: MiLogger;\n\n //\n // Signer\n //\n\n /**\n * Local secret, that is used to sign and verify different pieces of information\n * that can be used to access local data, like local paths for ongoing uploads.\n *\n * Use {@link MiddleLayer.generateLocalSecret} to generate sufficiently random string.\n * */\n readonly localSecret: string;\n\n //\n // Blob Driver\n //\n\n /**\n * Settings related to the download driver making operations with blobs. This driver is also used\n * to download logs when source process terminates and log terns into a blob\n */\n readonly blobDriverOps: DownloadDriverOps;\n\n //\n // Frontend Driver\n //\n\n /** Settings related to the frontend driver that downloads frontends. */\n readonly frontendDownloadDriverOps: DownloadUrlDriverOps;\n\n //\n // Blob To URL Driver\n //\n\n readonly downloadBlobToURLDriverOps: DownloadBlobToURLDriverOps;\n\n //\n // Upload Driver\n //\n\n /**\n * Settings related to the upload driver that actually performs upload and helps render upload\n * and indexing progresses from related pl resources.\n * */\n readonly uploadDriverOps: UploadDriverOps;\n\n //\n // Log streaming ops\n // (static logs are served via the blob driver)\n //\n\n /** Settings related to the streaming log driver */\n readonly logStreamDriverOps: LogsStreamDriverOps;\n\n //\n // LS Driver\n //\n\n /**\n * Callback to access system file open dialog, must be provided by the environment,\n * to allow for {@link showOpenSingleFileDialog} / {@link showOpenMultipleFilesDialog}\n * calls from the UI.\n */\n readonly openFileDialogCallback: OpenFileDialogCallback;\n\n //\n // PFrame Driver\n //\n\n /** Settings related to the PFrame driver */\n readonly pFrameDriverOps: PFrameDriverOps;\n};\n\nexport type DriverKitOps = DriverKitOpsPaths & DriverKitOpsSettings;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOpsSettings: Pick<\n DriverKitOpsSettings,\n | 'logger'\n | 'blobDriverOps'\n | 'frontendDownloadDriverOps'\n | 'downloadBlobToURLDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n | 'pFrameDriverOps'\n> = {\n logger: new ConsoleLoggerAdapter(),\n blobDriverOps: {\n cacheSoftSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n rangesCacheMaxSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n nConcurrentDownloads: 10,\n },\n frontendDownloadDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n withGunzip: true,\n nConcurrentDownloads: 50,\n },\n downloadBlobToURLDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n nConcurrentDownloads: 10,\n },\n uploadDriverOps: {\n nConcurrentPartUploads: 10,\n nConcurrentGetProgresses: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n logStreamDriverOps: {\n nConcurrentGetLogs: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n pFrameDriverOps: {\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache\n },\n};\n\nexport function DefaultDriverKitOpsPaths(\n workDir: string,\n): Pick<DriverKitOpsPaths,\n| 'blobDownloadPath'\n| 'blobDownloadRangesCachePath'\n| 'downloadBlobToURLPath'\n| 'pframesSpillPath'> {\n return {\n blobDownloadPath: path.join(workDir, 'download'),\n blobDownloadRangesCachePath: path.join(workDir, 'downloadRangesCache'),\n downloadBlobToURLPath: path.join(workDir, 'downloadToURL'),\n pframesSpillPath: path.join(workDir, 'pframes'),\n };\n}\n\n/** Fields with default values are marked as optional here. */\n// prettier-ignore\nexport type DriverKitOpsConstructor =\n Omit<DriverKitOpsSettings, keyof typeof DefaultDriverKitOpsSettings>\n & Partial<typeof DefaultDriverKitOpsSettings>\n & Omit<DriverKitOpsPaths, keyof ReturnType<typeof DefaultDriverKitOpsPaths>>\n & Partial<ReturnType<typeof DefaultDriverKitOpsPaths>>;\n\nexport type MiddleLayerOpsPaths = DriverKitOpsPaths & {\n /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Debug options for middle layer. */\nexport type MiddleLayerDebugOptions = {\n /** If true, will dump initial tree state to the file with root resource id as name. */\n dumpInitialTreeState: boolean;\n};\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOpsSettings = DriverKitOpsSettings & {\n /** Debug options. */\n readonly debugOps: MiddleLayerDebugOptions;\n\n /** Contain temporal options controlling how often should pl trees be\n * synchronized with the pl server. */\n readonly defaultTreeOptions: TemporalSynchronizedTreeOps;\n\n /** Defines interval in milliseconds for running periodic project maintenance job.\n * Project maintenance includes gradual staging rendering and cached outputs cleanup. */\n readonly projectRefreshInterval: number;\n\n /** This controls average number of block staging states that are rendered per\n * second during project maintenance job execution. */\n readonly stagingRenderingRate: number;\n\n /** How often to check for dev block updates */\n readonly devBlockUpdateRecheckInterval: number;\n\n /** Prioritize this channel if update is available in this block */\n readonly preferredUpdateChannel?: string;\n};\n\nexport type MiddleLayerOps = MiddleLayerOpsSettings & MiddleLayerOpsPaths;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOpsSettings: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOpsSettings\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'devBlockUpdateRecheckInterval'\n | 'debugOps'\n> = {\n ...DefaultDriverKitOpsSettings,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500,\n initialTreeLoadingTimeout: 100 * 60 * 60 * 1000, // disable timeout for loading project tree (100 hours)\n },\n debugOps: {\n dumpInitialTreeState: false,\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5,\n};\n\nexport function DefaultMiddleLayerOpsPaths(\n workDir: string,\n): Pick<\n MiddleLayerOpsPaths,\n keyof ReturnType<typeof DefaultDriverKitOpsPaths> | 'frontendDownloadPath'\n > {\n return {\n ...DefaultDriverKitOpsPaths(workDir),\n frontendDownloadPath: path.join(workDir, 'frontend'),\n };\n}\n\nexport type MiddleLayerOpsConstructor = Omit<\n MiddleLayerOpsSettings,\n keyof typeof DefaultMiddleLayerOpsSettings\n> &\nPartial<typeof DefaultMiddleLayerOpsSettings> &\nOmit<MiddleLayerOpsPaths, keyof Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>> &\nPartial<Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>>;\n"],"names":["ConsoleLoggerAdapter"],"mappings":";;;;;AAqIA;AACO,MAAM,2BAA2B,GASpC;IACF,MAAM,EAAE,IAAIA,8BAAoB,EAAE;AAClC,IAAA,aAAa,EAAE;QACb,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAC1C,uBAAuB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC/C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,0BAA0B,EAAE;QAC1B,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,sBAAsB,EAAE,EAAE;AAC1B,QAAA,wBAAwB,EAAE,EAAE;AAC5B,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,kBAAkB,EAAE;AAClB,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,eAAe,EAAE;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC5C,KAAA;;AAGG,SAAU,wBAAwB,CACtC,OAAe,EAAA;IAMf,OAAO;QACL,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QAChD,2BAA2B,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACtE,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAC1D,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;KAChD;AACH;AA+CA;AACO,MAAM,6BAA6B,GAQtC;AACF,IAAA,GAAG,2BAA2B;AAC9B,IAAA,kBAAkB,EAAE;AAClB,QAAA,eAAe,EAAE,GAAG;AACpB,QAAA,gBAAgB,EAAE,IAAI;QACtB,yBAAyB,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAChD,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA;AACD,IAAA,6BAA6B,EAAE,IAAI;AACnC,IAAA,sBAAsB,EAAE,GAAG;AAC3B,IAAA,oBAAoB,EAAE,CAAC;;AAGnB,SAAU,0BAA0B,CACxC,OAAe,EAAA;IAKf,OAAO;QACL,GAAG,wBAAwB,CAAC,OAAO,CAAC;QACpC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;KACrD;AACH;;;;;;;"}
1
+ {"version":3,"file":"ops.cjs","sources":["../../src/middle_layer/ops.ts"],"sourcesContent":["import type { TemporalSynchronizedTreeOps } from './types';\nimport type {\n DownloadBlobToURLDriverOps,\n DownloadDriverOps,\n DownloadUrlDriverOps,\n OpenFileDialogCallback,\n VirtualLocalStorageSpec,\n} from '@milaboratories/pl-drivers';\nimport type { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport type { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport type { LocalStorageProjection } from '@milaboratories/pl-drivers';\nimport path from 'node:path';\nimport type { PFrameDriverOps } from '../pool/driver';\n\n/** Paths part of {@link DriverKitOps}. */\nexport type DriverKitOpsPaths = {\n /** Common root where to put downloaded blobs / downloaded blob cache */\n readonly blobDownloadPath: string;\n\n /** Common root for a cache for range queries. */\n readonly blobDownloadRangesCachePath: string;\n\n /** Common root where to put downloaded blobs with */\n readonly downloadBlobToURLPath: string;\n\n /**\n * List of pl storages that have projections in local file system.\n *\n * This option affect two drivers:\n *\n * (1) LS driver generates \"index\" handles instead of \"upload\" for paths inside those locations\n *\n * (2) Download driver directly serves content retrieval requests for blobs from listed storages,\n * and don't apply any caching for such blobs (i.e. preventing duplication of files for Downloaded\n * type handles, making OnDemand and Downloaded handles equivalent)\n *\n * */\n readonly localProjections: LocalStorageProjection[];\n\n /**\n * List of virtual storages that will allow homogeneous access to local FSs through LS API.\n * If undefined, default list will be created.\n * */\n readonly virtualLocalStoragesOverride?: VirtualLocalStorageSpec[];\n\n /** Path to the directory where pframes will spill temporary files and store materialized views */\n readonly pframesSpillPath: string;\n};\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOpsSettings = {\n //\n // Common\n //\n\n readonly logger: MiLogger;\n\n //\n // Signer\n //\n\n /**\n * Local secret, that is used to sign and verify different pieces of information\n * that can be used to access local data, like local paths for ongoing uploads.\n *\n * Use {@link MiddleLayer.generateLocalSecret} to generate sufficiently random string.\n * */\n readonly localSecret: string;\n\n //\n // Blob Driver\n //\n\n /**\n * Settings related to the download driver making operations with blobs. This driver is also used\n * to download logs when source process terminates and log terns into a blob\n */\n readonly blobDriverOps: DownloadDriverOps;\n\n //\n // Frontend Driver\n //\n\n /** Settings related to the frontend driver that downloads frontends. */\n readonly frontendDownloadDriverOps: DownloadUrlDriverOps;\n\n //\n // Blob To URL Driver\n //\n\n readonly downloadBlobToURLDriverOps: DownloadBlobToURLDriverOps;\n\n //\n // Upload Driver\n //\n\n /**\n * Settings related to the upload driver that actually performs upload and helps render upload\n * and indexing progresses from related pl resources.\n * */\n readonly uploadDriverOps: UploadDriverOps;\n\n //\n // Log streaming ops\n // (static logs are served via the blob driver)\n //\n\n /** Settings related to the streaming log driver */\n readonly logStreamDriverOps: LogsStreamDriverOps;\n\n //\n // LS Driver\n //\n\n /**\n * Callback to access system file open dialog, must be provided by the environment,\n * to allow for {@link showOpenSingleFileDialog} / {@link showOpenMultipleFilesDialog}\n * calls from the UI.\n */\n readonly openFileDialogCallback: OpenFileDialogCallback;\n\n //\n // PFrame Driver\n //\n\n /** Settings related to the PFrame driver */\n readonly pFrameDriverOps: PFrameDriverOps;\n};\n\nexport type DriverKitOps = DriverKitOpsPaths & DriverKitOpsSettings;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOpsSettings: Pick<\n DriverKitOpsSettings,\n | 'logger'\n | 'blobDriverOps'\n | 'frontendDownloadDriverOps'\n | 'downloadBlobToURLDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n | 'pFrameDriverOps'\n> = {\n logger: new ConsoleLoggerAdapter(),\n blobDriverOps: {\n cacheSoftSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n rangesCacheMaxSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n nConcurrentDownloads: 10,\n },\n frontendDownloadDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n withGunzip: true,\n nConcurrentDownloads: 50,\n },\n downloadBlobToURLDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n nConcurrentDownloads: 10,\n },\n uploadDriverOps: {\n nConcurrentPartUploads: 10,\n nConcurrentGetProgresses: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n logStreamDriverOps: {\n nConcurrentGetLogs: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n pFrameDriverOps: {\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at lease 2GB)\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at lease 8GB)\n },\n};\n\nexport function DefaultDriverKitOpsPaths(\n workDir: string,\n): Pick<DriverKitOpsPaths,\n| 'blobDownloadPath'\n| 'blobDownloadRangesCachePath'\n| 'downloadBlobToURLPath'\n| 'pframesSpillPath'> {\n return {\n blobDownloadPath: path.join(workDir, 'download'),\n blobDownloadRangesCachePath: path.join(workDir, 'downloadRangesCache'),\n downloadBlobToURLPath: path.join(workDir, 'downloadToURL'),\n pframesSpillPath: path.join(workDir, 'pframes'),\n };\n}\n\n/** Fields with default values are marked as optional here. */\n// prettier-ignore\nexport type DriverKitOpsConstructor =\n Omit<DriverKitOpsSettings, keyof typeof DefaultDriverKitOpsSettings>\n & Partial<typeof DefaultDriverKitOpsSettings>\n & Omit<DriverKitOpsPaths, keyof ReturnType<typeof DefaultDriverKitOpsPaths>>\n & Partial<ReturnType<typeof DefaultDriverKitOpsPaths>>;\n\nexport type MiddleLayerOpsPaths = DriverKitOpsPaths & {\n /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Debug options for middle layer. */\nexport type MiddleLayerDebugOptions = {\n /** If true, will dump initial tree state to the file with root resource id as name. */\n dumpInitialTreeState: boolean;\n};\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOpsSettings = DriverKitOpsSettings & {\n /** Debug options. */\n readonly debugOps: MiddleLayerDebugOptions;\n\n /** Contain temporal options controlling how often should pl trees be\n * synchronized with the pl server. */\n readonly defaultTreeOptions: TemporalSynchronizedTreeOps;\n\n /** Defines interval in milliseconds for running periodic project maintenance job.\n * Project maintenance includes gradual staging rendering and cached outputs cleanup. */\n readonly projectRefreshInterval: number;\n\n /** This controls average number of block staging states that are rendered per\n * second during project maintenance job execution. */\n readonly stagingRenderingRate: number;\n\n /** How often to check for dev block updates */\n readonly devBlockUpdateRecheckInterval: number;\n\n /** Prioritize this channel if update is available in this block */\n readonly preferredUpdateChannel?: string;\n};\n\nexport type MiddleLayerOps = MiddleLayerOpsSettings & MiddleLayerOpsPaths;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOpsSettings: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOpsSettings\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'devBlockUpdateRecheckInterval'\n | 'debugOps'\n> = {\n ...DefaultDriverKitOpsSettings,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500,\n initialTreeLoadingTimeout: 100 * 60 * 60 * 1000, // disable timeout for loading project tree (100 hours)\n },\n debugOps: {\n dumpInitialTreeState: false,\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5,\n};\n\nexport function DefaultMiddleLayerOpsPaths(\n workDir: string,\n): Pick<\n MiddleLayerOpsPaths,\n keyof ReturnType<typeof DefaultDriverKitOpsPaths> | 'frontendDownloadPath'\n > {\n return {\n ...DefaultDriverKitOpsPaths(workDir),\n frontendDownloadPath: path.join(workDir, 'frontend'),\n };\n}\n\nexport type MiddleLayerOpsConstructor = Omit<\n MiddleLayerOpsSettings,\n keyof typeof DefaultMiddleLayerOpsSettings\n> &\nPartial<typeof DefaultMiddleLayerOpsSettings> &\nOmit<MiddleLayerOpsPaths, keyof Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>> &\nPartial<Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>>;\n"],"names":["ConsoleLoggerAdapter"],"mappings":";;;;;AAqIA;AACO,MAAM,2BAA2B,GASpC;IACF,MAAM,EAAE,IAAIA,8BAAoB,EAAE;AAClC,IAAA,aAAa,EAAE;QACb,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAC1C,uBAAuB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC/C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,0BAA0B,EAAE;QAC1B,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,sBAAsB,EAAE,EAAE;AAC1B,QAAA,wBAAwB,EAAE,EAAE;AAC5B,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,kBAAkB,EAAE;AAClB,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,eAAe,EAAE;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAC3C,mBAAmB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC7C,KAAA;;AAGG,SAAU,wBAAwB,CACtC,OAAe,EAAA;IAMf,OAAO;QACL,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QAChD,2BAA2B,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACtE,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAC1D,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;KAChD;AACH;AA+CA;AACO,MAAM,6BAA6B,GAQtC;AACF,IAAA,GAAG,2BAA2B;AAC9B,IAAA,kBAAkB,EAAE;AAClB,QAAA,eAAe,EAAE,GAAG;AACpB,QAAA,gBAAgB,EAAE,IAAI;QACtB,yBAAyB,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAChD,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA;AACD,IAAA,6BAA6B,EAAE,IAAI;AACnC,IAAA,sBAAsB,EAAE,GAAG;AAC3B,IAAA,oBAAoB,EAAE,CAAC;;AAGnB,SAAU,0BAA0B,CACxC,OAAe,EAAA;IAKf,OAAO;QACL,GAAG,wBAAwB,CAAC,OAAO,CAAC;QACpC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;KACrD;AACH;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/middle_layer/ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,KAAK,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,0CAA0C;AAC1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,iDAAiD;IACjD,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAE7C,qDAAqD;IACrD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAEvC;;;;;;;;;;;SAWK;IACL,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAEpD;;;SAGK;IACL,QAAQ,CAAC,4BAA4B,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAElE,kGAAkG;IAClG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,oBAAoB,GAAG;IAKjC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAM1B;;;;;SAKK;IACL,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAM7B;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAM1C,wEAAwE;IACxE,QAAQ,CAAC,yBAAyB,EAAE,oBAAoB,CAAC;IAMzD,QAAQ,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;IAMhE;;;SAGK;IACL,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAO1C,mDAAmD;IACnD,QAAQ,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;IAMjD;;;;OAIG;IACH,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAMxD,4CAA4C;IAC5C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAEpE,wCAAwC;AACxC,eAAO,MAAM,2BAA2B,EAAE,IAAI,CAC5C,oBAAoB,EAClB,QAAQ,GACR,eAAe,GACf,2BAA2B,GAC3B,4BAA4B,GAC5B,iBAAiB,GACjB,oBAAoB,GACpB,iBAAiB,CAmCpB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GACd,IAAI,CAAC,iBAAiB,EACvB,kBAAkB,GAClB,6BAA6B,GAC7B,uBAAuB,GACvB,kBAAkB,CAAC,CAOpB;AAED,8DAA8D;AAE9D,MAAM,MAAM,uBAAuB,GACjC,IAAI,CAAC,oBAAoB,EAAE,MAAM,OAAO,2BAA2B,CAAC,GAClE,OAAO,CAAC,OAAO,2BAA2B,CAAC,GAC3C,IAAI,CAAC,iBAAiB,EAAE,MAAM,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,GAC1E,OAAO,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC;AAEzD,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,GAAG;IACpD,8CAA8C;IAC9C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,sCAAsC;AACtC,MAAM,MAAM,uBAAuB,GAAG;IACpC,uFAAuF;IACvF,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG;IAC1D,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAE3C;0CACsC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;IAEzD;4FACwF;IACxF,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IAExC;0DACsD;IACtD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IAEtC,+CAA+C;IAC/C,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAE/C,mEAAmE;IACnE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;AAE1E,wCAAwC;AACxC,eAAO,MAAM,6BAA6B,EAAE,IAAI,CAC9C,cAAc,EACZ,MAAM,OAAO,2BAA2B,GACxC,oBAAoB,GACpB,wBAAwB,GACxB,sBAAsB,GACtB,+BAA+B,GAC/B,UAAU,CAcb,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GACd,IAAI,CACH,mBAAmB,EACrB,MAAM,UAAU,CAAC,OAAO,wBAAwB,CAAC,GAAG,sBAAsB,CACzE,CAKF;AAED,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,sBAAsB,EACtB,MAAM,OAAO,6BAA6B,CAC3C,GACD,OAAO,CAAC,OAAO,6BAA6B,CAAC,GAC7C,IAAI,CAAC,mBAAmB,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,GACvF,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/middle_layer/ops.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,8 @@ const DefaultDriverKitOpsSettings = {
34
34
  pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores
35
35
  pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI
36
36
  pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame
37
- pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache
37
+ pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at lease 2GB)
38
+ pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at lease 8GB)
38
39
  },
39
40
  };
40
41
  function DefaultDriverKitOpsPaths(workDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"ops.js","sources":["../../src/middle_layer/ops.ts"],"sourcesContent":["import type { TemporalSynchronizedTreeOps } from './types';\nimport type {\n DownloadBlobToURLDriverOps,\n DownloadDriverOps,\n DownloadUrlDriverOps,\n OpenFileDialogCallback,\n VirtualLocalStorageSpec,\n} from '@milaboratories/pl-drivers';\nimport type { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport type { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport type { LocalStorageProjection } from '@milaboratories/pl-drivers';\nimport path from 'node:path';\nimport type { PFrameDriverOps } from '../pool/driver';\n\n/** Paths part of {@link DriverKitOps}. */\nexport type DriverKitOpsPaths = {\n /** Common root where to put downloaded blobs / downloaded blob cache */\n readonly blobDownloadPath: string;\n\n /** Common root for a cache for range queries. */\n readonly blobDownloadRangesCachePath: string;\n\n /** Common root where to put downloaded blobs with */\n readonly downloadBlobToURLPath: string;\n\n /**\n * List of pl storages that have projections in local file system.\n *\n * This option affect two drivers:\n *\n * (1) LS driver generates \"index\" handles instead of \"upload\" for paths inside those locations\n *\n * (2) Download driver directly serves content retrieval requests for blobs from listed storages,\n * and don't apply any caching for such blobs (i.e. preventing duplication of files for Downloaded\n * type handles, making OnDemand and Downloaded handles equivalent)\n *\n * */\n readonly localProjections: LocalStorageProjection[];\n\n /**\n * List of virtual storages that will allow homogeneous access to local FSs through LS API.\n * If undefined, default list will be created.\n * */\n readonly virtualLocalStoragesOverride?: VirtualLocalStorageSpec[];\n\n /** Path to the directory where pframes will spill temporary files and store materialized views */\n readonly pframesSpillPath: string;\n};\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOpsSettings = {\n //\n // Common\n //\n\n readonly logger: MiLogger;\n\n //\n // Signer\n //\n\n /**\n * Local secret, that is used to sign and verify different pieces of information\n * that can be used to access local data, like local paths for ongoing uploads.\n *\n * Use {@link MiddleLayer.generateLocalSecret} to generate sufficiently random string.\n * */\n readonly localSecret: string;\n\n //\n // Blob Driver\n //\n\n /**\n * Settings related to the download driver making operations with blobs. This driver is also used\n * to download logs when source process terminates and log terns into a blob\n */\n readonly blobDriverOps: DownloadDriverOps;\n\n //\n // Frontend Driver\n //\n\n /** Settings related to the frontend driver that downloads frontends. */\n readonly frontendDownloadDriverOps: DownloadUrlDriverOps;\n\n //\n // Blob To URL Driver\n //\n\n readonly downloadBlobToURLDriverOps: DownloadBlobToURLDriverOps;\n\n //\n // Upload Driver\n //\n\n /**\n * Settings related to the upload driver that actually performs upload and helps render upload\n * and indexing progresses from related pl resources.\n * */\n readonly uploadDriverOps: UploadDriverOps;\n\n //\n // Log streaming ops\n // (static logs are served via the blob driver)\n //\n\n /** Settings related to the streaming log driver */\n readonly logStreamDriverOps: LogsStreamDriverOps;\n\n //\n // LS Driver\n //\n\n /**\n * Callback to access system file open dialog, must be provided by the environment,\n * to allow for {@link showOpenSingleFileDialog} / {@link showOpenMultipleFilesDialog}\n * calls from the UI.\n */\n readonly openFileDialogCallback: OpenFileDialogCallback;\n\n //\n // PFrame Driver\n //\n\n /** Settings related to the PFrame driver */\n readonly pFrameDriverOps: PFrameDriverOps;\n};\n\nexport type DriverKitOps = DriverKitOpsPaths & DriverKitOpsSettings;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOpsSettings: Pick<\n DriverKitOpsSettings,\n | 'logger'\n | 'blobDriverOps'\n | 'frontendDownloadDriverOps'\n | 'downloadBlobToURLDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n | 'pFrameDriverOps'\n> = {\n logger: new ConsoleLoggerAdapter(),\n blobDriverOps: {\n cacheSoftSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n rangesCacheMaxSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n nConcurrentDownloads: 10,\n },\n frontendDownloadDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n withGunzip: true,\n nConcurrentDownloads: 50,\n },\n downloadBlobToURLDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n nConcurrentDownloads: 10,\n },\n uploadDriverOps: {\n nConcurrentPartUploads: 10,\n nConcurrentGetProgresses: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n logStreamDriverOps: {\n nConcurrentGetLogs: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n pFrameDriverOps: {\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache\n },\n};\n\nexport function DefaultDriverKitOpsPaths(\n workDir: string,\n): Pick<DriverKitOpsPaths,\n| 'blobDownloadPath'\n| 'blobDownloadRangesCachePath'\n| 'downloadBlobToURLPath'\n| 'pframesSpillPath'> {\n return {\n blobDownloadPath: path.join(workDir, 'download'),\n blobDownloadRangesCachePath: path.join(workDir, 'downloadRangesCache'),\n downloadBlobToURLPath: path.join(workDir, 'downloadToURL'),\n pframesSpillPath: path.join(workDir, 'pframes'),\n };\n}\n\n/** Fields with default values are marked as optional here. */\n// prettier-ignore\nexport type DriverKitOpsConstructor =\n Omit<DriverKitOpsSettings, keyof typeof DefaultDriverKitOpsSettings>\n & Partial<typeof DefaultDriverKitOpsSettings>\n & Omit<DriverKitOpsPaths, keyof ReturnType<typeof DefaultDriverKitOpsPaths>>\n & Partial<ReturnType<typeof DefaultDriverKitOpsPaths>>;\n\nexport type MiddleLayerOpsPaths = DriverKitOpsPaths & {\n /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Debug options for middle layer. */\nexport type MiddleLayerDebugOptions = {\n /** If true, will dump initial tree state to the file with root resource id as name. */\n dumpInitialTreeState: boolean;\n};\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOpsSettings = DriverKitOpsSettings & {\n /** Debug options. */\n readonly debugOps: MiddleLayerDebugOptions;\n\n /** Contain temporal options controlling how often should pl trees be\n * synchronized with the pl server. */\n readonly defaultTreeOptions: TemporalSynchronizedTreeOps;\n\n /** Defines interval in milliseconds for running periodic project maintenance job.\n * Project maintenance includes gradual staging rendering and cached outputs cleanup. */\n readonly projectRefreshInterval: number;\n\n /** This controls average number of block staging states that are rendered per\n * second during project maintenance job execution. */\n readonly stagingRenderingRate: number;\n\n /** How often to check for dev block updates */\n readonly devBlockUpdateRecheckInterval: number;\n\n /** Prioritize this channel if update is available in this block */\n readonly preferredUpdateChannel?: string;\n};\n\nexport type MiddleLayerOps = MiddleLayerOpsSettings & MiddleLayerOpsPaths;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOpsSettings: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOpsSettings\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'devBlockUpdateRecheckInterval'\n | 'debugOps'\n> = {\n ...DefaultDriverKitOpsSettings,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500,\n initialTreeLoadingTimeout: 100 * 60 * 60 * 1000, // disable timeout for loading project tree (100 hours)\n },\n debugOps: {\n dumpInitialTreeState: false,\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5,\n};\n\nexport function DefaultMiddleLayerOpsPaths(\n workDir: string,\n): Pick<\n MiddleLayerOpsPaths,\n keyof ReturnType<typeof DefaultDriverKitOpsPaths> | 'frontendDownloadPath'\n > {\n return {\n ...DefaultDriverKitOpsPaths(workDir),\n frontendDownloadPath: path.join(workDir, 'frontend'),\n };\n}\n\nexport type MiddleLayerOpsConstructor = Omit<\n MiddleLayerOpsSettings,\n keyof typeof DefaultMiddleLayerOpsSettings\n> &\nPartial<typeof DefaultMiddleLayerOpsSettings> &\nOmit<MiddleLayerOpsPaths, keyof Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>> &\nPartial<Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>>;\n"],"names":[],"mappings":";;;AAqIA;AACO,MAAM,2BAA2B,GASpC;IACF,MAAM,EAAE,IAAI,oBAAoB,EAAE;AAClC,IAAA,aAAa,EAAE;QACb,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAC1C,uBAAuB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC/C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,0BAA0B,EAAE;QAC1B,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,sBAAsB,EAAE,EAAE;AAC1B,QAAA,wBAAwB,EAAE,EAAE;AAC5B,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,kBAAkB,EAAE;AAClB,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,eAAe,EAAE;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC5C,KAAA;;AAGG,SAAU,wBAAwB,CACtC,OAAe,EAAA;IAMf,OAAO;QACL,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QAChD,2BAA2B,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACtE,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAC1D,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;KAChD;AACH;AA+CA;AACO,MAAM,6BAA6B,GAQtC;AACF,IAAA,GAAG,2BAA2B;AAC9B,IAAA,kBAAkB,EAAE;AAClB,QAAA,eAAe,EAAE,GAAG;AACpB,QAAA,gBAAgB,EAAE,IAAI;QACtB,yBAAyB,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAChD,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA;AACD,IAAA,6BAA6B,EAAE,IAAI;AACnC,IAAA,sBAAsB,EAAE,GAAG;AAC3B,IAAA,oBAAoB,EAAE,CAAC;;AAGnB,SAAU,0BAA0B,CACxC,OAAe,EAAA;IAKf,OAAO;QACL,GAAG,wBAAwB,CAAC,OAAO,CAAC;QACpC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;KACrD;AACH;;;;"}
1
+ {"version":3,"file":"ops.js","sources":["../../src/middle_layer/ops.ts"],"sourcesContent":["import type { TemporalSynchronizedTreeOps } from './types';\nimport type {\n DownloadBlobToURLDriverOps,\n DownloadDriverOps,\n DownloadUrlDriverOps,\n OpenFileDialogCallback,\n VirtualLocalStorageSpec,\n} from '@milaboratories/pl-drivers';\nimport type { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport type { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport type { LocalStorageProjection } from '@milaboratories/pl-drivers';\nimport path from 'node:path';\nimport type { PFrameDriverOps } from '../pool/driver';\n\n/** Paths part of {@link DriverKitOps}. */\nexport type DriverKitOpsPaths = {\n /** Common root where to put downloaded blobs / downloaded blob cache */\n readonly blobDownloadPath: string;\n\n /** Common root for a cache for range queries. */\n readonly blobDownloadRangesCachePath: string;\n\n /** Common root where to put downloaded blobs with */\n readonly downloadBlobToURLPath: string;\n\n /**\n * List of pl storages that have projections in local file system.\n *\n * This option affect two drivers:\n *\n * (1) LS driver generates \"index\" handles instead of \"upload\" for paths inside those locations\n *\n * (2) Download driver directly serves content retrieval requests for blobs from listed storages,\n * and don't apply any caching for such blobs (i.e. preventing duplication of files for Downloaded\n * type handles, making OnDemand and Downloaded handles equivalent)\n *\n * */\n readonly localProjections: LocalStorageProjection[];\n\n /**\n * List of virtual storages that will allow homogeneous access to local FSs through LS API.\n * If undefined, default list will be created.\n * */\n readonly virtualLocalStoragesOverride?: VirtualLocalStorageSpec[];\n\n /** Path to the directory where pframes will spill temporary files and store materialized views */\n readonly pframesSpillPath: string;\n};\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOpsSettings = {\n //\n // Common\n //\n\n readonly logger: MiLogger;\n\n //\n // Signer\n //\n\n /**\n * Local secret, that is used to sign and verify different pieces of information\n * that can be used to access local data, like local paths for ongoing uploads.\n *\n * Use {@link MiddleLayer.generateLocalSecret} to generate sufficiently random string.\n * */\n readonly localSecret: string;\n\n //\n // Blob Driver\n //\n\n /**\n * Settings related to the download driver making operations with blobs. This driver is also used\n * to download logs when source process terminates and log terns into a blob\n */\n readonly blobDriverOps: DownloadDriverOps;\n\n //\n // Frontend Driver\n //\n\n /** Settings related to the frontend driver that downloads frontends. */\n readonly frontendDownloadDriverOps: DownloadUrlDriverOps;\n\n //\n // Blob To URL Driver\n //\n\n readonly downloadBlobToURLDriverOps: DownloadBlobToURLDriverOps;\n\n //\n // Upload Driver\n //\n\n /**\n * Settings related to the upload driver that actually performs upload and helps render upload\n * and indexing progresses from related pl resources.\n * */\n readonly uploadDriverOps: UploadDriverOps;\n\n //\n // Log streaming ops\n // (static logs are served via the blob driver)\n //\n\n /** Settings related to the streaming log driver */\n readonly logStreamDriverOps: LogsStreamDriverOps;\n\n //\n // LS Driver\n //\n\n /**\n * Callback to access system file open dialog, must be provided by the environment,\n * to allow for {@link showOpenSingleFileDialog} / {@link showOpenMultipleFilesDialog}\n * calls from the UI.\n */\n readonly openFileDialogCallback: OpenFileDialogCallback;\n\n //\n // PFrame Driver\n //\n\n /** Settings related to the PFrame driver */\n readonly pFrameDriverOps: PFrameDriverOps;\n};\n\nexport type DriverKitOps = DriverKitOpsPaths & DriverKitOpsSettings;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOpsSettings: Pick<\n DriverKitOpsSettings,\n | 'logger'\n | 'blobDriverOps'\n | 'frontendDownloadDriverOps'\n | 'downloadBlobToURLDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n | 'pFrameDriverOps'\n> = {\n logger: new ConsoleLoggerAdapter(),\n blobDriverOps: {\n cacheSoftSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n rangesCacheMaxSizeBytes: 8 * 1024 * 1024 * 1024, // 8 GB\n nConcurrentDownloads: 10,\n },\n frontendDownloadDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n withGunzip: true,\n nConcurrentDownloads: 50,\n },\n downloadBlobToURLDriverOps: {\n cacheSoftSizeBytes: 1 * 1024 * 1024 * 1024, // 1 GB\n nConcurrentDownloads: 10,\n },\n uploadDriverOps: {\n nConcurrentPartUploads: 10,\n nConcurrentGetProgresses: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n logStreamDriverOps: {\n nConcurrentGetLogs: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000,\n },\n pFrameDriverOps: {\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at lease 2GB)\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at lease 8GB)\n },\n};\n\nexport function DefaultDriverKitOpsPaths(\n workDir: string,\n): Pick<DriverKitOpsPaths,\n| 'blobDownloadPath'\n| 'blobDownloadRangesCachePath'\n| 'downloadBlobToURLPath'\n| 'pframesSpillPath'> {\n return {\n blobDownloadPath: path.join(workDir, 'download'),\n blobDownloadRangesCachePath: path.join(workDir, 'downloadRangesCache'),\n downloadBlobToURLPath: path.join(workDir, 'downloadToURL'),\n pframesSpillPath: path.join(workDir, 'pframes'),\n };\n}\n\n/** Fields with default values are marked as optional here. */\n// prettier-ignore\nexport type DriverKitOpsConstructor =\n Omit<DriverKitOpsSettings, keyof typeof DefaultDriverKitOpsSettings>\n & Partial<typeof DefaultDriverKitOpsSettings>\n & Omit<DriverKitOpsPaths, keyof ReturnType<typeof DefaultDriverKitOpsPaths>>\n & Partial<ReturnType<typeof DefaultDriverKitOpsPaths>>;\n\nexport type MiddleLayerOpsPaths = DriverKitOpsPaths & {\n /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Debug options for middle layer. */\nexport type MiddleLayerDebugOptions = {\n /** If true, will dump initial tree state to the file with root resource id as name. */\n dumpInitialTreeState: boolean;\n};\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOpsSettings = DriverKitOpsSettings & {\n /** Debug options. */\n readonly debugOps: MiddleLayerDebugOptions;\n\n /** Contain temporal options controlling how often should pl trees be\n * synchronized with the pl server. */\n readonly defaultTreeOptions: TemporalSynchronizedTreeOps;\n\n /** Defines interval in milliseconds for running periodic project maintenance job.\n * Project maintenance includes gradual staging rendering and cached outputs cleanup. */\n readonly projectRefreshInterval: number;\n\n /** This controls average number of block staging states that are rendered per\n * second during project maintenance job execution. */\n readonly stagingRenderingRate: number;\n\n /** How often to check for dev block updates */\n readonly devBlockUpdateRecheckInterval: number;\n\n /** Prioritize this channel if update is available in this block */\n readonly preferredUpdateChannel?: string;\n};\n\nexport type MiddleLayerOps = MiddleLayerOpsSettings & MiddleLayerOpsPaths;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOpsSettings: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOpsSettings\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'devBlockUpdateRecheckInterval'\n | 'debugOps'\n> = {\n ...DefaultDriverKitOpsSettings,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500,\n initialTreeLoadingTimeout: 100 * 60 * 60 * 1000, // disable timeout for loading project tree (100 hours)\n },\n debugOps: {\n dumpInitialTreeState: false,\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5,\n};\n\nexport function DefaultMiddleLayerOpsPaths(\n workDir: string,\n): Pick<\n MiddleLayerOpsPaths,\n keyof ReturnType<typeof DefaultDriverKitOpsPaths> | 'frontendDownloadPath'\n > {\n return {\n ...DefaultDriverKitOpsPaths(workDir),\n frontendDownloadPath: path.join(workDir, 'frontend'),\n };\n}\n\nexport type MiddleLayerOpsConstructor = Omit<\n MiddleLayerOpsSettings,\n keyof typeof DefaultMiddleLayerOpsSettings\n> &\nPartial<typeof DefaultMiddleLayerOpsSettings> &\nOmit<MiddleLayerOpsPaths, keyof Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>> &\nPartial<Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>>;\n"],"names":[],"mappings":";;;AAqIA;AACO,MAAM,2BAA2B,GASpC;IACF,MAAM,EAAE,IAAI,oBAAoB,EAAE;AAClC,IAAA,aAAa,EAAE;QACb,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAC1C,uBAAuB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC/C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,0BAA0B,EAAE;QAC1B,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC1C,QAAA,oBAAoB,EAAE,EAAE;AACzB,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,sBAAsB,EAAE,EAAE;AAC1B,QAAA,wBAAwB,EAAE,EAAE;AAC5B,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,kBAAkB,EAAE;AAClB,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,eAAe,EAAE;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAC3C,mBAAmB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC7C,KAAA;;AAGG,SAAU,wBAAwB,CACtC,OAAe,EAAA;IAMf,OAAO;QACL,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QAChD,2BAA2B,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACtE,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAC1D,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;KAChD;AACH;AA+CA;AACO,MAAM,6BAA6B,GAQtC;AACF,IAAA,GAAG,2BAA2B;AAC9B,IAAA,kBAAkB,EAAE;AAClB,QAAA,eAAe,EAAE,GAAG;AACpB,QAAA,gBAAgB,EAAE,IAAI;QACtB,yBAAyB,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAChD,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA;AACD,IAAA,6BAA6B,EAAE,IAAI;AACnC,IAAA,sBAAsB,EAAE,GAAG;AAC3B,IAAA,oBAAoB,EAAE,CAAC;;AAGnB,SAAU,0BAA0B,CACxC,OAAe,EAAA;IAKf,OAAO;QACL,GAAG,wBAAwB,CAAC,OAAO,CAAC;QACpC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;KACrD;AACH;;;;"}