@milaboratories/pl-middle-layer 1.41.1 → 1.41.3
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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -2
- package/dist/index.mjs.map +1 -1
- package/dist/network_check/template.d.ts.map +1 -1
- package/package.json +13 -13
- package/src/network_check/template.ts +6 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/dev_env/util.ts","../src/dev_env/index.ts","../src/block_registry/registry.ts","../src/block_registry/registry-v2-provider.ts","../src/block_registry/well_known_registries.ts","../src/model/project_model.ts","../src/middle_layer/project_list.ts","../src/mutator/template/render_template.ts","../src/mutator/template/render_block.ts","../src/mutator/template/direct_template_loader_v3.ts","../src/mutator/template/direct_template_loader.ts","../src/mutator/template/template_loading.ts","../src/model/block_pack_spec.ts","../src/mutator/block-pack/frontend.ts","../src/worker/WorkerManager.ts","../src/mutator/block-pack/block_pack.ts","../src/model/args.ts","../src/model/project_model_util.ts","../src/mutator/context_export.ts","../src/debug/index.ts","../src/mutator/project.ts","../src/pool/data.ts","../src/pool/p_object_collection.ts","../src/pool/result_pool.ts","../src/middle_layer/block_ctx.ts","../src/cfg_render/traverse.ts","../src/cfg_render/util.ts","../src/cfg_render/renderer.ts","../src/middle_layer/block_ctx_unsafe.ts","../src/cfg_render/executor.ts","../src/js_render/computable_context.ts","../src/js_render/context.ts","../src/js_render/index.ts","../src/middle_layer/render.ts","../src/middle_layer/util.ts","../src/middle_layer/project_overview.ts","../src/middle_layer/frontend_path.ts","../src/middle_layer/block.ts","../src/middle_layer/active_cfg.ts","../src/middle_layer/navigation_states.ts","../src/middle_layer/project_overview_light.ts","../src/model/project_model_v1.ts","../src/mutator/migration.ts","../src/middle_layer/project.ts","../src/middle_layer/ops.ts","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/constants.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/debug.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/re.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/parse-options.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/identifiers.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/classes/semver.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/parse.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/valid.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/clean.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/inc.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/diff.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/major.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/minor.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/patch.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/prerelease.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/compare.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/rcompare.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/compare-loose.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/compare-build.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/sort.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/rsort.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/gt.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/lt.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/eq.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/neq.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/gte.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/lte.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/cmp.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/coerce.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/lrucache.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/classes/range.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/classes/comparator.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/satisfies.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/to-comparators.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/max-satisfying.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/min-satisfying.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/min-version.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/valid.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/outside.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/gtr.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/ltr.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/intersects.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/simplify.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/subset.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/index.js","../src/block_registry/watcher.ts","../src/pool/ref_count_pool.ts","../src/pool/driver.ts","../src/middle_layer/driver_kit.ts","../src/model/project_helper.ts","../src/middle_layer/middle_layer.ts","../src/network_check/pings.ts","../src/network_check/template.ts","../src/network_check/network_check.ts"],"sourcesContent":["import type { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n","import { RegistryV1 } from '@platforma-sdk/block-tools';\nimport path from 'node:path';\nimport { tryStat } from './util';\nimport { tryResolve } from '@milaboratories/resolve-helper';\n\nexport const LegacyDevBlockPackMetaYaml = [RegistryV1.PlPackageYamlConfigFile];\nexport const LegacyDevBlockPackMetaJson = [RegistryV1.PlPackageJsonConfigFile];\nexport const LegacyDevBlockPackTemplate = ['backend', 'dist', 'tengo', 'tpl', 'main.plj.gz'];\nexport const LegacyDevBlockPackConfig = ['config', 'dist', 'config.json'];\nexport const LegacyDevBlockPackFrontendFolder = ['frontend', 'dist'];\n\nexport const CanonicalBlockWorkflowRequest = 'block-workflow/dist/tengo/tpl/main.plj.gz';\nexport const CanonicalBlockConfigRequest = 'block-model/dist/config.json';\nexport const CanonicalBlockUiRequestPackageJson = 'block-ui/package.json';\n\nexport const LegacyDevBlockPackFiles = [\n LegacyDevBlockPackTemplate,\n LegacyDevBlockPackConfig,\n LegacyDevBlockPackMetaYaml,\n LegacyDevBlockPackMetaJson,\n LegacyDevBlockPackFrontendFolder,\n];\n\nexport type DevPacketPaths = {\n /** main.plj.gz */\n readonly workflow: string;\n /** config.json */\n readonly config: string;\n /** ui dist folder */\n readonly ui: string;\n};\n\nexport async function isLegacyDevPackage(packageRoot: string): Promise<boolean> {\n return (\n (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackConfig))) !== undefined\n || (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackTemplate))) !== undefined\n );\n}\n\nfunction mustResolve(root: string, request: string): string {\n const res = tryResolve(root, request);\n if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);\n return res;\n}\n\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: true\n): Promise<DevPacketPaths | undefined>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: false\n): Promise<DevPacketPaths>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: boolean,\n): Promise<DevPacketPaths | undefined> {\n if (!path.isAbsolute(packageRoot)) packageRoot = path.resolve(packageRoot);\n if (await isLegacyDevPackage(packageRoot))\n return {\n workflow: path.join(packageRoot, ...LegacyDevBlockPackTemplate),\n config: path.join(packageRoot, ...LegacyDevBlockPackConfig),\n ui: path.join(packageRoot, ...LegacyDevBlockPackFrontendFolder),\n };\n if (ignoreErrors) {\n const workflow = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (workflow === undefined) return undefined;\n const config = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (config === undefined) return undefined;\n const uiPackageJson = tryResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n if (uiPackageJson === undefined) return undefined;\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n } else {\n const workflow = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const config = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const uiPackageJson = mustResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n }\n}\n","import type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type {\n BlockPackDescriptionAbsolute } from '@platforma-sdk/block-tools';\nimport {\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1,\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: latestMeta['title'] ?? 'No title',\n description: latestMeta['description'] ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks())\n .map((e) => ({ ...e, registryId: regEntry.id }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV',\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n","import { folderReaderByUrl, RegistryV2Reader } from '@platforma-sdk/block-tools';\nimport type { Dispatcher } from 'undici';\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n","import type { RegistrySpec } from '@milaboratories/pl-model-middle-layer';\n\nexport const CentralBlockRegistry: RegistrySpec = {\n type: 'remote-v2',\n url: 'https://blocks.pl-open.science/',\n};\n\nexport const V1CentralRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/releases',\n};\n\nexport const V1CentralDevSnapshotRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/dev',\n};\n","import type { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project',\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const SchemaVersionCurrent = '2';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockArgsAuthorKeyPrefix = 'BlockArgsAuthor/';\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = 'ProjectStructureAuthor';\n\nexport const ServiceTemplateCacheFieldPrefix = '__serviceTemplate_';\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | 'blockPack'\n | 'blockSettings'\n | 'uiState'\n | 'prodArgs'\n | 'currentArgs'\n | 'prodCtx'\n | 'prodUiCtx'\n | 'prodOutput'\n | 'prodCtxPrevious'\n | 'prodUiCtxPrevious'\n | 'prodOutputPrevious'\n | 'stagingCtx'\n | 'stagingUiCtx'\n | 'stagingOutput'\n | 'stagingCtxPrevious'\n | 'stagingUiCtxPrevious'\n | 'stagingOutputPrevious';\n}\n\nexport const FieldsToDuplicate: Set<ProjectField['fieldName']> = new Set([\n 'blockPack',\n 'blockSettings',\n 'uiState',\n 'prodArgs',\n 'currentArgs',\n 'prodCtx',\n 'prodUiCtx',\n 'prodOutput',\n]);\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern\n = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|uiState|prodArgs|currentArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n","import type { PruningFunction } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport type { PlClient, ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport { resourceTypesEqual } from '@milaboratories/pl-client';\nimport type { TreeAndComputableU } from './types';\nimport type { WatchableValue } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type {\n ProjectListEntry } from '../model/project_model';\nimport {\n ProjectCreatedTimestamp,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n} from '../model/project_model';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport type { ProjectMeta } from '@milaboratories/pl-model-middle-layer';\n\nexport const ProjectsField = 'projects';\nexport const ProjectsResourceType: ResourceType = { name: 'Projects', version: '1' };\n\nexport const ProjectsListTreePruningFunction: PruningFunction = (resource) => {\n if (!resourceTypesEqual(resource.type, ProjectsResourceType)) return [];\n return resource.fields;\n};\n\nexport async function createProjectList(\n pl: PlClient,\n rid: ResourceId,\n openedProjects: WatchableValue<ResourceId[]>,\n env: MiddleLayerEnvironment,\n): Promise<TreeAndComputableU<ProjectListEntry[]>> {\n const tree = await SynchronizedTreeState.init(\n pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: ProjectsListTreePruningFunction,\n },\n env.logger,\n );\n\n const c = Computable.make((ctx) => {\n const node = ctx.accessor(tree.entry()).node();\n const oProjects = openedProjects.getValue(ctx);\n if (node === undefined) return undefined;\n const result: ProjectListEntry[] = [];\n for (const field of node.listDynamicFields()) {\n const prj = node.traverse(field);\n if (prj === undefined) continue;\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n result.push({\n id: field,\n rid: prj.id,\n created: new Date(created),\n lastModified: new Date(lastModified),\n opened: oProjects.indexOf(prj.id) >= 0,\n meta,\n });\n }\n result.sort((p) => -p.lastModified.valueOf());\n return result;\n }).withStableType();\n\n return { computable: c, tree };\n}\n","import type { AnyRef, FieldRef, PlTransaction } from '@milaboratories/pl-client';\nimport { field, Pl } from '@milaboratories/pl-client';\nimport type { ResourceType } from '@platforma-sdk/model';\n\nconst EphRenderTemplate: ResourceType = {\n name: 'EphRenderTemplate',\n version: '1',\n};\nconst RenderTemplate: ResourceType = {\n name: 'RenderTemplate',\n version: '1',\n};\n\n/**\n * Creates render template operation, for a given remplate and inputs.\n *\n * @param tx transaction to use during rendering creation\n * @param tpl reference to the template resource (see {@link loadTemplate})\n * @param ephemeral true for ephemeral templates, false for pure templates\n * @param inputs map of inputs pointing to other resources or fields\n * @param outputNames names of the outputs to collect and return from this method\n */\nexport function createRenderTemplate<O extends string>(\n tx: PlTransaction,\n tpl: AnyRef,\n ephemeral: boolean,\n inputs: Pl.PlRecord,\n outputNames: O[],\n): Record<O, FieldRef> {\n if (outputNames.length === 0) throw new Error('Zero output names provided');\n const rId = ephemeral ? tx.createEphemeral(EphRenderTemplate) : tx.createStruct(RenderTemplate);\n\n const tplField = field(rId, 'template');\n const inputsField = field(rId, 'inputs');\n\n tx.createField(tplField, 'Input', tpl);\n tx.createField(inputsField, 'Input', Pl.createPlMap(tx, inputs, ephemeral));\n tx.lockInputs(rId);\n\n return Pl.futureRecord(tx, rId, outputNames, 'Output', 'outputs/');\n}\n","import type {\n AnyRef,\n PlTransaction,\n ResourceRef,\n ResourceType } from '@milaboratories/pl-client';\nimport {\n field,\n Pl,\n} from '@milaboratories/pl-client';\nimport { randomUUID } from 'node:crypto';\nimport { createRenderTemplate } from './render_template';\n\nexport const BContextEnd: ResourceType = { name: 'BContextEnd', version: '1' };\nexport const BContext: ResourceType = { name: 'BContext', version: '1' };\nexport const BContextId = 'id';\nexport const BContextParent = 'parent';\nexport const BContextMultiParentPrefix = 'parent/';\n\n// TODO: add implementation for dual context heavy block.\n// export type BlockType =\n// | 'LightBlock'\n// | 'HeavyBlock'\n// | 'DualContextHeavyBlock';\n// moved to project model ==>>>\n\nexport type HeavyBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n isProduction: AnyRef;\n context: AnyRef;\n};\n\nexport type HeavyBlockOutputs = {\n context: AnyRef;\n result: AnyRef;\n};\n\nexport const HeavyBlockOutputNames: (keyof HeavyBlockOutputs)[] = ['context', 'result'];\n\nexport function createRenderHeavyBlock(\n tx: PlTransaction,\n tpl: AnyRef,\n inputs: HeavyBlockInputs,\n): HeavyBlockOutputs {\n return createRenderTemplate(tx, tpl, true, inputs, HeavyBlockOutputNames);\n}\n\nexport type LightBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n stagingContext: AnyRef;\n productionContext: AnyRef;\n};\n\nexport type LightBlockOutput = {\n result: AnyRef;\n};\n\nexport const LightBlockOutputNames: (keyof LightBlockOutput)[] = ['result'];\n\nexport function createRenderLightBlock(\n tx: PlTransaction,\n tpl: ResourceRef,\n inputs: LightBlockInputs,\n): LightBlockOutput {\n return createRenderTemplate(tx, tpl, true, inputs, LightBlockOutputNames);\n}\n\nexport function createBContextEnd(tx: PlTransaction): ResourceRef {\n const ctx = tx.createEphemeral(BContextEnd);\n tx.lock(ctx);\n return ctx;\n}\n\nexport function createBContextFromUpstreams(tx: PlTransaction, upstreamCtxs: AnyRef[]): AnyRef {\n if (upstreamCtxs.length === 0) return createBContextEnd(tx);\n\n if (upstreamCtxs.length === 1) return upstreamCtxs[0];\n\n const ctx = tx.createEphemeral(BContext);\n\n // setting id\n tx.createField(field(ctx, BContextId), 'Input', Pl.createPlString(tx, randomUUID()));\n\n // setting parents\n for (let i = 0; i < upstreamCtxs.length; i++)\n tx.createField(field(ctx, `${BContextMultiParentPrefix}${i}`), 'Input', upstreamCtxs[i]);\n\n tx.lock(ctx);\n\n return ctx;\n}\n","import type { AnyRef, AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type { Hash } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport type {\n CompiledTemplateV3,\n TemplateDataV3,\n TemplateLibDataV3,\n TemplateSoftwareDataV3,\n} from '@milaboratories/pl-model-backend';\nimport {\n PlTemplateLibV1,\n PlTemplateSoftwareV1,\n PlTemplateV1,\n PlTemplateOverrideV1,\n} from '@milaboratories/pl-model-backend';\nimport { notEmpty } from '@milaboratories/ts-helpers';\n\n/**\n * Renders the tree of templates by caching all resource ids\n * by their cache keys.\n * It's different from v2 version because we provide\n * the hash map of the code of all sources everywhere.\n * It does a double-dispatch on the node type (template, library etc),\n * and creates resources.\n *\n * IMO, it'd be clearer to rewrite it with Visitor pattern, and separate\n * tree traversing and operations on it, but I don't have time to do it now.\n*/\nexport function createTemplateV3Tree(tx: PlTransaction, tplData: CompiledTemplateV3): AnyRef {\n const resourceCache = new Map<string, AnyResourceRef>();\n\n const createResourceCached = <T>(resource: T, renderer: Renderer<T>, hashToSource: Record<string, string>): AnyResourceRef => {\n const key: Hash = createHash('sha256');\n renderer.updateCacheKey(resource, key, hashToSource);\n\n const rKey = key.digest('hex');\n\n if (!resourceCache.has(rKey)) {\n const rId = renderer.render(resource, tx, createResourceCached, hashToSource);\n resourceCache.set(rKey, rId);\n }\n\n return resourceCache.get(rKey)!;\n };\n\n return createResourceCached(tplData.template, TemplateRenderer, tplData.hashToSource);\n}\n\ntype Renderer<T> = {\n /** Updates the cache key by adding all info of the artifact. */\n updateCacheKey: CacheKey<T>;\n /** Create resources for all dependencies recursively and then for this artifact. */\n render: (resource: T, tx: PlTransaction, creator: Creator, sources: Record<string, string>) => AnyResourceRef;\n};\ntype CacheKey<T> = (resource: T, key: Hash, sources: Record<string, string>) => void;\ntype Creator = <T>(resource: T, renderer: Renderer<T>, sources: Record<string, string>) => AnyResourceRef;\n\nconst LibRenderer: Renderer<TemplateLibDataV3> = {\n updateCacheKey(resource, hash, sources) {\n hash\n .update(PlTemplateLibV1.type.name)\n .update(PlTemplateLibV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(getSourceCode(resource.name, sources, resource.sourceHash));\n },\n render(resource, tx, _creator, sources) {\n return tx.createValue(\n PlTemplateLibV1.type,\n JSON.stringify(PlTemplateLibV1.fromV3Data(resource, getSourceCode(resource.name, sources, resource.sourceHash)).data),\n );\n },\n};\n\nconst SoftwareInfoRenderer: Renderer<TemplateSoftwareDataV3> = {\n updateCacheKey(resource, hash, sources) {\n hash\n .update(PlTemplateSoftwareV1.type.name)\n .update(PlTemplateSoftwareV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(getSourceCode(resource.name, sources, resource.sourceHash));\n },\n render(resource, tx, _creator, sources) {\n const sw = PlTemplateSoftwareV1.fromV3Data(resource, getSourceCode(resource.name, sources, resource.sourceHash));\n const ref = tx.createStruct(PlTemplateSoftwareV1.type, sw.data);\n tx.setKValue(ref, PlTemplateSoftwareV1.metaNameKey, JSON.stringify(sw.name));\n tx.lock(ref);\n return ref;\n },\n};\n\nconst TemplateRenderer: Renderer<TemplateDataV3> = {\n updateCacheKey(resource, hash, sources) {\n hash\n .update(PlTemplateV1.type.name)\n .update(PlTemplateV1.type.version)\n .update(resource.hashOverride ?? 'no-override')\n .update(resource.name)\n .update(resource.version)\n .update(getSourceCode(resource.name, sources, resource.sourceHash));\n\n const srt = <T>(entries: [string, T][]): [string, T][] => {\n entries.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1));\n return entries;\n };\n\n for (const [libId, lib] of srt(Object.entries(resource.libs ?? {}))) {\n hash.update('lib:' + libId);\n LibRenderer.updateCacheKey(lib, hash, sources);\n }\n for (const [swId, sw] of srt(Object.entries(resource.software ?? {}))) {\n hash.update('soft:' + swId);\n SoftwareInfoRenderer.updateCacheKey(sw, hash, sources);\n }\n for (const [swId, sw] of srt(Object.entries(resource.assets ?? {}))) {\n hash.update('asset:' + swId);\n SoftwareInfoRenderer.updateCacheKey(sw, hash, sources);\n }\n for (const [tplId, tpl] of srt(Object.entries(resource.templates ?? {}))) {\n hash.update('tpl:' + tplId);\n this.updateCacheKey(tpl, hash, sources);\n }\n },\n render(resource, tx, _creator, sources) {\n const tplRef = tx.createStruct(\n PlTemplateV1.type,\n JSON.stringify(PlTemplateV1.fromV3Data(resource, getSourceCode(resource.name, sources, resource.sourceHash)).data),\n );\n // Render libraries\n for (const [libId, lib] of Object.entries(resource.libs ?? {})) {\n const fld = PlTemplateV1.libField(tplRef, libId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(lib, LibRenderer, sources));\n }\n\n // Render software and assets\n for (const [swId, sw] of Object.entries(resource.software ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer, sources));\n }\n for (const [swId, sw] of Object.entries(resource.assets ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer, sources));\n }\n\n // Render dependency templates\n for (const [depTplId, depTpl] of Object.entries(resource.templates ?? {})) {\n const fld = PlTemplateV1.tplField(tplRef, depTplId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(depTpl, TemplateRenderer, sources));\n }\n\n tx.lock(tplRef);\n\n if (!resource.hashOverride) return tplRef;\n\n // Override template hash with proxy resource, when hash override is configured for template\n const overrideRef = tx.createStruct(\n PlTemplateOverrideV1.type,\n JSON.stringify(PlTemplateOverrideV1.fromV3Data(resource)),\n );\n const fld = PlTemplateOverrideV1.tplField(overrideRef);\n tx.createField(fld, 'Service');\n tx.setField(fld, tplRef);\n tx.lock(overrideRef);\n return overrideRef;\n },\n};\n\n/**\n * Gets a source code of the artifact by its source hash.\n * the source hash was calculated and stored by tengo compiler\n * and is different from the hash we're using for caching here.\n */\nfunction getSourceCode(name: string, sources: Record<string, string>, sourceHash: string): string {\n return notEmpty(\n sources[sourceHash],\n `trying to get \"${name}\" source: sources map doesn't contain source hash ${sourceHash}`,\n );\n}\n","import type { AnyRef, AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport type { ExplicitTemplate, PreparedTemplate } from '../../model/template_spec';\nimport type { Hash } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport type {\n TemplateData,\n TemplateLibData,\n TemplateSoftwareData,\n} from '@milaboratories/pl-model-backend';\nimport {\n PlTemplateLibV1,\n PlTemplateSoftwareV1,\n PlTemplateV1,\n PlTemplateOverrideV1,\n parseTemplate,\n} from '@milaboratories/pl-model-backend';\nimport { createTemplateV3Tree } from './direct_template_loader_v3';\n\nexport function loadTemplateFromExplicitDirect(\n tx: PlTransaction,\n spec: ExplicitTemplate,\n): AnyRef {\n const templateInfo = parseTemplate(spec.content);\n\n const templateFormat = templateInfo.type;\n switch (templateFormat) {\n case 'pl.tengo-template.v2':\n return createTemplateV2Tree(tx, templateInfo);\n case 'pl.tengo-template.v3':\n return createTemplateV3Tree(tx, templateInfo);\n default:\n assertNever(templateFormat);\n }\n}\n\nexport function loadTemplateFromPrepared(\n tx: PlTransaction,\n spec: PreparedTemplate,\n): AnyRef {\n const templateData = spec.data;\n\n const templateFormat = templateData.type;\n switch (templateFormat) {\n case 'pl.tengo-template.v2':\n return createTemplateV2Tree(tx, templateData);\n case 'pl.tengo-template.v3':\n return createTemplateV3Tree(tx, templateData);\n default:\n assertNever(templateFormat);\n }\n}\n\ntype Renderer<T> = {\n hash: Hasher<T>;\n render: (resource: T, tx: PlTransaction, creator: Creator) => AnyResourceRef;\n};\ntype Hasher<T> = (resource: T, hash: Hash) => void;\ntype Creator = <T>(resource: T, renderer: Renderer<T>) => AnyResourceRef;\n\nconst LibRenderer: Renderer<TemplateLibData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateLibV1.type.name)\n .update(PlTemplateLibV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n return tx.createValue(\n PlTemplateLibV1.type,\n JSON.stringify(PlTemplateLibV1.fromV2Data(resource).data),\n );\n },\n};\n\nconst SoftwareInfoRenderer: Renderer<TemplateSoftwareData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateSoftwareV1.type.name)\n .update(PlTemplateSoftwareV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n const sw = PlTemplateSoftwareV1.fromV2Data(resource);\n const ref = tx.createStruct(PlTemplateSoftwareV1.type, sw.data);\n tx.setKValue(ref, PlTemplateSoftwareV1.metaNameKey, JSON.stringify(sw.name));\n tx.lock(ref);\n return ref;\n },\n};\n\nconst TemplateRenderer: Renderer<TemplateData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateV1.type.name)\n .update(PlTemplateV1.type.version)\n .update(resource.hashOverride ?? 'no-override')\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n\n const srt = <T>(entries: [string, T][]): [string, T][] => {\n entries.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1));\n return entries;\n };\n\n for (const [libId, lib] of srt(Object.entries(resource.libs ?? {}))) {\n hash.update('lib:' + libId);\n LibRenderer.hash(lib, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.software ?? {}))) {\n hash.update('soft:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.assets ?? {}))) {\n hash.update('asset:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [tplId, tpl] of srt(Object.entries(resource.templates ?? {}))) {\n hash.update('tpl:' + tplId);\n this.hash(tpl, hash);\n }\n },\n render(resource, tx, _creator) {\n const tplRef = tx.createStruct(\n PlTemplateV1.type,\n JSON.stringify(PlTemplateV1.fromV2Data(resource).data),\n );\n // Render libraries\n for (const [libId, lib] of Object.entries(resource.libs ?? {})) {\n const fld = PlTemplateV1.libField(tplRef, libId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(lib, LibRenderer));\n }\n\n // Render software and assets\n for (const [swId, sw] of Object.entries(resource.software ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n for (const [swId, sw] of Object.entries(resource.assets ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n\n // Render dependency templates\n for (const [depTplId, depTpl] of Object.entries(resource.templates ?? {})) {\n const fld = PlTemplateV1.tplField(tplRef, depTplId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(depTpl, TemplateRenderer));\n }\n\n tx.lock(tplRef);\n\n if (!resource.hashOverride) return tplRef;\n\n // Override template hash with proxy resource, when hash override is configured for template\n const overrideRef = tx.createStruct(\n PlTemplateOverrideV1.type,\n JSON.stringify(PlTemplateOverrideV1.fromV2Data(resource)),\n );\n const fld = PlTemplateOverrideV1.tplField(overrideRef);\n tx.createField(fld, 'Service');\n tx.setField(fld, tplRef);\n tx.lock(overrideRef);\n return overrideRef;\n },\n};\n\nfunction createTemplateV2Tree(tx: PlTransaction, tplData: TemplateData): AnyRef {\n const resourceCache = new Map<string, AnyResourceRef>();\n\n const createResource = <T>(resource: T, renderer: Renderer<T>): AnyResourceRef => {\n const hasher: Hash = createHash('sha256');\n renderer.hash(resource, hasher);\n\n const rKey = hasher.digest('hex');\n\n if (!resourceCache.has(rKey)) {\n const rId = renderer.render(resource, tx, createResource);\n resourceCache.set(rKey, rId);\n }\n\n return resourceCache.get(rKey)!;\n };\n\n return createResource(tplData, TemplateRenderer);\n}\n","import type { AnyRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field, Pl } from '@milaboratories/pl-client';\nimport fs from 'node:fs';\nimport type {\n TemplateFromRegistry,\n TemplateSpecAny,\n TemplateSpecPrepared,\n} from '../../model/template_spec';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { loadTemplateFromExplicitDirect, loadTemplateFromPrepared } from './direct_template_loader';\n\n//\n// Resource schema\n//\n\nexport const TengoTemplateGet: ResourceType = { name: 'TengoTemplateGet', version: '1' };\nexport const TengoTemplateGetRegistry = 'registry';\nexport const TengoTemplateGetTemplateURI = 'templateURI';\nexport const TengoTemplateGetTemplate = 'template';\n\nexport const TengoTemplatePack: ResourceType = { name: 'TengoTemplatePack', version: '1' };\nexport const TengoTemplatePackConvert: ResourceType = {\n name: 'TengoTemplatePackConvert',\n version: '1',\n};\nexport const TengoTemplatePackConvertTemplatePack = 'templatePack';\nexport const TengoTemplatePackConvertTemplate = 'template';\n\nexport async function prepareTemplateSpec(tpl: TemplateSpecAny): Promise<TemplateSpecPrepared> {\n switch (tpl.type) {\n case 'from-file':\n return {\n type: 'explicit',\n content: await fs.promises.readFile(tpl.path),\n };\n case 'from-registry':\n case 'explicit':\n return tpl;\n case 'prepared':\n return tpl;\n default:\n return assertNever(tpl);\n }\n}\n\nfunction loadTemplateFromRegistry(tx: PlTransaction, spec: TemplateFromRegistry): AnyRef {\n const getTemplate = tx.createStruct(TengoTemplateGet);\n const registry = field(getTemplate, TengoTemplateGetRegistry);\n const uri = field(getTemplate, TengoTemplateGetTemplateURI);\n const templateFromRegistry = field(getTemplate, TengoTemplateGetTemplate);\n\n // Note: it has a resource schema, so platforma creates fields by itself.\n\n tx.setField(registry, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.registry))));\n tx.setField(uri, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.path))));\n\n return templateFromRegistry;\n}\n\nexport function loadTemplate(tx: PlTransaction, spec: TemplateSpecPrepared): AnyRef {\n switch (spec.type) {\n case 'from-registry':\n return loadTemplateFromRegistry(tx, spec);\n case 'explicit':\n return loadTemplateFromExplicitDirect(tx, spec);\n case 'prepared':\n return loadTemplateFromPrepared(tx, spec);\n default:\n return assertNever(spec);\n }\n}\n","import type { ExplicitTemplate, PreparedTemplate } from './template_spec';\nimport type { ResourceType } from '@milaboratories/pl-client';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\n\nexport type FrontendSpec = FrontendFromUrl | FrontendFromFolder;\n\nexport interface FrontendFromUrlData {\n url: string;\n}\n\nexport const FrontendFromUrlResourceType: ResourceType = { name: 'Frontend/FromUrl', version: '1' };\n\n/** Directs user of the block pack to download the contents from the URL\n * outside the pl infrastructure. */\nexport interface FrontendFromUrl extends FrontendFromUrlData {\n type: 'url';\n}\n\nexport interface FrontendFromFolderData {\n path: string;\n /** HMAC signature of the path using local secret encoded as hex. */\n signature: string;\n}\n\nexport const FrontendFromFolderResourceType: ResourceType = {\n name: 'Frontend/FromFolder',\n version: '1',\n};\n\n/** Directs user of the block pack to load frontend from specific local\n * folder. Signature allows to confirm that this is the same client who\n * added the resource. */\nexport interface FrontendFromFolder extends FrontendFromFolderData {\n type: 'local';\n}\n\n/** Direct instructions to create block-pack from client. Currently, this\n * is the only block-pack spec that can be directly materialized. */\nexport interface BlockPackExplicit {\n type: 'explicit';\n template: ExplicitTemplate;\n config: BlockConfigContainer;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n}\n\n/** Block-pack spec that can be materialized in pl. */\nexport type BlockPackSpecPrepared = {\n type: 'prepared';\n template: PreparedTemplate;\n config: BlockConfigContainer;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n};\n\n/** All block-pack specs. */\nexport type BlockPackSpecAny = BlockPackSpecPrepared | BlockPackExplicit | BlockPackSpec;\n","import type { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData,\n FrontendSpec,\n} from '../../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n","import { Worker } from 'node:worker_threads';\nimport type { Scheme } from './workerApi';\nimport path from 'node:path';\n\nexport class WorkerManager implements AsyncDisposable {\n private nextMessageId = 0;\n private worker: Worker;\n private pendingRequests = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>();\n\n constructor() {\n const workerPath: string | undefined = typeof global !== 'undefined'\n && '__WORKER_PATH__' in global\n ? global.__WORKER_PATH__ as string\n : path.resolve(import.meta.dirname, 'worker.js');\n\n const worker = this.worker = new Worker(\n workerPath,\n {\n workerData: {},\n },\n );\n\n worker.on('message', ({ id, data, error }) => {\n const { resolve, reject } = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n if (error) {\n reject(new Error(error));\n } else {\n resolve(data);\n }\n });\n\n worker.on('error', (msg) => {\n console.error('Worker error', msg);\n this.rejectAllPendingRequests(msg);\n });\n }\n\n private rejectAllPendingRequests(msg: unknown) {\n Array.from(this.pendingRequests.values()).map(({ reject }) => {\n reject(msg);\n });\n }\n\n async process<\n Type extends keyof Scheme,\n Args extends Scheme[Type]['args'],\n Response extends Scheme[Type]['response']>(type: Type, ...args: Args): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n const id = ++this.nextMessageId;\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.worker.postMessage({ id, type, args });\n });\n }\n\n async terminate() {\n this.rejectAllPendingRequests(new Error('Worker terminated'));\n await this.worker.terminate();\n }\n\n [Symbol.asyncDispose]() {\n return this.terminate();\n }\n}\n","import type { AnyResourceRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport { createFrontend } from './frontend';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport type { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport type { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\nimport { LRUCache } from 'lru-cache';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { WorkerManager } from '../../worker/WorkerManager';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nfunction bufferToString(buffer: ArrayBuffer): string {\n return Buffer.from(buffer).toString('utf8');\n}\n\nfunction bufferToJson(buffer: ArrayBuffer): unknown {\n return JSON.parse(bufferToString(buffer));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'prepared':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return bufferToJson(configResponse) as BlockConfigContainer;\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return bufferToJson(configResponse) as BlockConfigContainer;\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === 'prepared') {\n return spec;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n return {\n ...explicit,\n type: 'prepared',\n template: {\n type: 'prepared',\n data: await workerManager.process('parseTemplate', explicit.template.content),\n },\n };\n }\n\n private async prepareWithoutUnpacking(spec: BlockPackExplicit | BlockPackSpec): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8'),\n ) as BlockConfigContainer;\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = JSON.parse(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n }),\n ) as BlockConfigContainer;\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = bufferToJson(configResponse) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n bufferToJson(await this.remoteContentCache.forceFetch(components.model.url)) as BlockConfigContainer;\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'prepared':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n","import { assertNever } from '@milaboratories/ts-helpers';\nimport type { PlRef } from '@platforma-sdk/model';\n\nexport function outputRef(blockId: string, name: string, requireEnrichments?: boolean): PlRef {\n if (requireEnrichments) return { __isRef: true, blockId, name, requireEnrichments };\n else return { __isRef: true, blockId, name };\n}\n\nexport function isBlockOutputReference(obj: unknown): obj is PlRef {\n return (\n typeof obj === 'object'\n && obj !== null\n && '__isRef' in obj\n && obj.__isRef === true\n && 'blockId' in obj\n && 'name' in obj\n );\n}\n\nfunction addAllReferencedBlocks(result: BlockUpstreams, node: unknown, allowed?: Set<string>) {\n const type = typeof node;\n switch (type) {\n case 'function':\n case 'bigint':\n case 'number':\n case 'string':\n case 'boolean':\n case 'symbol':\n case 'undefined':\n return;\n\n case 'object':\n if (node === null) return;\n\n if (isBlockOutputReference(node)) {\n if (allowed === undefined || allowed.has(node.blockId)) {\n result.upstreams.add(node.blockId);\n if (node.requireEnrichments)\n result.upstreamsRequiringEnrichments.add(node.blockId);\n } else result.missingReferences = true;\n } else if (Array.isArray(node)) {\n for (const child of node) addAllReferencedBlocks(result, child, allowed);\n } else {\n for (const [, child] of Object.entries(node as object))\n addAllReferencedBlocks(result, child, allowed);\n }\n\n return;\n\n default:\n assertNever(type);\n }\n}\n\nexport interface BlockUpstreams {\n /** All direct block dependencies */\n upstreams: Set<string>;\n /** Direct block dependencies which enrichments are also required by current block */\n upstreamsRequiringEnrichments: Set<string>;\n /** True if not-allowed references was encountered */\n missingReferences: boolean;\n}\n\n/** Extracts all resource ids referenced by args object. */\nexport function inferAllReferencedBlocks(args: unknown, allowed?: Set<string>): BlockUpstreams {\n const result = { upstreams: new Set<string>(), upstreamsRequiringEnrichments: new Set<string>(), missingReferences: false };\n addAllReferencedBlocks(result, args, allowed);\n return result;\n}\n","import type { Block, ProjectStructure } from './project_model';\nimport type { Optional, Writable } from 'utility-types';\nimport { inferAllReferencedBlocks } from './args';\nimport type { PlRef } from '@milaboratories/pl-model-common';\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n },\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Upstreams, calculated accounting for potential indirect block dependencies */\n readonly upstream: Set<string>;\n /** Direct upstream, listed in block args */\n readonly directUpstream: Set<string>;\n /** Downstreams, calculated accounting for potential indirect block dependencies */\n readonly downstream: Set<string>;\n /** Downstream blocks enriching current block's outputs */\n readonly enrichments: Set<string>;\n /** Direct downstreams listing our block in it's args */\n readonly directDownstream: Set<string>;\n /** Upstream blocks that current block may enrich with its exports */\n readonly enrichmentTargets: Set<string>;\n}\n\nexport type BlockGraphDirection = 'upstream' | 'downstream' | 'directUpstream' | 'directDownstream' | 'enrichments' | 'enrichmentTargets';\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: BlockGraphDirection,\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void,\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n const nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction].forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, BlockGraphDirection>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false,\n };\n result.set(id, current);\n if (previous === undefined) {\n current.directUpstream = current.upstream = new Set<string>();\n current.enrichments = current.enrichmentTargets = new Set<string>();\n } else {\n current.directUpstream = current.upstream = new Set<string>([previous.id]);\n previous.directDownstream = previous.downstream = new Set<string>([current.id]);\n previous.enrichments = previous.enrichmentTargets = new Set<string>();\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.directDownstream = previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport type ProductionGraphBlockInfo = {\n args: unknown;\n enrichmentTargets: PlRef[] | undefined;\n};\n\nexport function productionGraph(\n structure: ProjectStructure,\n infoProvider: (blockId: string) => ProductionGraphBlockInfo | undefined,\n): BlockGraph {\n const resultMap = new Map<string, BlockGraphNode>();\n // result graph is constructed to be able to perform traversal on incomplete graph\n // to calculate potentialUpstreams\n const resultGraph = new BlockGraph(resultMap);\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const allAbove = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const info = infoProvider(id);\n\n // skipping those blocks for which we don't have args\n if (info === undefined) continue;\n\n const references = inferAllReferencedBlocks(info.args, allAbove);\n\n // The algorithm here adds all downstream blocks of direct upstreams as potential upstreams.\n // They may produce additional columns, anchored in our direct upstream, those columns might be needed by the workflow.\n const potentialUpstreams = new Set([\n ...references.upstreams,\n ...resultGraph.traverseIds('enrichments', ...references.upstreamsRequiringEnrichments),\n ]);\n\n // To minimize complexity of the graph, we leave only the closest upstreams, removing all their transitive dependencies,\n // relying on the traversal mechanisms in BContexts and on UI level to connect our block with all upstreams\n const upstreams = new Set<string>();\n for (const { id: pId } of allBlocks(structure)) {\n if (pId === id) break; // stopping on current block\n if (potentialUpstreams.has(pId)) {\n upstreams.add(pId);\n for (const transitiveUpstream of resultGraph.traverseIdsExcludingRoots('upstream', pId))\n upstreams.delete(transitiveUpstream);\n }\n }\n\n // default assumption is that all direct upstreams are enrichment targets\n const enrichmentTargets = info.enrichmentTargets === undefined\n ? new Set(references.upstreams)\n : new Set(info.enrichmentTargets.map((t) => t.blockId));\n\n const node: BlockGraphNode = {\n id,\n missingReferences: references.missingReferences,\n upstream: upstreams,\n directUpstream: references.upstreams,\n enrichmentTargets,\n downstream: new Set<string>(), // will be populated from downstream blocks\n directDownstream: new Set<string>(), // will be populated from downstream blocks\n enrichments: new Set<string>(), // will be populated from downstream blocks\n };\n resultMap.set(id, node);\n references.upstreams.forEach((dep) => resultMap.get(dep)!.directDownstream.add(id));\n upstreams.forEach((dep) => resultMap.get(dep)!.downstream.add(id));\n enrichmentTargets.forEach((dep) => resultMap.get(dep)?.enrichments.add(id));\n allAbove.add(id);\n }\n\n return resultGraph;\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n","import type { AnyRef, PlTransaction } from '@milaboratories/pl-client';\nimport { createRenderTemplate } from './template/render_template';\nimport { prepareTemplateSpec } from './template/template_loading';\nimport type { TemplateSpecPrepared } from '../model/template_spec';\nimport { createHash } from 'node:crypto';\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(SdkTemplates['pframes.export-pframe-for-ui']);\n if (preparedTemplate.type !== 'explicit') throw new Error('Unexpected prepared template type.');\n const hash = createHash('sha256').update(preparedTemplate.content).digest('hex');\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, ['result']).result;\n}\n","export type MlDebugFlags = {\n logPFrameRequests: boolean;\n logTreeStats?: 'cumulative' | 'per-request';\n logProjectMutationStat: boolean;\n dumpInitialTreeState: boolean;\n logOutputStatus?: 'any' | 'unstable-only';\n logOutputRecalculations?: boolean;\n};\n\nlet flags: MlDebugFlags | undefined = undefined;\nexport function getDebugFlags() {\n if (flags) return flags;\n flags = {\n logPFrameRequests: process.env.MI_LOG_PFRAMES !== undefined,\n dumpInitialTreeState: process.env.MI_DUMP_INITIAL_TREE_STATE !== undefined,\n logProjectMutationStat: process.env.MI_LOG_PROJECT_MUTATION_STAT !== undefined,\n logOutputRecalculations: process.env.MI_LOG_OUTPUT_RECALCULATIONS !== undefined,\n };\n if (process.env.MI_LOG_OUTPUT_STATUS)\n flags.logOutputStatus = process.env.MI_LOG_OUTPUT_STATUS === 'unstable-only' ? 'unstable-only' : 'any';\n if (process.env.MI_LOG_TREE_STAT)\n flags.logTreeStats = process.env.MI_LOG_TREE_STAT === 'cumulative' ? 'cumulative' : 'per-request';\n return flags;\n}\n","import type {\n AnyRef,\n AnyResourceRef,\n BasicResourceData,\n PlTransaction,\n ResourceData,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n ensureResourceIdNotNull,\n field,\n isNotNullResourceId,\n isNullResourceId,\n isResource,\n isResourceId,\n isResourceRef,\n Pl,\n PlClient,\n} from '@milaboratories/pl-client';\nimport { createRenderHeavyBlock, createBContextFromUpstreams } from './template/render_block';\nimport type {\n Block,\n ProjectStructure,\n ProjectField,\n ProjectRenderingState } from '../model/project_model';\nimport {\n BlockRenderingStateKey,\n ProjectStructureKey,\n parseProjectField,\n projectFieldName,\n SchemaVersionCurrent,\n SchemaVersionKey,\n ProjectResourceType,\n InitialBlockStructure,\n InitialProjectRenderingState,\n ProjectMetaKey,\n InitialBlockMeta,\n blockArgsAuthorKey,\n ProjectLastModifiedTimestamp,\n ProjectCreatedTimestamp,\n ProjectStructureAuthorKey,\n getServiceTemplateField,\n FieldsToDuplicate,\n} from '../model/project_model';\nimport { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';\nimport type {\n BlockGraph,\n ProductionGraphBlockInfo } from '../model/project_model_util';\nimport {\n allBlocks,\n graphDiff,\n productionGraph,\n stagingGraph,\n} from '../model/project_model_util';\nimport type { BlockPackSpecPrepared } from '../model';\nimport type {\n AuthorMarker,\n BlockPackSpec,\n BlockSettings,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport {\n InitialBlockSettings,\n} from '@milaboratories/pl-model-middle-layer';\nimport Denque from 'denque';\nimport { exportContext, getPreparedExportTemplateEnvelope } from './context_export';\nimport { loadTemplate } from './template/template_loading';\nimport { cachedDeserialize, notEmpty, canonicalJsonGzBytes, canonicalJsonBytes } from '@milaboratories/ts-helpers';\nimport type { ProjectHelper } from '../model/project_helper';\nimport { extractConfig, UiError, type BlockConfig } from '@platforma-sdk/model';\nimport { getDebugFlags } from '../debug';\nimport type { BlockPackInfo } from '../model/block_pack';\n\ntype FieldStatus = 'NotReady' | 'Ready' | 'Error';\n\ninterface BlockFieldState {\n modCount: number;\n ref?: AnyRef;\n status?: FieldStatus;\n value?: Uint8Array;\n}\n\ntype BlockFieldStates = Partial<Record<ProjectField['fieldName'], BlockFieldState>>;\ntype BlockFieldStateValue = Omit<BlockFieldState, 'modCount'>;\n\ninterface BlockInfoState {\n readonly id: string;\n readonly fields: BlockFieldStates;\n blockConfig?: BlockConfig;\n blockPack?: BlockPackSpec;\n}\n\nfunction cached<ModId, T>(modIdCb: () => ModId, valueCb: () => T): () => T {\n let initialized = false;\n let lastModId: ModId | undefined = undefined;\n let value: T | undefined = undefined;\n return () => {\n if (!initialized) {\n initialized = true;\n lastModId = modIdCb();\n value = valueCb();\n return value;\n }\n const currentModId = modIdCb();\n if (lastModId !== currentModId) {\n lastModId = currentModId;\n value = valueCb();\n }\n return valueCb();\n };\n}\n\nclass BlockInfo {\n constructor(\n public readonly id: string,\n public readonly fields: BlockFieldStates,\n public readonly config: BlockConfig,\n public readonly source: BlockPackSpec,\n ) {}\n\n public check() {\n // state assertions\n\n if ((this.fields.prodOutput === undefined) !== (this.fields.prodCtx === undefined))\n throw new Error('inconsistent prod fields');\n\n if ((this.fields.stagingOutput === undefined) !== (this.fields.stagingCtx === undefined))\n throw new Error('inconsistent stage fields');\n\n if (\n (this.fields.prodOutputPrevious === undefined)\n !== (this.fields.prodCtxPrevious === undefined)\n )\n throw new Error('inconsistent prod cache fields');\n\n if (\n (this.fields.stagingOutputPrevious === undefined)\n !== (this.fields.stagingCtxPrevious === undefined)\n )\n throw new Error('inconsistent stage cache fields');\n\n if (this.fields.blockPack === undefined) throw new Error('no block pack field');\n\n if (this.fields.currentArgs === undefined) throw new Error('no current args field');\n }\n\n private readonly currentArgsC = cached(\n () => this.fields.currentArgs!.modCount,\n () => cachedDeserialize(this.fields.currentArgs!.value!),\n );\n\n private readonly prodArgsC = cached(\n () => this.fields.prodArgs?.modCount,\n () => {\n const bin = this.fields.prodArgs?.value;\n if (bin === undefined) return undefined;\n return cachedDeserialize(bin);\n },\n );\n\n get currentArgs(): unknown {\n return this.currentArgsC();\n }\n\n get stagingRendered(): boolean {\n return this.fields.stagingCtx !== undefined;\n }\n\n get productionRendered(): boolean {\n return this.fields.prodCtx !== undefined;\n }\n\n get productionHasErrors(): boolean {\n return this.fields.prodUiCtx?.status === 'Error';\n }\n\n private readonly productionStaleC: () => boolean = cached(\n () => `${this.fields.currentArgs!.modCount}_${this.fields.prodArgs?.modCount}`,\n () =>\n this.fields.prodArgs === undefined\n || Buffer.compare(this.fields.currentArgs!.value!, this.fields.prodArgs.value!) !== 0,\n );\n\n // get productionStale(): boolean {\n // return this.productionRendered && this.productionStaleC() && ;\n // }\n\n get requireProductionRendering(): boolean {\n return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;\n }\n\n get prodArgs(): unknown {\n return this.prodArgsC();\n }\n\n public getTemplate(tx: PlTransaction): AnyRef {\n return tx.getFutureFieldValue(\n Pl.unwrapHolder(tx, this.fields.blockPack!.ref!),\n BlockPackTemplateField,\n 'Input',\n );\n }\n}\n\nexport interface NewBlockSpec {\n blockPack: BlockPackSpecPrepared;\n args: string;\n uiState: string;\n}\n\nconst NoNewBlocks = (blockId: string) => {\n throw new Error(`No new block info for ${blockId}`);\n};\n\nexport interface SetStatesRequest {\n blockId: string;\n args?: unknown;\n uiState?: unknown;\n}\n\ntype _GraphInfoFields =\n | 'stagingUpstream'\n | 'stagingDownstream'\n | 'futureProductionUpstream'\n | 'futureProductionDownstream'\n | 'actualProductionUpstream'\n | 'actualProductionDownstream';\n\nexport type ArgsAndUiState = {\n args: unknown;\n uiState: unknown;\n};\n\nexport class ProjectMutator {\n private globalModCount = 0;\n private fieldsChanged: boolean = false;\n\n //\n // Change trackers\n //\n\n private lastModifiedChanged = false;\n private structureChanged = false;\n private metaChanged = false;\n private renderingStateChanged = false;\n\n /** Set blocks will be assigned current mutator author marker on save */\n private readonly blocksWithChangedInputs = new Set<string>();\n\n constructor(\n public readonly rid: ResourceId,\n private readonly tx: PlTransaction,\n private readonly author: AuthorMarker | undefined,\n private readonly schema: string,\n private lastModified: number,\n private meta: ProjectMeta,\n private struct: ProjectStructure,\n private readonly renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>,\n private readonly blocksInLimbo: Set<string>,\n private readonly blockInfos: Map<string, BlockInfo>,\n private readonly ctxExportTplHolder: AnyResourceRef,\n private readonly projectHelper: ProjectHelper,\n ) {}\n\n private fixProblemsAndMigrate() {\n // Fixing problems introduced by old code\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodArgs === undefined\n || blockInfo.fields.prodOutput === undefined\n || blockInfo.fields.prodCtx === undefined\n )\n this.deleteBlockFields(blockInfo.id, 'prodArgs', 'prodOutput', 'prodCtx');\n });\n\n // Migration for addition of block settings field\n let initialBlockSettings: Omit<BlockFieldState, 'modCount'> | undefined;\n this.blockInfos.forEach((blockInfo) => {\n if (blockInfo.fields.blockSettings === undefined) {\n if (initialBlockSettings === undefined)\n initialBlockSettings = this.createJsonFieldValue(InitialBlockSettings);\n this.setBlockFieldObj(blockInfo.id, 'blockSettings', initialBlockSettings);\n }\n });\n }\n\n get wasModified(): boolean {\n return (\n this.lastModifiedChanged\n || this.structureChanged\n || this.fieldsChanged\n || this.metaChanged\n || this.renderingStateChanged\n );\n }\n\n get structure(): ProjectStructure {\n // clone\n return JSON.parse(JSON.stringify(this.struct)) as ProjectStructure;\n }\n\n //\n // Graph calculation\n //\n\n private stagingGraph: BlockGraph | undefined = undefined;\n private pendingProductionGraph: BlockGraph | undefined = undefined;\n private actualProductionGraph: BlockGraph | undefined = undefined;\n\n private getStagingGraph(): BlockGraph {\n if (this.stagingGraph === undefined) this.stagingGraph = stagingGraph(this.struct);\n return this.stagingGraph;\n }\n\n private getProductionGraphBlockInfo(blockId: string, prod: boolean): ProductionGraphBlockInfo | undefined {\n const bInfo = this.getBlockInfo(blockId);\n\n let argsField: BlockFieldState;\n let args: unknown;\n\n if (prod) {\n if (bInfo.fields.prodArgs === undefined) return undefined;\n argsField = bInfo.fields.prodArgs;\n args = bInfo.prodArgs;\n } else {\n argsField = notEmpty(bInfo.fields.currentArgs);\n args = bInfo.currentArgs;\n }\n\n const blockPackField = notEmpty(bInfo.fields.blockPack);\n\n if (isResourceId(argsField.ref!) && isResourceId(blockPackField.ref!))\n return {\n args,\n enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args,\n { argsRid: argsField.ref, blockPackRid: blockPackField.ref }),\n };\n else\n return {\n args,\n enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args),\n };\n }\n\n private getPendingProductionGraph(): BlockGraph {\n if (this.pendingProductionGraph === undefined)\n this.pendingProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getProductionGraphBlockInfo(blockId, false),\n );\n return this.pendingProductionGraph;\n }\n\n private getActualProductionGraph(): BlockGraph {\n if (this.actualProductionGraph === undefined)\n this.actualProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getProductionGraphBlockInfo(blockId, true),\n );\n return this.actualProductionGraph;\n }\n\n //\n // Generic helpers to interact with project state\n //\n\n private getBlockInfo(blockId: string): BlockInfo {\n const info = this.blockInfos.get(blockId);\n if (info === undefined) throw new Error(`No such block: ${blockId}`);\n return info;\n }\n\n private createJsonFieldValueByContent(content: string): BlockFieldStateValue {\n const value = Buffer.from(content);\n const ref = this.tx.createValue(Pl.JsonObject, value);\n return { ref, value, status: 'Ready' };\n }\n\n private createJsonFieldValue(obj: unknown): BlockFieldStateValue {\n return this.createJsonFieldValueByContent(JSON.stringify(obj));\n }\n\n private getBlock(blockId: string): Block {\n for (const block of allBlocks(this.struct)) if (block.id === blockId) return block;\n throw new Error('block not found');\n }\n\n private setBlockFieldObj(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n state: BlockFieldStateValue,\n ) {\n const fid = field(this.rid, projectFieldName(blockId, fieldName));\n\n if (state.ref === undefined) throw new Error('Can\\'t set value with empty ref');\n\n if (this.getBlockInfo(blockId).fields[fieldName] === undefined)\n this.tx.createField(fid, 'Dynamic', state.ref);\n else this.tx.setField(fid, state.ref);\n\n this.getBlockInfo(blockId).fields[fieldName] = {\n modCount: this.globalModCount++,\n ...state,\n };\n\n this.fieldsChanged = true;\n }\n\n private setBlockField(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n ref: AnyRef,\n status: FieldStatus,\n value?: Uint8Array,\n ) {\n this.setBlockFieldObj(blockId, fieldName, { ref, status, value });\n }\n\n private deleteBlockFields(blockId: string, ...fieldNames: (keyof BlockFieldStates)[]): boolean {\n let deleted = false;\n const info = this.getBlockInfo(blockId);\n for (const fieldName of fieldNames) {\n const fields = info.fields;\n if (!(fieldName in fields)) continue;\n this.tx.removeField(field(this.rid, projectFieldName(blockId, fieldName)));\n delete fields[fieldName];\n this.fieldsChanged = true;\n deleted = true;\n }\n return deleted;\n }\n\n private updateLastModified() {\n this.lastModified = Date.now();\n this.lastModifiedChanged = true;\n }\n\n //\n // Main project actions\n //\n\n private resetStagingRefreshTimestamp() {\n this.renderingState.stagingRefreshTimestamp = Date.now();\n this.renderingStateChanged = true;\n }\n\n private resetStaging(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.stagingOutput?.status === 'Ready'\n && fields.stagingCtx?.status === 'Ready'\n && fields.stagingUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'stagingOutputPrevious', fields.stagingOutput);\n this.setBlockFieldObj(blockId, 'stagingCtxPrevious', fields.stagingCtx);\n this.setBlockFieldObj(blockId, 'stagingUiCtxPrevious', fields.stagingUiCtx);\n }\n if (this.deleteBlockFields(blockId, 'stagingOutput', 'stagingCtx', 'stagingUiCtx'))\n this.resetStagingRefreshTimestamp();\n }\n\n private resetProduction(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.prodOutput?.status === 'Ready'\n && fields.prodCtx?.status === 'Ready'\n && fields.prodUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'prodOutputPrevious', fields.prodOutput);\n this.setBlockFieldObj(blockId, 'prodCtxPrevious', fields.prodCtx);\n this.setBlockFieldObj(blockId, 'prodUiCtxPrevious', fields.prodUiCtx);\n }\n this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Running blocks are reset, already computed moved to limbo. Returns if\n * either of the actions were actually performed.\n * This method ensures the block is left in a consistent state that passes check() constraints. */\n private resetOrLimboProduction(blockId: string): boolean {\n const fields = this.getBlockInfo(blockId).fields;\n\n // Check if we can safely move to limbo (both core production fields are ready)\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {\n if (this.blocksInLimbo.has(blockId))\n // we are already in limbo\n return false;\n\n // limbo - keep the ready production results but clean up cache\n this.blocksInLimbo.add(blockId);\n this.renderingStateChanged = true;\n\n // doing some gc - clean up previous cache fields\n this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');\n\n return true;\n } else {\n // reset - clean up any partial/inconsistent production stat\n return this.deleteBlockFields(\n blockId,\n 'prodOutput',\n 'prodCtx',\n 'prodUiCtx',\n 'prodArgs',\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n );\n }\n }\n\n /** Optimally sets inputs for multiple blocks in one go */\n public setStates(requests: SetStatesRequest[]) {\n const changedArgs: string[] = [];\n let somethingChanged = false;\n for (const req of requests) {\n const info = this.getBlockInfo(req.blockId);\n let blockChanged = false;\n for (const stateKey of ['args', 'uiState'] as const) {\n if (!(stateKey in req)) continue;\n const statePart = req[stateKey];\n if (statePart === undefined || statePart === null)\n throw new Error(\n `Can't set ${stateKey} to null or undefined, please omit the key if you don't want to change it`,\n );\n\n const fieldName = stateKey === 'args' ? 'currentArgs' : 'uiState';\n\n let data: Uint8Array;\n let gzipped: boolean = false;\n if (stateKey === 'args') {\n // don't gzip args, workflow code can't uncompress gzip yet\n data = canonicalJsonBytes(statePart);\n } else {\n const { data: binary, isGzipped } = canonicalJsonGzBytes(statePart);\n data = binary;\n gzipped = isGzipped;\n }\n if (Buffer.compare(info.fields[fieldName]!.value!, data) === 0) continue;\n console.log('setting', fieldName, gzipped, data.length);\n const statePartRef = this.tx.createValue(gzipped ? Pl.JsonGzObject : Pl.JsonObject, data);\n this.setBlockField(req.blockId, fieldName, statePartRef, 'Ready', data);\n\n blockChanged = true;\n if (stateKey === 'args') changedArgs.push(req.blockId);\n }\n if (blockChanged) {\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(req.blockId);\n somethingChanged = true;\n }\n }\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', changedArgs, ({ id }) => this.resetStaging(id));\n\n if (somethingChanged) this.updateLastModified();\n }\n\n public setBlockSettings(blockId: string, newValue: BlockSettings): void {\n this.setBlockFieldObj(blockId, 'blockSettings', this.createJsonFieldValue(newValue));\n this.updateLastModified();\n }\n\n private createProdCtx(upstream: Set<string>): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields['prodCtx']?.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields['prodCtx'].ref));\n });\n return createBContextFromUpstreams(this.tx, upstreamContexts);\n }\n\n private createStagingCtx(upstream: Set<string>): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields['stagingCtx']?.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields['stagingCtx'].ref));\n if (info.fields['prodCtx']?.ref !== undefined)\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields['prodCtx'].ref));\n });\n return createBContextFromUpstreams(this.tx, upstreamContexts);\n }\n\n private exportCtx(ctx: AnyRef): AnyRef {\n return exportContext(this.tx, Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);\n }\n\n private renderStagingFor(blockId: string) {\n this.resetStaging(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createStagingCtx(this.getStagingGraph().nodes.get(blockId)!.upstream);\n\n if (this.getBlock(blockId).renderingMode !== 'Heavy') throw new Error('not supported yet');\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(false)),\n context: ctx,\n });\n\n this.setBlockField(\n blockId,\n 'stagingCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady',\n );\n\n this.setBlockField(blockId, 'stagingUiCtx', this.exportCtx(results.context), 'NotReady');\n\n this.setBlockField(blockId, 'stagingOutput', results.result, 'NotReady');\n }\n\n private renderProductionFor(blockId: string) {\n this.resetProduction(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId)!.upstream);\n\n if (this.getBlock(blockId).renderingMode === 'Light')\n throw new Error('Can\\'t render production for light block.');\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(true)),\n context: ctx,\n });\n this.setBlockField(\n blockId,\n 'prodCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady',\n );\n this.setBlockField(blockId, 'prodUiCtx', this.exportCtx(results.context), 'NotReady');\n this.setBlockField(blockId, 'prodOutput', results.result, 'NotReady');\n\n // saving inputs for which we rendered the production\n this.setBlockFieldObj(blockId, 'prodArgs', info.fields.currentArgs!);\n\n // removing block from limbo as we juts rendered fresh production for it\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n }\n\n //\n // Structure changes\n //\n\n private initializeNewBlock(blockId: string, spec: NewBlockSpec): void {\n const info = new BlockInfo(blockId, {}, extractConfig(spec.blockPack.config), spec.blockPack.source);\n this.blockInfos.set(blockId, info);\n\n // block pack\n const bp = createBlockPack(this.tx, spec.blockPack);\n this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');\n\n // settings\n this.setBlockFieldObj(\n blockId,\n 'blockSettings',\n this.createJsonFieldValue(InitialBlockSettings),\n );\n\n // args\n this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));\n\n // uiState\n this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));\n\n // checking structure\n info.check();\n }\n\n private getFieldNamesToDuplicate(blockId: string): Set<ProjectField['fieldName']> {\n const fields = this.getBlockInfo(blockId).fields;\n\n const diff = <T>(setA: Set<T>, setB: Set<T>): Set<T> => new Set([...setA].filter((x) => !setB.has(x)));\n\n // Check if we can safely move to limbo (both core production fields are ready)\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {\n if (this.blocksInLimbo.has(blockId))\n // we are already in limbo\n return FieldsToDuplicate;\n\n return diff(FieldsToDuplicate, new Set([\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n ]));\n } else {\n return diff(FieldsToDuplicate, new Set([\n 'prodOutput',\n 'prodCtx',\n 'prodUiCtx',\n 'prodArgs',\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n ]));\n }\n }\n\n private initializeBlockDuplicate(blockId: string, originalBlockInfo: BlockInfo) {\n const info = new BlockInfo(\n blockId,\n {},\n originalBlockInfo.config,\n originalBlockInfo.source,\n );\n\n this.blockInfos.set(blockId, info);\n\n const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);\n\n // Copy all fields from original block to new block by sharing references\n for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) {\n if (fieldNamesToDuplicate.has(fieldName as ProjectField['fieldName']) && fieldState && fieldState.ref) {\n this.setBlockFieldObj(blockId, fieldName as keyof BlockFieldStates, {\n ref: fieldState.ref,\n status: fieldState.status,\n value: fieldState.value,\n });\n }\n }\n\n this.resetOrLimboProduction(blockId);\n\n info.check();\n }\n\n /** Very generic method, better check for more specialized case-specific methods first. */\n public updateStructure(\n newStructure: ProjectStructure,\n newBlockInitializer: (blockId: string) => void = NoNewBlocks,\n ): void {\n const currentStagingGraph = this.getStagingGraph();\n const currentActualProductionGraph = this.getActualProductionGraph();\n\n const newStagingGraph = stagingGraph(newStructure);\n\n const stagingDiff = graphDiff(currentStagingGraph, newStagingGraph);\n\n // removing blocks\n for (const blockId of stagingDiff.onlyInA) {\n const { fields } = this.getBlockInfo(blockId);\n this.deleteBlockFields(blockId, ...(Object.keys(fields) as ProjectField['fieldName'][]));\n this.blockInfos.delete(blockId);\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n }\n\n // creating new blocks\n for (const blockId of stagingDiff.onlyInB) {\n newBlockInitializer(blockId);\n }\n\n // resetting stagings affected by topology change\n for (const blockId of stagingDiff.different) this.resetStaging(blockId);\n\n // new actual production graph without new blocks\n const newActualProductionGraph = productionGraph(\n newStructure,\n (blockId) => this.getProductionGraphBlockInfo(blockId, true),\n );\n\n const prodDiff = graphDiff(currentActualProductionGraph, newActualProductionGraph);\n\n // applying changes due to topology change in production to affected nodes and\n // all their downstreams\n currentActualProductionGraph.traverse('downstream', [...prodDiff.different], (node) => {\n this.resetOrLimboProduction(node.id);\n });\n\n if (\n stagingDiff.onlyInB.size > 0\n || stagingDiff.onlyInA.size > 0\n || stagingDiff.different.size > 0\n )\n this.resetStagingRefreshTimestamp();\n\n this.struct = newStructure;\n this.structureChanged = true;\n this.stagingGraph = undefined;\n this.pendingProductionGraph = undefined;\n this.actualProductionGraph = undefined;\n\n this.updateLastModified();\n }\n\n //\n // Structure change helpers\n //\n\n public addBlock(block: Block, spec: NewBlockSpec, before?: string): void {\n const newStruct = this.structure; // copy current structure\n if (before === undefined) {\n // adding as a very last block\n newStruct.groups[newStruct.groups.length - 1].blocks.push(block);\n } else {\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === before);\n if (idx < 0) continue;\n group.blocks.splice(idx, 0, block);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${before}`);\n }\n this.updateStructure(newStruct, (blockId) => {\n if (blockId !== block.id) throw new Error('Unexpected');\n this.initializeNewBlock(blockId, spec);\n });\n }\n\n /**\n * Duplicates an existing block by copying all its fields and structure.\n * This method creates a deep copy of the block at the mutator level.\n *\n * @param originalBlockId id of the block to duplicate\n * @param newBlockId id for the new duplicated block\n * @param after id of the block to insert new block after\n */\n public duplicateBlock(originalBlockId: string, newBlockId: string, after?: string): void {\n // Get the original block from structure\n const originalBlock = this.getBlock(originalBlockId);\n const originalBlockInfo = this.getBlockInfo(originalBlockId);\n\n // Create new block in structure\n const newBlock: Block = {\n id: newBlockId,\n label: originalBlock.label,\n renderingMode: originalBlock.renderingMode,\n };\n\n // Add the new block to structure\n const newStruct = this.structure; // copy current structure\n if (after === undefined) {\n // adding as a very last block\n newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);\n } else {\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === after);\n if (idx < 0) continue;\n group.blocks.splice(idx + 1, 0, newBlock);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${after}`);\n }\n\n this.updateStructure(newStruct, (blockId) => {\n if (blockId !== newBlockId) throw new Error('Unexpected');\n this.initializeBlockDuplicate(blockId, originalBlockInfo);\n });\n }\n\n public deleteBlock(blockId: string): void {\n const newStruct = this.structure; // copy current structure\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === blockId);\n if (idx < 0) continue;\n group.blocks.splice(idx, 1);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${blockId}`);\n this.updateStructure(newStruct);\n }\n\n //\n // Block-pack migration\n //\n\n public migrateBlockPack(blockId: string, spec: BlockPackSpecPrepared, newArgsAndUiState?: ArgsAndUiState): void {\n const info = this.getBlockInfo(blockId);\n\n this.setBlockField(\n blockId,\n 'blockPack',\n Pl.wrapInHolder(this.tx, createBlockPack(this.tx, spec)),\n 'NotReady',\n );\n\n if (newArgsAndUiState !== undefined) {\n // this will also reset all downstream stagings\n this.setStates([{ blockId, args: newArgsAndUiState.args, uiState: newArgsAndUiState.uiState }]);\n } else {\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', [blockId], ({ id }) => this.resetStaging(id));\n }\n\n // also reset or limbo all downstream productions\n if (info.productionRendered)\n this.getActualProductionGraph().traverse('downstream', [blockId], ({ id }) =>\n this.resetOrLimboProduction(id),\n );\n\n this.updateLastModified();\n }\n\n //\n // Render\n //\n\n public renderProduction(blockIds: string[], addUpstreams: boolean = false): Set<string> {\n const blockIdsSet = new Set(blockIds);\n\n const prodGraph = this.getPendingProductionGraph();\n if (addUpstreams)\n // adding all upstreams automatically\n prodGraph.traverse('upstream', blockIds, (node) => {\n blockIdsSet.add(node.id);\n });\n else // checking that targets contain all upstreams\n for (const blockId of blockIdsSet) {\n const node = prodGraph.nodes.get(blockId);\n if (node === undefined) throw new Error(`Can't find block with id: ${blockId}`);\n for (const upstream of node.upstream)\n if (!blockIdsSet.has(upstream))\n throw new Error('Can\\'t render blocks not including all upstreams.');\n }\n\n // traversing in topological order and rendering target blocks\n const rendered = new Set<string>();\n for (const block of allBlocks(this.structure)) {\n if (!blockIdsSet.has(block.id)) continue;\n\n let render\n = this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);\n\n if (!render)\n for (const upstream of prodGraph.nodes.get(block.id)!.upstream)\n if (rendered.has(upstream)) {\n render = true;\n break;\n }\n\n if (render) {\n this.renderProductionFor(block.id);\n rendered.add(block.id);\n }\n }\n\n const renderedArray = [...rendered];\n\n // sending to limbo all downstream blocks\n prodGraph.traverse('downstream', renderedArray, (node) => {\n if (rendered.has(node.id))\n // don't send to limbo blocks that were just rendered\n return;\n this.resetOrLimboProduction(node.id);\n });\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', renderedArray, ({ id }) => {\n // don't reset staging of the first rendered block\n if (renderedArray[0] !== id) this.resetStaging(id);\n });\n\n if (rendered.size > 0) this.updateLastModified();\n\n return rendered;\n }\n\n /** Stops running blocks from the list and modify states of other blocks\n * accordingly */\n public stopProduction(...blockIds: string[]) {\n const activeProdGraph = this.getActualProductionGraph();\n\n // we will stop all blocks listed in request and all their downstreams\n const queue = new Denque(blockIds);\n const queued = new Set(blockIds);\n const stopped: string[] = [];\n\n while (!queue.isEmpty()) {\n const blockId = queue.shift()!;\n const fields = this.getBlockInfo(blockId).fields;\n\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready')\n // skipping finished blocks\n continue;\n\n if (this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs')) {\n // was actually stopped\n stopped.push(blockId);\n\n // will try to stop all its downstreams\n for (const downstream of activeProdGraph.traverseIdsExcludingRoots('downstream', blockId)) {\n if (queued.has(downstream)) continue;\n queue.push(downstream);\n queued.add(downstream);\n }\n }\n }\n\n // blocks under stopped blocks, but still having results, goes to limbo\n for (const blockId of activeProdGraph.traverseIdsExcludingRoots('downstream', ...stopped))\n this.resetOrLimboProduction(blockId);\n }\n\n private traverseWithStagingLag(cb: (blockId: string, lag: number) => void) {\n const lags = new Map<string, number>();\n const stagingGraph = this.getStagingGraph();\n stagingGraph.nodes.forEach((node) => {\n const info = this.getBlockInfo(node.id);\n let lag = info.stagingRendered ? 0 : 1;\n node.upstream.forEach((upstream) => {\n const upstreamLag = lags.get(upstream)!;\n if (upstreamLag === 0) return;\n lag = Math.max(upstreamLag + 1, lag);\n });\n cb(node.id, lag);\n lags.set(node.id, lag);\n });\n }\n\n /** @param stagingRenderingRate rate in blocks per second */\n private refreshStagings(stagingRenderingRate?: number) {\n const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;\n const lagThreshold\n = stagingRenderingRate === undefined\n ? undefined\n : 1 + Math.max(0, (elapsed * stagingRenderingRate) / 1000);\n let rendered = 0;\n this.traverseWithStagingLag((blockId, lag) => {\n if (lag === 0)\n // meaning staging already rendered\n return;\n if (lagThreshold === undefined || lag <= lagThreshold) {\n this.renderStagingFor(blockId);\n rendered++;\n }\n });\n if (rendered > 0) this.resetStagingRefreshTimestamp();\n }\n\n //\n // Meta\n //\n\n /** Updates project metadata */\n public setMeta(meta: ProjectMeta): void {\n this.meta = meta;\n this.metaChanged = true;\n this.updateLastModified();\n }\n\n //\n // Maintenance\n //\n\n /** @param stagingRenderingRate rate in blocks per second */\n public doRefresh(stagingRenderingRate?: number) {\n this.refreshStagings(stagingRenderingRate);\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodCtx?.status === 'Ready'\n && blockInfo.fields.prodOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n );\n if (\n blockInfo.fields.stagingCtx?.status === 'Ready'\n && blockInfo.fields.stagingOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'stagingOutputPrevious',\n 'stagingCtxPrevious',\n 'stagingUiCtxPrevious',\n );\n });\n }\n\n private assignAuthorMarkers() {\n const markerStr = this.author ? JSON.stringify(this.author) : undefined;\n\n for (const blockId of this.blocksWithChangedInputs)\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, blockArgsAuthorKey(blockId));\n else this.tx.setKValue(this.rid, blockArgsAuthorKey(blockId), markerStr);\n\n if (this.metaChanged || this.structureChanged) {\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, ProjectStructureAuthorKey);\n else this.tx.setKValue(this.rid, ProjectStructureAuthorKey, markerStr);\n }\n }\n\n public save() {\n if (!this.wasModified) return;\n\n if (this.lastModifiedChanged)\n this.tx.setKValue(this.rid, ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));\n\n if (this.structureChanged)\n this.tx.setKValue(this.rid, ProjectStructureKey, JSON.stringify(this.struct));\n\n if (this.renderingStateChanged)\n this.tx.setKValue(\n this.rid,\n BlockRenderingStateKey,\n JSON.stringify({\n ...this.renderingState,\n blocksInLimbo: [...this.blocksInLimbo],\n } as ProjectRenderingState),\n );\n\n if (this.metaChanged) this.tx.setKValue(this.rid, ProjectMetaKey, JSON.stringify(this.meta));\n\n this.assignAuthorMarkers();\n }\n\n public static async load(\n projectHelper: ProjectHelper,\n tx: PlTransaction,\n rid: ResourceId,\n author?: AuthorMarker,\n ): Promise<ProjectMutator> {\n //\n // Sending initial requests to read project state (start of round-trip #1)\n //\n\n const fullResourceStateP = tx.getResourceData(rid, true);\n const schemaP = tx.getKValueJson<string>(rid, SchemaVersionKey);\n const lastModifiedP = tx.getKValueJson<number>(rid, ProjectLastModifiedTimestamp);\n const metaP = tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey);\n const structureP = tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey);\n const renderingStateP = tx.getKValueJson<ProjectRenderingState>(rid, BlockRenderingStateKey);\n\n const fullResourceState = await fullResourceStateP;\n\n // loading field information\n const blockInfoStates = new Map<string, BlockInfoState>();\n for (const f of fullResourceState.fields) {\n const projectField = parseProjectField(f.name);\n\n // processing only fields with known structure\n if (projectField === undefined) continue;\n\n let info = blockInfoStates.get(projectField.blockId);\n if (info === undefined) {\n info = {\n id: projectField.blockId,\n fields: {},\n };\n blockInfoStates.set(projectField.blockId, info);\n }\n\n info.fields[projectField.fieldName] = isNullResourceId(f.value)\n ? { modCount: 0 }\n : { modCount: 0, ref: f.value };\n }\n\n //\n // Roundtrip #1 not yet finished, but as soon as field list is received,\n // we can start sending requests to read states of referenced resources\n // (start of round-trip #2)\n //\n\n const blockFieldRequests: [BlockInfoState, ProjectField['fieldName'], BlockFieldState, Promise<BasicResourceData | ResourceData>][] = [];\n blockInfoStates.forEach((info) => {\n const fields = info.fields;\n for (const [fName, state] of Object.entries(fields)) {\n if (state.ref === undefined) continue;\n if (!isResource(state.ref) || isResourceRef(state.ref))\n throw new Error('unexpected behaviour');\n const fieldName = fName as ProjectField['fieldName'];\n blockFieldRequests.push([\n info, fieldName,\n state, tx.getResourceData(state.ref, fieldName == 'blockPack')]);\n }\n });\n\n // loading jsons\n const [\n schema,\n lastModified,\n meta,\n structure,\n { stagingRefreshTimestamp, blocksInLimbo },\n ] = await Promise.all([\n schemaP,\n lastModifiedP,\n metaP,\n structureP,\n renderingStateP,\n ]);\n\n // Checking schema version of the project\n if (schema !== SchemaVersionCurrent) {\n if (Number(schema) < Number(SchemaVersionCurrent))\n throw new UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);\n else\n throw new UiError(`Can't perform this action on this project because it has newer schema. Upgrade your desktop app to the latest version.`);\n }\n\n //\n // <- at this point we have all the responses from round-trip #1\n //\n\n //\n // Receiving responses from round-trip #2 and sending requests to read block pack descriptions\n // (start of round-trip #3)\n //\n\n const blockPackRequests: [BlockInfoState, Promise<BasicResourceData>][] = [];\n for (const [info, fieldName, state, response] of blockFieldRequests) {\n const result = await response;\n state.value = result.data;\n if (isNotNullResourceId(result.error)) state.status = 'Error';\n else if (result.resourceReady || isNotNullResourceId(result.originalResourceId))\n state.status = 'Ready';\n else state.status = 'NotReady';\n\n // For block pack we need to traverse the ref field from the resource data\n if (fieldName === 'blockPack') {\n const refField = (result as ResourceData).fields.find((f) => f.name === Pl.HolderRefField);\n if (refField === undefined)\n throw new Error('Block pack ref field is missing');\n blockPackRequests.push([info, tx.getResourceData(ensureResourceIdNotNull(refField.value), false)]);\n }\n }\n\n //\n // <- at this point we have all the responses from round-trip #2\n //\n\n for (const [info, response] of blockPackRequests) {\n const result = await response;\n const bpInfo = cachedDeserialize<BlockPackInfo>(notEmpty(result.data));\n info.blockConfig = extractConfig(bpInfo.config);\n info.blockPack = bpInfo.source;\n }\n\n //\n // <- at this point we have all the responses from round-trip #3\n //\n\n // loading ctx export template to check if we already have cached materialized template in our project\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n\n // expected field name\n const ctxExportTplCacheFieldName = getServiceTemplateField(ctxExportTplEnvelope.hash);\n const ctxExportTplField = fullResourceState.fields.find(\n (f) => f.name === ctxExportTplCacheFieldName,\n );\n let ctxExportTplHolder: AnyResourceRef;\n if (ctxExportTplField !== undefined)\n ctxExportTplHolder = ensureResourceIdNotNull(ctxExportTplField.value);\n else {\n ctxExportTplHolder = Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec));\n tx.createField(\n field(rid, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n ctxExportTplHolder,\n );\n }\n\n const renderingState = { stagingRefreshTimestamp };\n const blocksInLimboSet = new Set(blocksInLimbo);\n\n const blockInfos = new Map<string, BlockInfo>();\n blockInfoStates.forEach(({ id, fields, blockConfig, blockPack }) => blockInfos.set(id,\n new BlockInfo(id, fields, notEmpty(blockConfig), notEmpty(blockPack))));\n\n // check consistency of project state\n const blockInStruct = new Set<string>();\n for (const b of allBlocks(structure)) {\n if (!blockInfos.has(b.id))\n throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);\n blockInStruct.add(b.id);\n }\n blockInfos.forEach((info) => {\n if (!blockInStruct.has(info.id))\n throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);\n // checking structure\n info.check();\n });\n\n const prj = new ProjectMutator(\n rid,\n tx,\n author,\n schema,\n lastModified,\n meta,\n structure,\n renderingState,\n blocksInLimboSet,\n blockInfos,\n ctxExportTplHolder,\n projectHelper,\n );\n\n prj.fixProblemsAndMigrate();\n\n return prj;\n }\n}\n\nexport interface ProjectState {\n schema: string;\n structure: ProjectStructure;\n renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>;\n blocksInLimbo: Set<string>;\n blockInfos: Map<string, BlockInfo>;\n}\n\nexport async function createProject(\n tx: PlTransaction,\n meta: ProjectMeta = InitialBlockMeta,\n): Promise<AnyResourceRef> {\n const prj = tx.createEphemeral(ProjectResourceType);\n tx.lock(prj);\n const ts = String(Date.now());\n tx.setKValue(prj, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n tx.setKValue(prj, ProjectCreatedTimestamp, ts);\n tx.setKValue(prj, ProjectLastModifiedTimestamp, ts);\n tx.setKValue(prj, ProjectMetaKey, JSON.stringify(meta));\n tx.setKValue(prj, ProjectStructureKey, JSON.stringify(InitialBlockStructure));\n tx.setKValue(prj, BlockRenderingStateKey, JSON.stringify(InitialProjectRenderingState));\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n tx.createField(\n field(prj, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec)),\n );\n return prj;\n}\n\nexport async function withProject<T>(\n projectHelper: ProjectHelper,\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n cb: (p: ProjectMutator) => T | Promise<T>,\n): Promise<T> {\n return withProjectAuthored(projectHelper, txOrPl, rid, undefined, cb);\n}\n\nexport async function withProjectAuthored<T>(\n projectHelper: ProjectHelper,\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n author: AuthorMarker | undefined,\n cb: (p: ProjectMutator) => T | Promise<T>,\n): Promise<T> {\n if (txOrPl instanceof PlClient) {\n return await txOrPl.withWriteTx('ProjectAction', async (tx) => {\n const mut = await ProjectMutator.load(projectHelper, tx, rid, author);\n const result = await cb(mut);\n if (!mut.wasModified)\n // skipping save and commit altogether if no modifications were actually made\n return result;\n mut.save();\n await tx.commit();\n if (getDebugFlags().logProjectMutationStat) console.log(JSON.stringify(tx.stat));\n return result;\n });\n } else {\n const mut = await ProjectMutator.load(projectHelper, txOrPl, rid, author);\n const result = await cb(mut);\n mut.save();\n return result;\n }\n}\n","import type { BinaryChunk, DataInfo, JsonDataInfo, PColumnSpec, PColumnValue, PColumnValues, PlRef, PObjectId, PObjectSpec } from '@platforma-sdk/model';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport {\n isNullResourceId,\n resourceType,\n resourceTypeToString,\n resourceTypesEqual,\n} from '@milaboratories/pl-client';\nimport type { Writable } from 'utility-types';\nimport { createHash } from 'node:crypto';\n\nexport function* allBlobs<B>(data: DataInfo<B>): Generator<B> {\n switch (data.type) {\n case 'Json':\n return;\n case 'JsonPartitioned':\n for (const [, blob] of Object.entries(data.parts)) yield blob;\n return;\n case 'BinaryPartitioned':\n for (const [, { index, values }] of Object.entries(data.parts)) {\n yield index;\n yield values;\n }\n return;\n default:\n assertNever(data);\n }\n}\n\nfunction mapValues<T extends object, TResult>(\n obj: T,\n callback: (v: T[keyof T], key: keyof T) => TResult,\n): { [K in keyof T]: TResult } {\n return Object.fromEntries(\n (Object.entries(obj) as { [K in keyof T]: [K, T[K]]; }[keyof T][])\n .map(([key, value]) => [key, callback(value, key)]),\n ) as { [K in keyof T]: TResult };\n}\n\nexport function mapBlobs<B1, B2>(\n data: DataInfo<B1>,\n mapping: (blob: B1) => B2,\n): DataInfo<B2> {\n switch (data.type) {\n case 'Json':\n return { ...data };\n case 'JsonPartitioned':\n return { ...data, parts: mapValues(data.parts, mapping) };\n case 'BinaryPartitioned':\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: mapping(v.index),\n values: mapping(v.values),\n })),\n };\n default:\n assertNever(data);\n }\n}\n\nexport const PColumnDataJsonPartitioned = resourceType('PColumnData/JsonPartitioned', '1');\nexport const PColumnDataJsonSuperPartitioned = resourceType(\n 'PColumnData/Partitioned/JsonPartitioned',\n '1',\n);\nexport const PColumnDataBinaryPartitioned = resourceType('PColumnData/BinaryPartitioned', '1');\nexport const PColumnDataBinarySuperPartitioned = resourceType(\n 'PColumnData/Partitioned/BinaryPartitioned',\n '1',\n);\nexport const PColumnDataJson = resourceType('PColumnData/Json', '1');\n\nexport type PColumnDataJsonResourceValue = {\n keyLength: number;\n data: Record<string, PColumnValue>;\n};\n\nexport type PColumnDataPartitionedResourceValue = {\n partitionKeyLength: number;\n};\n\nexport type PColumnDataSuperPartitionedResourceValue = {\n superPartitionKeyLength: number;\n partitionKeyLength: number;\n};\n\nexport function parseDataInfoResource(\n data: PlTreeNodeAccessor,\n): DataInfo<ResourceInfo> {\n if (!data.getIsReadyOrError()) throw new Error('Data not ready.');\n\n const resourceData = data.getDataAsJson();\n if (resourceData === undefined)\n throw new Error('unexpected data info structure, no resource data');\n\n if (resourceTypesEqual(data.resourceType, PColumnDataJson)) {\n const dataContent = resourceData as PColumnDataJsonResourceValue;\n\n return {\n type: 'Json',\n keyLength: dataContent.keyLength,\n data: dataContent.data,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts = Object.fromEntries(\n data\n .listInputFields()\n .map((field) => [field, data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo]),\n );\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonSuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<string, ResourceInfo> = {};\n for (const superKey of data.listInputFields()) {\n const superPart = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superPart.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const key of keys) {\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PColumnValue[],\n ...JSON.parse(key) as PColumnValue[]]);\n parts[partKey] = superPart.traverse({ field: key, errorIfFieldNotSet: true }).resourceInfo;\n }\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinaryPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<BinaryChunk<ResourceInfo>>>\n > = {};\n\n // parsing the structure\n for (const field of data.listInputFields()) {\n if (field.endsWith('.index')) {\n const partKey = field.slice(0, field.length - 6);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.index = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const partKey = field.slice(0, field.length - 7);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.values = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n\n // structure validation\n for (const [key, part] of Object.entries(parts)) {\n if (part.index === undefined) throw new Error(`no index for part ${key}`);\n if (part.values === undefined) throw new Error(`no values for part ${key}`);\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts: parts as Record<string, BinaryChunk<ResourceInfo>>,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinarySuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<BinaryChunk<ResourceInfo>>>\n > = {};\n for (const superKey of data.listInputFields()) {\n const superData = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superData.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const field of keys) {\n if (field.endsWith('.index')) {\n const key = field.slice(0, field.length - 6);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PColumnValue[],\n ...JSON.parse(key) as PColumnValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].index = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const key = field.slice(0, field.length - 7);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PColumnValue[],\n ...JSON.parse(key) as PColumnValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].values = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts: parts as Record<string, BinaryChunk<ResourceInfo>>,\n };\n }\n\n throw new Error(`unsupported resource type: ${resourceTypeToString(data.resourceType)}`);\n}\n\nexport function makeDataInfoFromPColumnValues(\n spec: PColumnSpec,\n data: PColumnValues,\n): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength)\n throw new Error(`inline column key length ${key.length} differs from axes count ${keyLength}`);\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: 'Json',\n keyLength,\n data: jsonData,\n };\n}\n\nexport function deriveLegacyPObjectId(spec: PObjectSpec, data: PlTreeNodeAccessor): PObjectId {\n const hash = createHash('sha256');\n hash.update(canonicalize(spec)!);\n hash.update(String(!isNullResourceId(data.originalId) ? data.originalId : data.id));\n return hash.digest().toString('hex') as PObjectId;\n}\n\nexport function deriveGlobalPObjectId(blockId: string, exportName: string): PObjectId {\n return canonicalize({ __isRef: true, blockId, name: exportName } satisfies PlRef)! as PObjectId;\n}\n\nexport function deriveLocalPObjectId(resolvePath: string[], outputName: string): PObjectId {\n return canonicalize({ resolvePath, name: outputName })! as PObjectId;\n}\n","import { type PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type { PObject, PObjectSpec, ValueOrError } from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport assert from 'node:assert';\nimport type { Writable } from 'utility-types';\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from './data';\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n}\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = '',\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as 'spec' | 'data';\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case 'spec':\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors,\n })\n ?.getDataAsJson();\n break;\n case 'data':\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n });\n break;\n default:\n // other value types planned\n break;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = '',\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error('resource is not ready');\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw data.error;\n collection[outputName] = {\n id: resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value,\n };\n }\n return collection;\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError } from '@platforma-sdk/model';\nimport {\n executePSpecPredicate,\n mapValueInVOE,\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { outputRef } from '../model/args';\nimport type {\n Block,\n ProjectStructure } from '../model/project_model';\nimport {\n ProjectStructureKey,\n projectFieldName,\n} from '../model/project_model';\nimport { allBlocks, stagingGraph } from '../model/project_model_util';\nimport type { Optional } from 'utility-types';\nimport { deriveGlobalPObjectId } from './data';\nimport type {\n RawPObjectCollection,\n RawPObjectEntry } from './p_object_collection';\nimport {\n parseRawPObjectCollection,\n} from './p_object_collection';\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, 'blockId' | 'name'>;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>,\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n if (block.staging === undefined) this.ctx.markUnstable(`staging_not_rendered:${blockId}`);\n else if (!block.staging.locked) this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string,\n ): ValueOrError<PObject<PlTreeNodeAccessor>, Error> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n const result = block.prod?.results?.get(exportName);\n const data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result.spec!,\n data: value,\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string,\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value,\n },\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker,\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, 'id'>\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, 'id'>\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data,\n },\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n exportsProcessed.add(exportName);\n }\n } else markUnstable(`staging_not_rendered:${blockId}`); // because staging will be inevitably rendered soon\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + ' / ' + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec,\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds('upstream', rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'prodCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'prodUiCtx'),\n stableIfNotFound: true,\n }),\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'stagingCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'stagingUiCtx'),\n }),\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, Error> | undefined,\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { cachedDecode, notEmpty } from '@milaboratories/ts-helpers';\nimport type { Optional } from 'utility-types';\nimport type {\n Block,\n ProjectStructure } from '../model/project_model';\nimport {\n ProjectStructureKey,\n projectFieldName,\n} from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { ResultPool } from '../pool/result_pool';\n\nexport type BlockContextMaterialized = {\n readonly blockId: string;\n readonly args: string;\n readonly uiState?: string;\n};\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly uiState: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n};\n\nexport type BlockContextAny = Optional<BlockContextFull, 'prod' | 'staging' | 'getResultsPool'>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) =>\n cachedDecode(notEmpty(\n cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'currentArgs'),\n errorIfFieldNotSet: true,\n })\n .getData(),\n ));\n const activeArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'prodArgs'),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const uiState = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'uiState'),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n return {\n blockId,\n args,\n activeArgs,\n uiState,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n },\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'prodOutput'),\n stableIfNotFound: true,\n ignoreError: true,\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'stagingOutput'),\n ignoreError: true,\n })\n ?.persist();\n if (result === undefined) cCtx.markUnstable('staging_not_rendered');\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId),\n };\n}\n","import type { Cfg } from '@platforma-sdk/model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function* traverseCfg(cfg: Cfg, guide?: (cfg: Cfg) => boolean): Generator<Cfg> {\n yield cfg;\n if (guide !== undefined && !guide(cfg)) return;\n switch (cfg.type) {\n case 'GetFromCtx':\n case 'Immediate':\n return;\n case 'Isolate':\n yield * traverseCfg(cfg.cfg);\n return;\n case 'MakeObject':\n for (const [, child] of Object.entries(cfg.template)) yield * traverseCfg(child);\n return;\n case 'MakeArray':\n for (const child of cfg.template) yield * traverseCfg(child);\n return;\n case 'GetJsonField':\n case 'GetResourceField':\n yield * traverseCfg(cfg.source);\n yield * traverseCfg(cfg.field);\n return;\n case 'MapRecordValues':\n case 'MapArrayValues':\n case 'MapResourceFields':\n yield * traverseCfg(cfg.source);\n yield * traverseCfg(cfg.mapping);\n return;\n case 'Flatten':\n case 'GetResourceValueAsJson':\n case 'GetBlobContent':\n case 'ExtractArchiveAndGetURL':\n case 'GetBlobContentAsString':\n case 'GetBlobContentAsJson':\n case 'GetDownloadedBlobContent':\n case 'GetOnDemandBlobContent':\n case 'GetImportProgress':\n case 'GetLastLogs':\n case 'GetProgressLog':\n case 'GetProgressLogWithInfo':\n case 'GetLogHandle':\n yield * traverseCfg(cfg.source);\n return;\n case 'IsEmpty':\n yield * traverseCfg(cfg.arg);\n return;\n case 'Not':\n yield * traverseCfg(cfg.operand);\n return;\n case 'And':\n case 'Or':\n yield * traverseCfg(cfg.operand1);\n yield * traverseCfg(cfg.operand2);\n return;\n default:\n assertNever(cfg);\n }\n}\n","import type { Cfg } from '@platforma-sdk/model';\nimport { traverseCfg } from './traverse';\n\nexport function mapRecord<T1, T2, Key extends string>(\n obj: Record<Key, T1>,\n mapper: (value: T1) => T2,\n): Record<Key, T2> {\n const result = {} as Record<Key, T2>;\n for (const [key, value] of Object.entries(obj)) result[key as Key] = mapper(value as T1);\n return result;\n}\n\nexport function ifNotUndef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\nfunction isActiveCfg(cfg: Cfg): boolean {\n switch (cfg.type) {\n case 'GetImportProgress':\n return true;\n default:\n return false;\n }\n}\n\nexport function hasActiveCfgComponents(cfg: Cfg): boolean {\n for (const nested of traverseCfg(cfg)) if (isActiveCfg(nested)) return true;\n return false;\n}\n","import type {\n ArchiveFormat,\n Cfg,\n CfgMapArrayValues,\n CfgMapRecordValues,\n CfgMapResourceFields,\n RangeBytes,\n} from '@platforma-sdk/model';\nimport type { ArgumentRequests, Operation, OperationAction, Subroutine } from './operation';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { mapRecord } from './util';\nimport { computableFromCfgUnsafe } from './executor';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport type { ComputableCtx } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\n\nfunction res(result: unknown): OperationAction {\n return {\n type: 'ReturnResult',\n result: result,\n };\n}\n\nexport function resOp(result: unknown): Operation {\n return () => res(result);\n}\n\n//\n// Subroutines\n//\n\nconst SRMakeObject: Subroutine = (args) => {\n const result: Record<string | symbol, unknown> = {};\n for (const [k, v] of Object.entries(args)) result[k] = v;\n return resOp(result);\n};\n\nconst SRFlatten: Subroutine = (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n const result: unknown[] = [];\n for (const nested of source) {\n if (nested instanceof Array) result.push(...(nested as unknown[]));\n else result.push(nested);\n }\n return resOp(result);\n};\n\nconst SRGetResourceField: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return ({ cCtx }) => {\n return res(cCtx.accessor(source).node().traverse(field)?.persist());\n };\n};\n\nfunction mapArrayToRecord<T, R>(elements: T[], cb: (e: T) => R): Record<string, R> {\n const result: Record<string, R> = {};\n const length = elements.length;\n for (let i = 0; i < length; i++) result[String(i)] = cb(elements[i]);\n return result;\n}\n\nfunction SRMapArrayValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapArrayValues, 'itVar' | 'mapping'>,\n): Subroutine {\n return (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(source.length),\n args: mapArrayToRecord(source, (e) => renderCfg({ ...ctx, [ops.itVar]: e }, ops.mapping)),\n });\n };\n}\n\nfunction SRCollectArrayFromArgs(length: number): Subroutine {\n return (args) => {\n const result: unknown[] = [];\n for (let i = 0; i < length; i++) result.push(args[String(i)]);\n return resOp(result);\n };\n}\n\nfunction SRMapRecordValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapRecordValues, 'itVar' | 'mapping'>,\n): Subroutine {\n return (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n if (source === undefined) return resOp(undefined);\n const nextArgs: ArgumentRequests = {};\n for (const [k, v] of Object.entries(source)) {\n const newCtx = { ...ctx, [ops.itVar]: v };\n nextArgs[k] = renderCfg(newCtx, ops.mapping);\n }\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues2,\n args: nextArgs,\n });\n };\n}\n\nconst SRMapRecordValues2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRIsEmpty: Subroutine = (args) => {\n const arg = args.arg as unknown[] | string | undefined;\n if (arg === undefined) return resOp(undefined);\n return resOp(arg.length === 0);\n};\n\nconst SRNot: Subroutine = (args) => {\n const operand = args.operand as boolean | undefined;\n if (operand === undefined) return resOp(undefined);\n return resOp(!operand);\n};\n\nconst SRAnd: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 && operand2);\n};\n\nconst SROr: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 || operand2);\n};\n\nconst SRResourceValueAsJson: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n return ({ cCtx }) => res(cCtx.accessor(source).node()?.getDataAsJson());\n};\n\nconst SRGetJsonField: Subroutine = (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return resOp(source[field]);\n};\n\nfunction SRMapResourceFields1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapResourceFields, 'itVar' | 'mapping'>,\n): Subroutine {\n return (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx }) => {\n const node = cCtx.accessor(source).node();\n\n const nextArgs: ArgumentRequests = {};\n for (const fieldName of node.listInputFields()) {\n const res = node.traverse(fieldName);\n if (res === undefined) nextArgs[fieldName] = resOp(undefined);\n else {\n const newCtx = { ...ctx, [ops.itVar]: res.persist() };\n nextArgs[fieldName] = renderCfg(newCtx, ops.mapping);\n }\n }\n\n return {\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields2,\n args: nextArgs,\n };\n };\n };\n}\n\nconst SRMapResourceFields2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRGetBlobContent: (range?: RangeBytes) => Subroutine = (range) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (ctx) => {\n return drivers.blobDriver.getDownloadedBlob(ctx.accessor(source).node().resourceInfo);\n },\n {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return await drivers.blobDriver.getContent(value.handle, range);\n },\n },\n ),\n };\n };\n};\n\nconst SRGetBlobContentAsString: (range?: RangeBytes) => Subroutine = (range) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx, drivers }) => {\n // getting target resource id and type\n const resourceInfo = cCtx.accessor(source).node().resourceInfo;\n\n return {\n type: 'ScheduleComputable',\n computable: Computable.make((ctx) => drivers.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle, range);\n return content.toString();\n },\n }),\n };\n };\n};\n\nconst SRGetBlobContentAsJson: (range?: RangeBytes) => Subroutine = (range) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (c) => drivers.blobDriver.getDownloadedBlob(c.accessor(source).node().resourceInfo, c),\n {\n postprocessValue: async (value) => {\n if (value == undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle, range);\n if (content == undefined) return undefined;\n return JSON.parse(Buffer.from(content).toString()) as unknown;\n },\n },\n ),\n };\n };\n};\n\nconst SRGetDownloadedBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return (ctx) => {\n return {\n type: 'ScheduleComputable',\n computable: ctx.drivers.blobDriver.getDownloadedBlob(source),\n };\n };\n};\n\nconst SRGetOnDemandBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobDriver.getOnDemandBlob(source),\n };\n };\n};\n\nconst SRExtractArchiveAndGetURL: (format: ArchiveFormat) => Subroutine = (format) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobToURLDriver.extractArchiveAndGetURL(source, format),\n };\n };\n};\n\nconst SRGetImportProgress: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.uploadDriver.getProgressId(source),\n };\n };\n};\n\nconst SRGetLastLogs: (lines: number) => Subroutine = (lines) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLastLogs(source, lines),\n };\n };\n};\n\nconst SRGetProgressLog: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLog(source, patternToSearch),\n };\n };\n};\n\nconst SRGetProgressLogWithInfo: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLogWithInfo(source, patternToSearch),\n };\n };\n};\n\nconst SRGetLogHandle: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLogHandle(source),\n };\n };\n};\n\n/** Renders configuration into executor's Operation */\nexport function renderCfg(ctx: Record<string, unknown>, cfg: Cfg): Operation {\n switch (cfg.type) {\n case 'GetFromCtx':\n {\n const ctxValue = ctx[cfg.variable];\n if (typeof ctxValue === 'function') {\n return (e) => res((ctxValue as (cCtx: ComputableCtx) => OperationAction)(e.cCtx));\n } else {\n return resOp(ctxValue);\n }\n }\n\n case 'Isolate':\n return ({ drivers }) => ({\n type: 'ScheduleComputable',\n computable: computableFromCfgUnsafe(drivers, ctx, cfg.cfg),\n });\n\n case 'Immediate':\n return resOp(cfg.value);\n\n case 'GetJsonField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetJsonField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field),\n },\n });\n\n case 'MapArrayValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapArrayValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'MapRecordValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'MakeObject':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMakeObject,\n args: mapRecord(cfg.template, (c) => renderCfg(ctx, c)),\n });\n\n case 'MakeArray':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(cfg.template.length),\n args: mapArrayToRecord(cfg.template, (e) => renderCfg(ctx, e)),\n });\n\n case 'Flatten':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRFlatten,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'IsEmpty':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRIsEmpty,\n args: {\n arg: renderCfg(ctx, cfg.arg),\n },\n });\n\n case 'Not':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRNot,\n args: {\n operand: renderCfg(ctx, cfg.operand),\n },\n });\n\n case 'And':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRAnd,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2),\n },\n });\n\n case 'Or':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SROr,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2),\n },\n });\n\n case 'MapResourceFields':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetResourceField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetResourceField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field),\n },\n });\n\n case 'GetResourceValueAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRResourceValueAsJson,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContent(cfg.range),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetBlobContentAsString':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsString(cfg.range),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetBlobContentAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsJson(cfg.range),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetDownloadedBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetDownloadedBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetOnDemandBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetOnDemandBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'ExtractArchiveAndGetURL':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRExtractArchiveAndGetURL(cfg.format),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetImportProgress':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetImportProgress,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetLastLogs':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLastLogs(cfg.lines),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetProgressLog':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLog(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetProgressLogWithInfo':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLogWithInfo(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetLogHandle':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLogHandle,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n default:\n return assertNever(cfg);\n }\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type { PlResourceEntry, StdCtx } from '@platforma-sdk/model';\nimport type { BlockContextAny } from './block_ctx';\n\ntype SC = StdCtx<unknown, unknown>;\ntype SCAO = Pick<SC, '$blockId' | '$ui' | '$args'>;\nexport type MatStdCtxArgsOnly = {\n [Var in keyof SCAO]: SCAO[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SCAO[Var];\n};\nexport type MatStdCtx = {\n [Var in keyof SC]: SC[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SC[Var];\n};\n\nexport const NonKeyCtxFields = ['$prod', '$staging'];\n\nexport function toCfgContext(ctx: BlockContextAny): MatStdCtx {\n return {\n $blockId: ctx.blockId,\n $args: (cCtx: ComputableCtx) => JSON.parse(ctx.args(cCtx)) as unknown,\n $ui: (cCtx: ComputableCtx) => {\n const uiState = ctx.uiState(cCtx);\n return uiState !== undefined ? JSON.parse(uiState) as unknown : undefined;\n },\n $prod: ctx.prod,\n $staging: ctx.staging,\n };\n}\n","import type {\n ArgumentKey,\n ArgumentValues,\n ExecutionEnvironment,\n Operation,\n Subroutine,\n} from './operation';\nimport Denque from 'denque';\nimport { assertNever, notEmpty } from '@milaboratories/ts-helpers';\nimport type { ComputableCtx, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { Cfg } from '@platforma-sdk/model';\nimport { renderCfg, resOp } from './renderer';\nimport canonicalize from 'canonicalize';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerDriverKit } from '../middle_layer/driver_kit';\nimport { NonKeyCtxFields, toCfgContext } from '../middle_layer/block_ctx_unsafe';\n\n/** Addresses pending subroutines inside the stack */\ntype SubroutineKey = symbol;\n\n/** Represents destination of the result of an operation. I.e. when sequence of\n * subroutine invocations, and computables terminates with result, this object\n * determines to which argument of which pending subroutine it should be delivered.\n * See special value for delivery of the final \"return\" result. */\ntype Destination = {\n op: SubroutineKey;\n arg: ArgumentKey;\n};\n\n/** Special address of operation, see below. */\nconst ReturnOpKey: unique symbol = Symbol();\n/** The same, but for the argument part of destination, see below. */\nconst ReturnArgKey = 'return';\n\n/** Special destination, telling the executor that corresponding result should\n * be exposed as a final result, and execution terminate at this point. */\nconst ReturnDestination = { op: ReturnOpKey, arg: ReturnArgKey } as Destination;\n\nfunction isReturnDestination(destination: Destination): boolean {\n return destination.op == ReturnOpKey && destination.arg == ReturnArgKey;\n}\n\n/** Queued operation, used inside the executor */\ntype QueuedOperation = {\n operation: Operation;\n destination: Destination;\n};\n\n/** Queued computation, returned by the first round of config execution. Such\n * computables should be returned in the intermediate representation of the\n * enclosing computable, and after they are resolved and passed to the\n * postprocessing routine, should be injected into the execution stack to\n * finalize the computation. */\ntype ScheduledComputable = {\n destination: Destination;\n computable: Computable<unknown>;\n};\n\n/** This is what ScheduledComputable transforms from intermediate\n * representation to post-processing. */\ntype MaterializedComputable = {\n destination: Destination;\n computable: unknown;\n};\n\n/** Main entry inside the execution stack. */\ntype PendingSubroutine = {\n subroutine: Subroutine;\n destination: Destination;\n argCounter: number;\n args: ArgumentValues;\n};\n\n/** Execution stack. The closest concept that this object along with enclosed\n * {@link PendingSubroutine}s represent is a Continuation.\n * https://en.wikipedia.org/wiki/Continuation */\ntype ExecutionStack = {\n result?: unknown;\n pendingSubroutines: Map<SubroutineKey, PendingSubroutine>;\n};\n\n/** Returns initial stack value. */\nfunction zeroStack(): ExecutionStack {\n return { pendingSubroutines: new Map<SubroutineKey, PendingSubroutine>() };\n}\n\n/** Implements main executor mechanism.\n * @param env to be passed to while executing operations\n * @param stack execution stack to continue execution from\n * @param operations operations to initiate the execution process\n * @param allowComputables if false, scheduling of async computables will result in error\n * */\nfunction execute(\n env: ExecutionEnvironment,\n stack: ExecutionStack,\n operations: QueuedOperation[],\n allowComputables: boolean,\n): ScheduledComputable[] {\n const operationQueue = new Denque<QueuedOperation>(operations);\n\n /** Returns false if final result is set as result of this operation,\n * true if we should continue processing. */\n const deliverResult = (destination: Destination, result: unknown): boolean => {\n if (isReturnDestination(destination)) {\n stack.result = result;\n return false;\n }\n\n const pending = notEmpty(stack.pendingSubroutines.get(destination.op));\n if (destination.arg in pending.args) throw new Error('argument already set');\n pending.args[destination.arg] = result;\n pending.argCounter--;\n if (pending.argCounter === 0) {\n stack.pendingSubroutines.delete(destination.op);\n operationQueue.push({\n destination: pending.destination,\n operation: pending.subroutine(pending.args),\n });\n }\n\n return true;\n };\n\n // computables, scheduled during computation, are aggregated in this array,\n // and returned from the function in the end\n const computables: ScheduledComputable[] = [];\n\n // each loop = execution of a single queued operation\n mainLoop: while (operationQueue.length > 0) {\n const op = operationQueue.shift()!;\n const action = op.operation(env);\n switch (action.type) {\n case 'ReturnResult':\n if (!deliverResult(op.destination, action.result)) break mainLoop; // this terminates execution\n break; // switch\n\n case 'ScheduleSubroutine':\n {\n const newOpKey = Symbol();\n\n const argRequests = Object.entries(action.args);\n const initialArgCounter = argRequests.length;\n\n if (initialArgCounter === 0)\n // if no pending arguments\n operationQueue.push({\n destination: op.destination,\n operation: action.subroutine({}),\n });\n else {\n for (const [arg, operation] of argRequests)\n operationQueue.push({\n destination: { op: newOpKey, arg },\n operation,\n });\n\n stack.pendingSubroutines.set(newOpKey, {\n argCounter: initialArgCounter,\n args: {},\n subroutine: action.subroutine,\n destination: op.destination,\n });\n }\n }\n break;\n\n case 'ScheduleComputable':\n if (!allowComputables)\n throw new Error('asynchronous operations are forbidden in this context');\n computables.push({\n destination: op.destination,\n computable: action.computable,\n });\n break;\n\n default:\n assertNever(action);\n }\n }\n\n return computables;\n}\n\n//\n// Computable\n//\n\n/** Main method to render configurations */\nexport function computableFromCfg(\n drivers: MiddleLayerDriverKit,\n bCtx: BlockContextAny,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n return computableFromCfgUnsafe(drivers, toCfgContext(bCtx), cfg, ops);\n}\n\nexport function computableFromCfgUnsafe(\n drivers: MiddleLayerDriverKit,\n ctx: Record<string, unknown>,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n const key\n = `${ctx.blockId}#`\n + canonicalize({\n ctx: Object.fromEntries(\n Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1),\n ),\n cfg: cfg,\n })!;\n return Computable.makeRaw(\n (c) => {\n const env: ExecutionEnvironment = { drivers, cCtx: c };\n const stack = zeroStack();\n const computables = execute(\n env,\n stack,\n [\n {\n destination: ReturnDestination,\n operation: renderCfg(ctx, cfg),\n },\n ],\n true,\n );\n return {\n ir: computables,\n postprocessValue(value: MaterializedComputable[]): unknown {\n const resolvedOps: QueuedOperation[] = [];\n for (const mc of value)\n resolvedOps.push({ destination: mc.destination, operation: resOp(mc.computable) });\n const postEnv: ExecutionEnvironment = {\n drivers,\n get cCtx(): ComputableCtx {\n throw new Error('asynchronous operations are forbidden in this context');\n },\n };\n\n // Post process can be called several times, that's why it must be a side-effect-free function.\n // But `execute` modifies a stack, so we have to defensively copy it here.\n const copyOfPendingSubrotines = new Map<SubroutineKey, PendingSubroutine>();\n for (const [key, value] of stack.pendingSubroutines)\n copyOfPendingSubrotines.set(key, { ...value, args: { ...value.args } });\n const copiedStack: ExecutionStack = {\n result: stack.result,\n pendingSubroutines: copyOfPendingSubrotines,\n };\n execute(postEnv, copiedStack, resolvedOps, false);\n if (!('result' in copiedStack))\n throw new Error('illegal cfg rendering stack state, no result');\n return copiedStack.result;\n },\n };\n },\n { ...ops, key },\n );\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport {\n checkBlockFlag,\n} from '@platforma-sdk/model';\nimport type {\n ArchiveFormat,\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n DataInfo,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError,\n RangeBytes,\n BlockCodeKnownFeatureFlags,\n\n JsRenderInternal } from '@platforma-sdk/model';\nimport {\n isDataInfo,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE,\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport type { Optional } from 'utility-types';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport type { Block } from '../model/project_model';\nimport { parseFinalPObjectCollection } from '../pool/p_object_collection';\nimport type { ResultPool } from '../pool/result_pool';\nimport type { JsExecutionContext } from './context';\nimport type { VmFunctionImplementation } from 'quickjs-emscripten';\nimport { Scope, type QuickJSHandle } from 'quickjs-emscripten';\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString('base64') : undefined;\n}\n\nexport class ComputableContextHelper\nimplements JsRenderInternal.GlobalCfgRenderCtxMethods<string, string> {\n public readonly computablesToResolve: Record<string, Computable<unknown>> = {};\n\n private computableCtx: ComputableCtx | undefined;\n private readonly accessors = new Map<string, PlTreeNodeAccessor | undefined>();\n\n private readonly meta: Map<string, Block>;\n\n constructor(\n private readonly parent: JsExecutionContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n private readonly featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableCtx: ComputableCtx,\n ) {\n this.computableCtx = computableCtx;\n this.meta = blockCtx.blockMeta(computableCtx);\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\n }\n\n //\n // Methods for injected ctx object\n //\n\n getAccessorHandleByName(name: string): string | undefined {\n if (this.computableCtx === undefined)\n throw new Error('Accessors can\\'t be used in this context');\n const wellKnownAccessor = (name: string, ctxKey: 'staging' | 'prod'): string | undefined => {\n if (!this.accessors.has(name)) {\n const lambda = this.blockCtx[ctxKey];\n if (lambda === undefined) throw new Error('Staging context not available');\n const entry = lambda(this.computableCtx!);\n if (!entry) this.accessors.set(name, undefined);\n else\n this.accessors.set(name, this.computableCtx!.accessor(entry).node({ ignoreError: true }));\n }\n return this.accessors.get(name) ? name : undefined;\n };\n if (name === 'staging') return wellKnownAccessor('staging', 'staging');\n else if (name === 'main') return wellKnownAccessor('main', 'prod');\n return undefined;\n }\n\n //\n // Accessors\n //\n\n resolveWithCommon(\n handle: string,\n commonOptions: CommonFieldTraverseOpsFromSDK,\n ...steps: (FieldTraversalStepFromSDK | string)[]\n ): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).traverseWithCommon(commonOptions, ...steps));\n }\n\n getResourceType(handle: string): ResourceTypeFromSDK {\n return this.getAccessor(handle).resourceType;\n }\n\n getInputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getInputsLocked();\n }\n\n getOutputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getOutputsLocked();\n }\n\n getIsReadyOrError(handle: string): boolean {\n return this.getAccessor(handle).getIsReadyOrError();\n }\n\n getIsFinal(handle: string): boolean {\n return this.getAccessor(handle).getIsFinal();\n }\n\n getError(handle: string): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).getError());\n }\n\n listInputFields(handle: string): string[] {\n return this.getAccessor(handle).listInputFields();\n }\n\n listOutputFields(handle: string): string[] {\n return this.getAccessor(handle).listOutputFields();\n }\n\n listDynamicFields(handle: string): string[] {\n return this.getAccessor(handle).listDynamicFields();\n }\n\n getKeyValueBase64(handle: string, key: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getKeyValue(key));\n }\n\n getKeyValueAsString(handle: string, key: string): string | undefined {\n return this.getAccessor(handle).getKeyValueAsString(key);\n }\n\n getDataBase64(handle: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getData());\n }\n\n getDataAsString(handle: string): string | undefined {\n return this.getAccessor(handle).getDataAsString();\n }\n\n //\n // Accessor helpers\n //\n\n parsePObjectCollection(\n handle: string,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolveSteps: string[]\n ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix, resolveSteps);\n const result: Record<string, PObject<string>> = {};\n for (const [key, obj] of Object.entries(accResult)) {\n result[key] = mapPObjectData(obj, (d) => this.wrapAccessor(d));\n }\n return result;\n }\n\n //\n // Blobs\n //\n\n private registerComputable(hPrefix: string, computable: Computable<unknown>): string {\n const fHandle = `${hPrefix}_${randomUUID()}`;\n this.computablesToResolve[fHandle] = computable;\n return fHandle;\n }\n\n public getBlobContentAsString(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsString',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle, range)).toString(\n 'utf-8',\n );\n },\n }),\n );\n }\n\n public getBlobContentAsBase64(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsBase64',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle, range)).toString(\n 'base64',\n );\n },\n }),\n );\n }\n\n public getDownloadedBlobContentHandle(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getDownloadedBlobContentHandle',\n this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo),\n );\n }\n\n public getOnDemandBlobContentHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getOnDemandBlobContentHandle',\n this.env.driverKit.blobDriver.getOnDemandBlob(resource),\n );\n }\n\n //\n // Blobs to URLs\n //\n\n public extractArchiveAndGetURL(handle: string, format: ArchiveFormat): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'extractArchiveAndGetURL',\n this.env.driverKit.blobToURLDriver.extractArchiveAndGetURL(resource, format),\n );\n }\n\n //\n // Import progress\n //\n\n getImportProgress(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getImportProgress',\n this.env.driverKit.uploadDriver.getProgressId(resource),\n );\n }\n\n //\n // Logs\n //\n\n getLastLogs(handle: string, nLines: number): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLastLogs',\n this.env.driverKit.logDriver.getLastLogs(resource, nLines),\n );\n }\n\n getProgressLog(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLog',\n this.env.driverKit.logDriver.getProgressLog(resource, patternToSearch),\n );\n }\n\n getProgressLogWithInfo(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLogWithInfo',\n this.env.driverKit.logDriver.getProgressLogWithInfo(resource, patternToSearch),\n );\n }\n\n getLogHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLogHandle',\n this.env.driverKit.logDriver.getLogHandle(resource),\n );\n }\n\n //\n // Blocks\n //\n\n public getBlockLabel(blockId: string): string {\n const b = this.meta.get(blockId);\n if (b === undefined) throw new Error(`Block ${blockId} not found.`);\n return b.label;\n }\n\n //\n // Result Pool\n //\n\n private _resultPool: ResultPool | undefined = undefined;\n private get resultPool(): ResultPool {\n if (this._resultPool === undefined) {\n if (this.computableCtx === undefined)\n throw new Error(\n 'can\\'t use result pool in this context (most porbably called from the future mapper)',\n );\n this._resultPool = notEmpty(\n this.blockCtx.getResultsPool,\n 'getResultsPool',\n )(this.computableCtx);\n }\n return this._resultPool;\n }\n\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.resultPool.calculateOptions(predicate);\n }\n\n public getDataFromResultPool(): ResultCollection<PObject<string>> {\n const collection = this.resultPool.getData();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: mapPObjectData(e.obj, (d) => this.wrapAccessor(d)),\n })),\n };\n }\n\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<string, Error>>, 'id'>\n > {\n const collection = this.resultPool.getDataWithErrors();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: {\n id: e.obj.id,\n spec: e.obj.spec,\n data: mapValueInVOE(e.obj.data, (d) => this.wrapAccessor(d)),\n },\n })),\n };\n }\n\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n const specs = this.resultPool.getSpecs();\n if (specs.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`specs_from_pool_incomplete:${specs.instabilityMarker}`);\n return specs;\n }\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n return this.resultPool.getSpecByRef(blockId, exportName);\n }\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<string> | undefined {\n return mapPObjectData(this.resultPool.getDataByRef(blockId, exportName), (acc) =>\n this.wrapAccessor(acc),\n );\n }\n\n //\n // PFrames / PTables\n //\n\n public createPFrame(def: PFrameDef<string | PColumnValues | DataInfo<string>>): PFrameHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n 'can\\'t instantiate PFrames from this context (most porbably called from the future mapper)',\n );\n return this.env.driverKit.pFrameDriver.createPFrame(\n def.map((c) => mapPObjectData(c, (d) => this.transformInputPData(d))),\n this.computableCtx,\n );\n }\n\n public createPTable(def: PTableDef<PColumn<string | PColumnValues | DataInfo<string>>>): PTableHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n 'can\\'t instantiate PTable from this context (most porbably called from the future mapper)',\n );\n return this.env.driverKit.pFrameDriver.createPTable(\n mapPTableDef(def, (c) =>\n mapPObjectData(c, (d) => this.transformInputPData(d)),\n ),\n this.computableCtx,\n );\n }\n\n /**\n * Transforms input data for PFrame/PTable creation\n * - Converts string handles to accessors\n * - Maps accessors in DataInfo objects\n * - Passes through other values\n */\n private transformInputPData(d: string | PColumnValues | DataInfo<string>): PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor> {\n if (typeof d === 'string') {\n return this.getAccessor(d);\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (a) => this.getAccessor(a));\n } else {\n return d;\n }\n }\n\n //\n // Computable\n //\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.computableCtx?.unstableMarker;\n }\n\n //\n // Logging\n //\n\n public logInfo(message: string): void {\n this.env.blockEventDispatcher.logInfo(this.blockCtx.blockId, message);\n }\n\n public logWarn(message: string): void {\n this.env.blockEventDispatcher.logWarn(this.blockCtx.blockId, message);\n }\n\n public logError(message: string): void {\n this.env.blockEventDispatcher.logError(this.blockCtx.blockId, message);\n }\n\n //\n // Helpers\n //\n\n private getAccessor(handle: string): PlTreeNodeAccessor {\n const accessor = this.accessors.get(handle);\n if (accessor === undefined) throw new Error('No such accessor');\n return accessor;\n }\n\n private wrapAccessor(accessor: PlTreeNodeAccessor): string;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined {\n if (accessor === undefined) return undefined;\n else {\n const nextHandle = randomUUID();\n this.accessors.set(nextHandle, accessor);\n return nextHandle;\n }\n }\n\n public injectCtx(configCtx: QuickJSHandle): void {\n const parent = this.parent;\n const vm = parent.vm;\n\n Scope.withScope((localScope) => {\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>,\n ): void => {\n const withCachedError: VmFunctionImplementation<QuickJSHandle> = (...args) => {\n // QuickJS strips all fields from errors apart from 'name' and 'message'.\n // That's why here we need to store them, and rethrow them when we exit\n // from QuickJS code.\n try {\n return (fn as any)(...args);\n } catch (e: unknown) {\n const newErr = parent.errorRepo.setAndRecreateForQuickJS(e);\n\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw vm.newError(newErr);\n }\n };\n\n vm.newFunction(name, withCachedError).consume((fnh) => vm.setProp(configCtx, name, fnh));\n vm.newFunction(name, fn).consume((fnh) => vm.setProp(configCtx, name + '__internal__', fnh));\n };\n\n if (checkBlockFlag(this.featureFlags, 'supportsLazyState')) {\n // injecting lazy state functions\n exportCtxFunction('args', () => {\n if (this.computableCtx === undefined)\n throw new Error(`Add dummy call to ctx.args outside the future lambda. Can't be directly used in this context.`);\n return vm.newString(this.blockCtx.args(this.computableCtx));\n });\n exportCtxFunction('uiState', () => {\n if (this.computableCtx === undefined)\n throw new Error(`Add dummy call to ctx.uiState outside the future lambda. Can't be directly used in this context.`);\n return vm.newString(this.blockCtx.uiState(this.computableCtx) ?? '{}');\n });\n exportCtxFunction('activeArgs', () => {\n if (this.computableCtx === undefined)\n throw new Error(`Add dummy call to ctx.activeArgs outside the future lambda. Can't be directly used in this context.`);\n const res = this.blockCtx.activeArgs(this.computableCtx);\n return res === undefined ? vm.undefined : vm.newString(res);\n });\n } else {\n const args = this.blockCtx.args(this.computableCtx!);\n const activeArgs = this.blockCtx.activeArgs(this.computableCtx!);\n const uiState = this.blockCtx.uiState(this.computableCtx!);\n vm.setProp(configCtx, 'args', localScope.manage(vm.newString(args)));\n vm.setProp(configCtx, 'uiState', localScope.manage(vm.newString(uiState ?? '{}')));\n if (activeArgs !== undefined)\n vm.setProp(configCtx, 'activeArgs', localScope.manage(vm.newString(activeArgs)));\n }\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction('getAccessorHandleByName', (name) => {\n return parent.exportSingleValue(\n this.getAccessorHandleByName(vm.getString(name)),\n undefined,\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction('resolveWithCommon', (handle, commonOptions, ...steps) => {\n return parent.exportSingleValue(\n this.resolveWithCommon(\n vm.getString(handle),\n parent.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => parent.importObjectViaJson(step) as FieldTraversalStepFromSDK | string,\n ),\n ),\n undefined,\n );\n });\n\n exportCtxFunction('getResourceType', (handle) => {\n return parent.exportObjectViaJson(this.getResourceType(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getInputsLocked', (handle) => {\n return parent.exportSingleValue(this.getInputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getOutputsLocked', (handle) => {\n return parent.exportSingleValue(this.getOutputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsReadyOrError', (handle) => {\n return parent.exportSingleValue(this.getIsReadyOrError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsFinal', (handle) => {\n return parent.exportSingleValue(this.getIsFinal(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getError', (handle) => {\n return parent.exportSingleValue(this.getError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listInputFields', (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listOutputFields', (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listDynamicFields', (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getKeyValueBase64', (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueBase64(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction('getKeyValueAsString', (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueAsString(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction('getDataBase64', (handle) => {\n return parent.exportSingleValue(this.getDataBase64(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getDataAsString', (handle) => {\n return parent.exportSingleValue(this.getDataAsString(vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction(\n 'parsePObjectCollection',\n (handle, errorOnUnknownField, prefix, ...resolveSteps) => {\n return parent.exportObjectUniversal(\n this.parsePObjectCollection(\n vm.getString(handle),\n vm.dump(errorOnUnknownField) as boolean,\n vm.getString(prefix),\n ...resolveSteps.map((stepHandle) => vm.getString(stepHandle)),\n ),\n undefined,\n );\n },\n );\n\n //\n // Blobs\n //\n\n exportCtxFunction('getBlobContentAsBase64', (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsBase64(vm.getString(handle), parent.importObjectUniversal(range) as RangeBytes | undefined),\n undefined,\n );\n });\n\n exportCtxFunction('getBlobContentAsString', (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsString(vm.getString(handle), parent.importObjectUniversal(range) as RangeBytes | undefined),\n undefined,\n );\n });\n\n exportCtxFunction('getDownloadedBlobContentHandle', (handle) => {\n return parent.exportSingleValue(\n this.getDownloadedBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n exportCtxFunction('getOnDemandBlobContentHandle', (handle) => {\n return parent.exportSingleValue(\n this.getOnDemandBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n //\n // Blobs to URLs\n //\n\n exportCtxFunction('extractArchiveAndGetURL', (handle, format) => {\n return parent.exportSingleValue(\n this.extractArchiveAndGetURL(vm.getString(handle), vm.getString(format) as ArchiveFormat),\n undefined);\n });\n\n //\n // ImportProgress\n //\n\n exportCtxFunction('getImportProgress', (handle) => {\n return parent.exportSingleValue(this.getImportProgress(vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction('getLastLogs', (handle, nLines) => {\n return parent.exportSingleValue(\n this.getLastLogs(vm.getString(handle), vm.getNumber(nLines)),\n undefined,\n );\n });\n\n exportCtxFunction('getProgressLog', (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLog(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction('getProgressLogWithInfo', (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLogWithInfo(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction('getLogHandle', (handle) => {\n return parent.exportSingleValue(this.getLogHandle(vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction('getBlockLabel', (blockId) => {\n return parent.exportSingleValue(this.getBlockLabel(vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction('getDataFromResultPool', () => {\n return parent.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction('getDataWithErrorsFromResultPool', () => {\n return parent.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction('getSpecsFromResultPool', () => {\n return parent.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction('calculateOptions', (predicate) => {\n return parent.exportObjectUniversal(\n this.calculateOptions(parent.importObjectViaJson(predicate) as PSpecPredicate),\n undefined,\n );\n });\n\n exportCtxFunction('getSpecFromResultPoolByRef', (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getSpecFromResultPoolByRef(\n vm.getString(blockId),\n vm.getString(exportName),\n ),\n undefined,\n );\n });\n\n exportCtxFunction('getDataFromResultPoolByRef', (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getDataFromResultPoolByRef(\n vm.getString(blockId),\n vm.getString(exportName),\n ),\n undefined,\n );\n });\n\n //\n // PFrames / PTables\n //\n\n exportCtxFunction('createPFrame', (def) => {\n return parent.exportSingleValue(\n this.createPFrame(parent.importObjectViaJson(def) as PFrameDef<string | PColumnValues>),\n undefined,\n );\n });\n\n exportCtxFunction('createPTable', (def) => {\n return parent.exportSingleValue(\n this.createPTable(\n parent.importObjectViaJson(def) as PTableDef<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n //\n // Computable\n //\n\n exportCtxFunction('getCurrentUnstableMarker', () => {\n return parent.exportSingleValue(this.getCurrentUnstableMarker(), undefined);\n });\n\n //\n // Logging\n //\n\n exportCtxFunction('logInfo', (message) => {\n this.logInfo(vm.getString(message));\n });\n\n exportCtxFunction('logWarn', (message) => {\n this.logWarn(vm.getString(message));\n });\n\n exportCtxFunction('logError', (message) => {\n this.logError(vm.getString(message));\n });\n });\n }\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type {\n BlockCodeKnownFeatureFlags } from '@platforma-sdk/model';\nimport {\n JsRenderInternal,\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport type { QuickJSContext, QuickJSHandle } from 'quickjs-emscripten';\nimport { Scope, errors } from 'quickjs-emscripten';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport { stringifyWithResourceId } from '@milaboratories/pl-client';\nimport { PlQuickJSError } from '@milaboratories/pl-errors';\nimport { ComputableContextHelper } from './computable_context';\n\nexport type DeadlineSettings = {\n currentExecutionTarget: string;\n deadline: number;\n};\n\n/**\n * Communicates a deadline to the quickjs runtime, that if passed, will interrupt the execution.\n * Undefined can be used to reset the deadline.\n * */\nexport type DeadlineSetter = (settings: DeadlineSettings | undefined) => void;\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\n/**\n * Contains references to objects needed to execute lambda within computable,\n * providing access to:\n * - block context\n * - computable context\n * - middle layer environment\n * */\nexport type ComputableEnv = {\n readonly blockCtx: BlockContextAny;\n readonly mlEnv: MiddleLayerEnvironment;\n computableCtx: ComputableCtx;\n};\n\nexport class JsExecutionContext {\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly errorRepo = new ErrorRepository();\n\n public readonly computableHelper: ComputableContextHelper | undefined;\n\n constructor(\n public readonly scope: Scope,\n public readonly vm: QuickJSContext,\n private readonly deadlineSetter: DeadlineSetter,\n featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableEnv?: ComputableEnv,\n ) {\n this.callbackRegistry = this.scope.manage(this.vm.newObject());\n\n this.fnJSONStringify = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'stringify')),\n );\n if (vm.typeof(this.fnJSONStringify) !== 'function')\n throw new Error(`JSON.stringify() not found.`);\n\n this.fnJSONParse = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'parse')),\n );\n if (vm.typeof(this.fnJSONParse) !== 'function') throw new Error(`JSON.parse() not found.`);\n\n if (computableEnv !== undefined)\n this.computableHelper = new ComputableContextHelper(this, computableEnv.blockCtx, computableEnv.mlEnv, featureFlags, computableEnv.computableCtx);\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n notEmpty(this.computableHelper, 'Computable context helper is not initialized').resetComputableCtx();\n }\n\n private static cleanErrorContext(error: unknown): void {\n if (typeof error === 'object' && error !== null && 'context' in error) delete error['context'];\n }\n\n // private static cleanError(error: unknown): unknown {\n // if (error instanceof errors.QuickJSUnwrapError) {\n // const { cause, context: _, name, message, stack, ...rest } = error;\n // const clean = new errors.QuickJSUnwrapError(cause);\n // Object.assign(clean, { ...rest, name, message, stack });\n // return clean;\n // }\n // return error;\n // }\n\n public evaluateBundle(code: string) {\n try {\n this.deadlineSetter({ currentExecutionTarget: 'evaluateBundle', deadline: Date.now() + 10000 });\n this.vm.unwrapResult(this.vm.evalCode(code, 'bundle.js', { type: 'global' })).dispose();\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n } finally {\n this.deadlineSetter(undefined);\n }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n try {\n this.deadlineSetter({ currentExecutionTarget: cbName, deadline: Date.now() + 10000 });\n return Scope.withScope((localScope) => {\n const targetCallback = localScope.manage(this.vm.getProp(this.callbackRegistry, cbName));\n\n if (this.vm.typeof(targetCallback) !== 'function')\n throw new Error(`No such callback: ${cbName}`);\n\n return this.scope.manage(\n this.vm.unwrapResult(\n this.vm.callFunction(\n targetCallback,\n this.vm.undefined,\n ...args.map((arg) => this.exportObjectUniversal(arg, localScope)),\n ),\n ),\n );\n });\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n const original = this.errorRepo.getOriginal(err);\n throw original;\n } finally {\n this.deadlineSetter(undefined);\n }\n }\n\n //\n // QuickJS Helpers\n //\n\n public exportSingleValue(\n obj: boolean | number | string | null | ArrayBuffer | undefined,\n scope: Scope | undefined,\n ): QuickJSHandle {\n const result = this.tryExportSingleValue(obj, scope);\n if (result === undefined) {\n throw new Error(`Can't export value: ${obj === undefined ? 'undefined' : JSON.stringify(obj)}`);\n }\n return result;\n }\n\n public tryExportSingleValue(obj: unknown, scope: Scope | undefined): QuickJSHandle | undefined {\n let handle: QuickJSHandle;\n let manage = false;\n switch (typeof obj) {\n case 'string':\n handle = this.vm.newString(obj);\n manage = true;\n break;\n case 'number':\n handle = this.vm.newNumber(obj);\n manage = true;\n break;\n case 'undefined':\n handle = this.vm.undefined;\n break;\n case 'boolean':\n handle = obj ? this.vm.true : this.vm.false;\n break;\n default:\n if (obj === null) {\n handle = this.vm.null;\n break;\n }\n if (isArrayBufferOrView(obj)) {\n handle = this.vm.newArrayBuffer(obj);\n manage = true;\n break;\n }\n return undefined;\n }\n return manage && scope != undefined ? scope.manage(handle) : handle;\n }\n\n public exportObjectUniversal(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const simpleHandle = this.tryExportSingleValue(obj, scope);\n if (simpleHandle !== undefined) return simpleHandle;\n return this.exportObjectViaJson(obj, scope);\n }\n\n public exportObjectViaJson(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const result = this.vm\n .newString(JSON.stringify(obj))\n .consume((json) =>\n this.vm.unwrapResult(this.vm.callFunction(this.fnJSONParse, this.vm.undefined, json)),\n );\n return scope !== undefined ? scope.manage(result) : result;\n }\n\n public importObjectUniversal(handle: QuickJSHandle | undefined): unknown {\n if (handle === undefined) return undefined;\n switch (this.vm.typeof(handle)) {\n case 'undefined':\n return undefined;\n case 'boolean':\n case 'number':\n case 'string':\n return this.vm.dump(handle);\n default:\n return this.importObjectViaJson(handle);\n }\n }\n\n public importObjectViaJson(handle: QuickJSHandle): unknown {\n const text = this.vm\n .unwrapResult(this.vm.callFunction(this.fnJSONStringify, this.vm.undefined, handle))\n .consume((strHandle) => this.vm.getString(strHandle));\n if (text === 'undefined')\n // special case with futures\n return undefined;\n return JSON.parse(text);\n }\n\n private injectCtx() {\n Scope.withScope((localScope) => {\n const configCtx = localScope.manage(this.vm.newObject());\n\n //\n // Core props\n //\n\n this.vm.setProp(configCtx, 'callbackRegistry', this.callbackRegistry);\n this.vm.setProp(\n configCtx,\n 'featureFlags',\n this.exportObjectUniversal(JsRenderInternal.GlobalCfgRenderCtxFeatureFlags, localScope),\n );\n\n //\n // Injecting computable context helper methods if we are running in computable context\n //\n\n if (this.computableHelper !== undefined)\n this.computableHelper.injectCtx(configCtx);\n\n //\n // Creating global variable inside the vm\n //\n\n this.vm.setProp(this.vm.global, 'cfgRenderCtx', configCtx);\n });\n }\n}\n\n/** Holds errors that happened in the host code (like in middle-layer's drivers)\n * and then throws it where the error from quick JS is needed.\n * QuickJS couldn't throw custom errors, so we store them here, and rethrow them when we exit QuickJS side. */\nexport class ErrorRepository {\n private readonly errorIdToError = new Map<string, unknown>();\n\n /** Sets the error to the repository and returns a mimicrated error that also has uuid key of the original error. */\n public setAndRecreateForQuickJS(error: unknown): {\n name: string;\n message: string;\n } {\n const errorId = randomUUID();\n this.errorIdToError.set(errorId, error);\n\n if (error instanceof Error) {\n return {\n name: `${error.name}/uuid:${errorId}`,\n message: error.message,\n };\n }\n\n return {\n name: `UnknownErrorQuickJS/uuid:${errorId}`,\n message: `${error as any}`,\n };\n }\n\n /** Returns the original error that was stored by parsing uuid of mimicrated error. */\n public getOriginal(quickJSError: unknown): unknown {\n if (!(quickJSError instanceof errors.QuickJSUnwrapError)) {\n console.warn('ErrorRepo: quickJSError is not a QuickJSUnwrapError', stringifyWithResourceId(quickJSError));\n return quickJSError;\n }\n\n const cause = quickJSError.cause;\n if (!(typeof cause === 'object' && cause !== null && ('name' in cause) && typeof cause.name === 'string')) {\n console.warn('ErrorRepo: quickJSError.cause is not an Error (can be stack limit exceeded)', stringifyWithResourceId(quickJSError));\n return quickJSError;\n }\n\n const causeName = cause.name;\n const errorId = causeName.slice(causeName.indexOf('/uuid:') + '/uuid:'.length);\n if (!errorId) {\n throw new Error(`ErrorRepo: quickJSError.cause.name does not contain errorId: ${causeName}, ${stringifyWithResourceId(quickJSError)}`);\n }\n\n const error = this.errorIdToError.get(errorId);\n if (error === undefined) {\n throw new Error(`ErrorRepo: errorId not found: ${errorId}, ${stringifyWithResourceId(quickJSError)}`);\n }\n\n return new PlQuickJSError(quickJSError, error as Error);\n }\n}\n","import type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport type { BlockCodeWithInfo, ConfigRenderLambda } from '@platforma-sdk/model';\nimport type { ComputableRenderingOps } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { Scope } from 'quickjs-emscripten';\nimport type { DeadlineSettings } from './context';\nimport { JsExecutionContext } from './context';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport { getDebugFlags } from '../debug';\n\nfunction logOutputStatus(handle: string, renderedResult: unknown, stable: boolean, recalculationCounter: number, unstableMarker?: string) {\n if (getDebugFlags().logOutputStatus && (getDebugFlags().logOutputStatus === 'any' || !stable)) {\n if (stable)\n console.log(`Stable output ${handle} calculated ${renderedResult !== undefined ? 'defined' : 'undefined'}; (#${recalculationCounter})`);\n else\n console.log(`Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== undefined ? 'defined' : 'undefined'} (#${recalculationCounter})`);\n }\n}\n\n/**\n * Creates a Computable that executes a render function (`fh`) from a block's code in a QuickJS virtual machine.\n * This function handles both synchronous and asynchronous execution patterns of the sandboxed JS code.\n *\n * The overall data flow is as follows:\n * 1. A QuickJS VM is initialized.\n * 2. A `JsExecutionContext` is created to bridge the host (TypeScript) and guest (QuickJS) environments. It injects a\n * context object (`cfgRenderCtx`) into the VM, providing helper methods for the sandboxed code to interact with the\n * platform (e.g., to request data).\n * 3. The block's Javascript bundle is evaluated in the VM.\n * 4. The specified render function (`fh.handle`) is executed.\n *\n * Two execution paths are possible depending on the behavior of the render function:\n *\n * ### Synchronous Path\n * If the render function computes its result without requesting any external data requiring asynchronous calculations,\n * it executes synchronously.\n * - The `computablesToResolve` map in `JsExecutionContext` remains empty.\n * - The function returns an object with an `ir` field holding the result (`{ ir: importedResult }`).\n * Since `postprocessValue` is not specified, `ir` is treated as the final resolved value of the Computable.\n * - The QuickJS VM is disposed of immediately as it's no longer needed.\n *\n * ### Asynchronous Path (with `postprocessValue`)\n * If the render function needs external data requiring asynchronous calculations (e.g., fetching a file), it calls\n * one of the injected helper methods. These methods don't return data directly. Instead, they:\n * a. Create a new `Computable` for the data request (e.g., to fetch a blob).\n * b. Register this new `Computable` in the `computablesToResolve` map.\n * c. Return a handle (string) to the sandboxed code.\n *\n * In this case:\n * - The initial execution of the render function returns a scaffold of the final result, which depends on the pending\n * computables.\n * - The `computablesToResolve` map is passed as the `ir` (initial result) to `Computable.makeRaw`.\n * - The `postprocessValue` function is provided to handle the results once the computables are resolved.\n * - The QuickJS VM is kept alive (`keepVmAlive = true`) because its state is needed in `postprocessValue`.\n * - Once the `computable` framework resolves all dependencies, it calls `postprocessValue` with the resolved data.\n * - `postprocessValue` feeds the resolved data back into the VM, allowing the sandboxed code to compute the final\n * result.\n * - The VM is eventually disposed of when the host Computable is destroyed.\n *\n * @param env The middle layer environment.\n * @param ctx The block context.\n * @param fh The config render lambda to execute.\n * @param codeWithInfo The block's code and feature flags.\n * @param configKey A key for the configuration, used for cache busting.\n * @param ops Options for the computable.\n * @returns A `Computable` that will resolve to the result of the lambda execution.\n */\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n const { code, featureFlags } = codeWithInfo;\n // adding configKey to reload all outputs on block-pack update\n const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;\n ops = { ...ops, key };\n if (ops.mode === undefined && fh.retentive === true) ops.mode = 'StableOnlyRetentive';\n return Computable.makeRaw((cCtx) => {\n if (getDebugFlags().logOutputRecalculations)\n console.log(`Block lambda recalculation : ${key} (${cCtx.changeSourceMarker}; ${cCtx.bodyInvocations} invocations)`);\n\n const scope = new Scope();\n let keepVmAlive = false;\n cCtx.addOnDestroy(() => {\n // If keepVmAlive is false, the scope will be disposed by the finally block,\n // no need to dispose it here.\n if (keepVmAlive) scope.dispose();\n });\n\n try {\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 1024 * 8);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm,\n (s) => { deadlineSettings = s; },\n featureFlags,\n { computableCtx: cCtx, blockCtx: ctx, mlEnv: env });\n\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh.handle);\n\n rCtx.resetComputableCtx();\n\n const toBeResolved = rCtx.computableHelper!.computablesToResolve;\n\n if (Object.keys(toBeResolved).length === 0) {\n const importedResult = rCtx.importObjectUniversal(result);\n logOutputStatus(fh.handle, importedResult, cCtx.unstableMarker === undefined, -1, cCtx.unstableMarker);\n return { ir: importedResult };\n }\n\n let recalculationCounter = 0;\n if (getDebugFlags().logOutputStatus)\n console.log(`Output ${fh.handle} scaffold calculated (not all computables resolved yet).`);\n keepVmAlive = true;\n\n return {\n ir: toBeResolved,\n postprocessValue: (resolved: Record<string, unknown>, { unstableMarker, stable }) => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved)) rCtx.runCallback(handle, value);\n\n // rendering result\n const renderedResult = rCtx.importObjectUniversal(result);\n\n // logging\n recalculationCounter++;\n logOutputStatus(fh.handle, renderedResult, stable, recalculationCounter, unstableMarker);\n\n return renderedResult;\n },\n };\n } catch (e) {\n keepVmAlive = false;\n throw e;\n } finally {\n if (!keepVmAlive) scope.dispose();\n }\n }, ops);\n}\n\nexport function executeSingleLambda(\n quickJs: QuickJSWASMModule,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n ...args: unknown[]\n): unknown {\n const { code, featureFlags } = codeWithInfo;\n const scope = new Scope();\n try {\n const runtime = scope.manage(quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 1024 * 8);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm,\n (s) => { deadlineSettings = s; },\n featureFlags,\n );\n\n // Initializing the model\n rCtx.evaluateBundle(code.content);\n\n // Running the lambda\n return rCtx.importObjectUniversal(rCtx.runCallback(fh.handle, ...args));\n } finally {\n scope.dispose();\n }\n}\n","import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from '@platforma-sdk/model';\nimport { isConfigLambda } from '@platforma-sdk/model';\nimport type { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { computableFromCfg } from '../cfg_render/executor';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { computableFromRF } from '../js_render';\nimport type { BlockContextAny } from './block_ctx';\nimport { hasActiveCfgComponents } from '../cfg_render/util';\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n codeWithInfo: BlockCodeWithInfo | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (codeWithInfo === undefined) throw new Error('No code bundle.');\n return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n","import type { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { projectFieldName } from '../model/project_model';\nimport type { ResourceId } from '@milaboratories/pl-client';\nimport { Pl } from '@milaboratories/pl-client';\nimport { ifNotUndef } from '../cfg_render/util';\nimport type { BlockPackInfo } from '../model/block_pack';\nimport type { BlockConfig } from '@platforma-sdk/model';\nimport { extractConfig } from '@platforma-sdk/model';\n\nexport type BlockPackInfoAndId = {\n readonly bpResourceId: ResourceId;\n /** To be added to computable keys, to force reload on config change */\n readonly bpId: string;\n /** Full block-pack info */\n readonly info: BlockPackInfo;\n /** Config extracted from the info */\n readonly cfg: BlockConfig;\n};\n\n/** Returns block pack info along with string representation of block-pack resource id */\nexport function getBlockPackInfo(\n prj: PlTreeNodeAccessor,\n blockId: string,\n): BlockPackInfoAndId | undefined {\n return ifNotUndef(\n prj.traverse(\n {\n field: projectFieldName(blockId, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true,\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true },\n ),\n (bpAcc) => {\n const info = bpAcc.getDataAsJson<BlockPackInfo>()!;\n const cfg = extractConfig(info.config);\n return { bpResourceId: bpAcc.resourceInfo.id, bpId: bpAcc.resourceInfo.id.toString(), info, cfg };\n },\n );\n}\n","import type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type {\n ProjectRenderingState,\n ProjectStructure } from '../model/project_model';\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectStructureAuthorKey,\n ProjectStructureKey,\n} from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { allBlocks, productionGraph } from '../model/project_model_util';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport type {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n ProjectMeta,\n ProjectOverview,\n} from '@milaboratories/pl-model-middle-layer';\nimport { constructBlockContextArgsOnly } from './block_ctx';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { extractCodeWithInfo, type BlockSection } from '@platforma-sdk/model';\nimport { computableFromCfgOrRF } from './render';\nimport type { NavigationStates } from './navigation_states';\nimport { getBlockPackInfo } from './util';\nimport { resourceIdToString, type ResourceId } from '@milaboratories/pl-client';\nimport * as R from 'remeda';\n\ntype BlockInfo = {\n argsRid: ResourceId;\n currentArguments: unknown;\n prod?: ProdState;\n};\n\ntype _CalculationStatus = 'Running' | 'Done';\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: Record<string, unknown>;\n};\n\nfunction argsEquals(a: Record<string, unknown> | undefined, b: Record<string, unknown> | undefined): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n const clean = R.omitBy<Record<string, unknown>>((_, key) => key.startsWith('__'));\n return R.isDeepEqual(clean(a), clean(b));\n}\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey),\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, 'currentArgs'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true,\n });\n const currentArguments = cInputs.getDataAsJson() as Record<string, unknown>;\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, 'prodArgs'),\n assertFieldType: 'Dynamic',\n stableIfNotFound: true,\n });\n if (rInputs !== undefined) {\n const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;\n const result = prj.getField({\n field: projectFieldName(id, 'prodOutput'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true,\n });\n const ctx = prj.getField({\n field: projectFieldName(id, 'prodUiCtx'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true,\n });\n prod = {\n arguments: prodArgs,\n stale: !argsEquals(currentArguments, prodArgs),\n outputError:\n result.error !== undefined\n || ctx.error !== undefined\n || result.value?.getError() !== undefined\n || ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError())\n || (result.error !== undefined && result.error.getIsReadyOrError()))\n && ((ctx.value !== undefined && ctx.value.getIsReadyOrError())\n || (ctx.error !== undefined && ctx.error.getIsReadyOrError())),\n };\n }\n\n infos.set(id, { currentArguments, prod, argsRid: cInputs.resourceInfo.id });\n }\n\n const currentGraph = productionGraph(structure, (id) => {\n const bpInfo = getBlockPackInfo(prj, id)!;\n const bInfo = infos.get(id)!;\n const args = bInfo.currentArguments;\n return {\n args,\n enrichmentTargets: env.projectHelper.getEnrichmentTargets(() => bpInfo.cfg, () => args, { argsRid: bInfo.argsRid, blockPackRid: bpInfo.bpResourceId }),\n };\n });\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = 'NotCalculated';\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = 'Limbo';\n else calculationStatus = info.prod.finished ? 'Done' : 'Running';\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const { sections, title, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime }\n = ifNotUndef(bp, ({ bpId, cfg }) => {\n if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {\n return {\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n const codeWithInfo = extractCodeWithInfo(cfg);\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.sections,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (e) => {\n env.logger.error('Error in block model sections');\n env.logger.error(e);\n return [];\n },\n }) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n title,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (e) => {\n env.logger.error('Error in block model title');\n env.logger.error(e);\n return 'Invalid title';\n },\n }) as ComputableStableDefined<string>,\n ),\n inputsValid: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (e) => {\n // I'm not sure that we should write an error here, because it just means \"Invalid args\"\n env.logger.error('Error in block model argsValid');\n env.logger.error(e);\n return false;\n },\n }) as ComputableStableDefined<boolean>,\n sdkVersion: codeWithInfo?.sdkVersion,\n featureFlags: codeWithInfo?.featureFlags ?? {},\n isIncompatibleWithRuntime: false,\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, 'blockSettings'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true,\n })\n .getDataAsJson() as BlockSettings;\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings }),\n );\n\n return {\n projectResourceId: resourceIdToString(prjEntry.rid),\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === 'Limbo',\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots('upstream', id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots('downstream', id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n navigationState: navigationStates.getState(id),\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks,\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun\n = (stale || b.outputErrors)\n && Boolean(b.inputsValid)\n && !b.missingReference\n && b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion,\n };\n delete bb['updates'];\n return bb;\n }),\n };\n },\n },\n ).withStableType();\n}\n","import type { PlTreeEntry, PlTreeEntryAccessor } from '@milaboratories/pl-tree';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport { Pl, resourceTypesEqual } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData } from '../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../model';\nimport type { UrlResult } from '@milaboratories/pl-drivers';\nimport { projectFieldName } from '../model/project_model';\nimport { BlockPackFrontendField } from '../mutator/block-pack/block_pack';\nimport { getBlockPackInfo } from './util';\nimport type { FrontendData } from '../model/frontend';\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment,\n): undefined | string | ComputableStableDefined<UrlResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getUrl(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`,\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendUrlComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === 'string') return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.url;\n },\n },\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, 'blockPack'),\n assertFieldType: 'Dynamic',\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: 'Input' },\n )\n ?.persist();\n return {\n url: frontendUrlComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion,\n };\n },\n { mode: 'StableOnlyLive' },\n ) as ComputableStableDefined<FrontendData>;\n}\n","import type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type {\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors,\n} from '@milaboratories/computable';\nimport {\n Computable,\n} from '@milaboratories/computable';\nimport { constructBlockContext, constructBlockContextArgsOnly } from './block_ctx';\nimport { blockArgsAuthorKey } from '../model/project_model';\nimport { ifNotUndef } from '../cfg_render/util';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { getBlockPackInfo } from './util';\nimport type { AuthorMarker, BlockStateInternal } from '@milaboratories/pl-model-middle-layer';\nimport { computableFromCfgOrRF } from './render';\nimport { resourceIdToString } from '@milaboratories/pl-client';\nimport { deepFreeze } from '@milaboratories/ts-helpers';\nimport { extractCodeWithInfo } from '@platforma-sdk/model';\nimport { getDebugFlags } from '../debug';\n\nexport type BlockArgsAndUiState = Omit<BlockStateInternal, 'outputs' | 'navigationState'>;\n\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string\n): Computable<BlockArgsAndUiState>;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx: ComputableCtx\n): BlockArgsAndUiState;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx?: ComputableCtx,\n): BlockArgsAndUiState | Computable<BlockArgsAndUiState> {\n if (cCtx === undefined)\n return Computable.make((c) => blockArgsAndUiState(projectEntry, blockId, c), {\n key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}`,\n });\n\n const prj = cCtx.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(projectEntry, blockId);\n const uiState = ctx.uiState(cCtx);\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),\n // @TODO add deserialization caching\n args: deepFreeze(JSON.parse(ctx.args(cCtx))),\n // @TODO add deserialization caching\n ui: uiState !== undefined ? deepFreeze(JSON.parse(uiState)) : undefined,\n };\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n blockId: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n const key = 'outputs#' + resourceIdToString(projectEntry.rid) + '#' + blockId;\n return Computable.make(\n (c) => {\n if (getDebugFlags().logOutputRecalculations) {\n console.log(`blockOutput recalculation : ${key} (${c.changeSourceMarker}; ${c.bodyInvocations} invocations)`);\n }\n\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(projectEntry, blockId);\n\n return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId }) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {\n const computableOutput = computableFromCfgOrRF(env, ctx, cellCfg, extractCodeWithInfo(cfg), bpId);\n outputs[cellId] = Computable.wrapError(computableOutput, 1);\n }\n return outputs;\n });\n },\n { key },\n ).withStableType();\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable } from '@milaboratories/computable';\nimport type { ProjectStructure } from '../model/project_model';\nimport { ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { constructBlockContext } from './block_ctx';\nimport { computableFromCfgOrRF, isActive } from './render';\nimport { getBlockPackInfo } from './util';\nimport { extractCodeWithInfo } from '@platforma-sdk/model';\n\n/** Returns derived general project state form the project resource */\nexport function activeConfigs(\n prjEntry: PlTreeEntry,\n env: MiddleLayerEnvironment,\n): Computable<unknown[]> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const ret: Computable<unknown>[] = [];\n for (const { id } of allBlocks(structure)) {\n const bp = getBlockPackInfo(prj, id);\n if (bp === undefined) continue;\n\n const activeOutputConfigs = Object.entries(bp.cfg.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => isActive(cfg))\n .map((cfg) => cfg);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj.persist(), id);\n\n for (const cfg of activeOutputConfigs)\n ret.push(\n Computable.wrapError(computableFromCfgOrRF(env, blockCtx, cfg, extractCodeWithInfo(bp.cfg), bp.bpId)),\n );\n }\n\n return ret;\n });\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport { ChangeSource, Computable } from '@milaboratories/computable';\nimport type { NavigationState } from '@platforma-sdk/model';\nimport { DefaultNavigationState } from '@platforma-sdk/model';\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged('navigation state changed');\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` },\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged('block deleted');\n }\n }\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { Computable } from '@milaboratories/computable';\nimport type { ProjectStructure } from '../model/project_model';\nimport { ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\n\nexport type ProjectOverviewLight = {\n readonly listOfBlocks: string[];\n};\n\n/** Returns derived general project state form the project resource */\nexport function projectOverviewLight(\n prjEntry: PlTreeEntry,\n): Computable<ProjectOverviewLight> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n\n return {\n listOfBlocks: [...allBlocks(structure)].map((b) => b.id),\n };\n });\n}\n","/** Uses KV for uiState compared to V2 */\nexport const SchemaVersionV1 = '1';\n\nexport const BlockFrontendStateKeyPrefixV1 = 'BlockFrontendState/';\nexport const BlockFrontendStateKeyPatternV1 = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKeyV1(blockId: string): string {\n return `${BlockFrontendStateKeyPrefixV1}${blockId}`;\n}\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKeyV1(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPatternV1);\n if (match === null) return undefined;\n return match.groups!['blockid'];\n}\n","import type { PlClient, PlTransaction, ResourceId } from '@milaboratories/pl-client';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey } from '../model/project_model';\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from '../model/project_model_v1';\nimport { field } from '@milaboratories/pl-client';\nimport { cachedDeserialize } from '@milaboratories/ts-helpers';\nimport { allBlocks } from '../model/project_model_util';\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx('ProjectMigration', async (tx) => {\n const schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n } else {\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, 'uiState'));\n tx.createField(uiStateF, 'Dynamic', uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n","import type { MiddleLayerEnvironment } from './middle_layer';\nimport type {\n FieldData,\n OptionalAnyResourceId,\n ResourceId,\n} from '@milaboratories/pl-client';\nimport {\n ensureResourceIdNotNull,\n field,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n resourceIdToString,\n} from '@milaboratories/pl-client';\nimport type { ComputableStableDefined, ComputableValueOrErrors } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport type { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { withProject, withProjectAuthored } from '../mutator/project';\nimport type { ExtendedResourceData } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState, treeDumpStats } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport type { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport type { FrontendData } from '../model/frontend';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName } from '../model/project_model';\nimport { cachedDeserialize, notEmpty } from '@milaboratories/ts-helpers';\nimport type { BlockPackInfo } from '../model/block_pack';\nimport type {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal,\n BlockSettings,\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\nimport { extractConfig } from '@platforma-sdk/model';\nimport fs from 'node:fs/promises';\nimport canonicalize from 'canonicalize';\nimport type { ProjectOverviewLight } from './project_overview_light';\nimport { projectOverviewLight } from './project_overview_light';\nimport { applyProjectMigrations } from '../mutator/migration';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\n};\n\nfunction stringifyForDump(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === 'bigint')\n return resourceIdToString(value as OptionalAnyResourceId);\n else if (\n ArrayBuffer.isView(value)\n || value instanceof Int8Array\n || value instanceof Uint8Array\n || value instanceof Uint8ClampedArray\n || value instanceof Int16Array\n || value instanceof Uint16Array\n || value instanceof Int32Array\n || value instanceof Uint32Array\n || value instanceof Float32Array\n || value instanceof Float64Array\n || value instanceof BigInt64Array\n || value instanceof BigUint64Array\n )\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString('base64');\n else if (Buffer.isBuffer(value))\n return value.toString('base64');\n\n return value;\n });\n}\n\n/** Data access object, to manipulate and read single opened (!) project data. */\nexport class Project {\n /** Underlying pl resource id */\n public readonly rid: ResourceId;\n\n /** Data for the left panel, contain basic information about block status. */\n public readonly overview: ComputableStableDefined<ProjectOverview>;\n private readonly overviewLight: Computable<ProjectOverviewLight>;\n\n private readonly navigationStates = new NavigationStates();\n // null is set for deleted blocks\n private readonly blockComputables = new Map<string, BlockStateComputables | null>();\n\n private readonly blockFrontends = new Map<string, ComputableStableDefined<FrontendData>>();\n private readonly activeConfigs: Computable<unknown[]>;\n private readonly refreshLoopResult: Promise<void>;\n\n private readonly abortController = new AbortController();\n private destroyed = false;\n\n constructor(\n private readonly env: MiddleLayerEnvironment,\n rid: ResourceId,\n private readonly projectTree: SynchronizedTreeState,\n ) {\n this.overview = projectOverview(\n projectTree.entry(),\n this.navigationStates,\n env,\n ).withPreCalculatedValueTree();\n this.overviewLight = projectOverviewLight(projectTree.entry())\n .withPreCalculatedValueTree();\n this.rid = rid;\n this.refreshLoopResult = this.refreshLoop();\n this.activeConfigs = activeConfigs(projectTree.entry(), env);\n }\n\n private async refreshLoop(): Promise<void> {\n while (!this.destroyed) {\n try {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (prj) => {\n prj.doRefresh(this.env.ops.stagingRenderingRate);\n });\n await this.activeConfigs.getValue();\n await setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);\n\n // Block computables houskeeping\n const overviewLight = await this.overviewLight.getValue();\n const existingBlocks = new Set(overviewLight.listOfBlocks);\n // Doing cleanup for deleted blocks\n for (const blockId of this.blockComputables.keys()) {\n if (!existingBlocks.has(blockId)) {\n const computable = this.blockComputables.get(blockId);\n if (computable !== undefined && computable !== null) computable.fullState.resetState();\n this.blockComputables.set(blockId, null);\n }\n }\n } catch (e: unknown) {\n if (isNotFoundError(e)) {\n console.warn(\n 'project refresh routine terminated, because project was externally deleted',\n );\n break;\n } else if (!isTimeoutOrCancelError(e))\n throw new Error('Unexpected exception', { cause: e });\n }\n }\n }\n\n /**\n * Adds new block to the project.\n *\n * @param blockLabel block label / title visible to the user\n * @param blockPackSpec object describing the \"block type\", read more in the type docs\n * @param before id of the block to insert new block before\n * @param blockId internal id to be assigned for the block, this arg can be omitted\n * then, randomly generated UUID will be assigned automatically\n *\n * @return returns newly created block id\n * */\n public async addBlock(\n blockLabel: string,\n blockPackSpec: BlockPackSpecAny,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n blockId: string = randomUUID(),\n ): Promise<string> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n const blockCfg = extractConfig(blockCfgContainer); // full content of this var should never be persisted\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.addBlock(\n {\n id: blockId,\n label: blockLabel,\n renderingMode: blockCfg.renderingMode,\n },\n {\n args: canonicalize(blockCfg.initialArgs)!,\n uiState: canonicalize(blockCfg.initialUiState)!,\n blockPack: preparedBp,\n },\n before,\n ),\n );\n await this.projectTree.refreshState();\n\n return blockId;\n }\n\n /**\n * Duplicates an existing block by copying all its fields and state.\n * This method works at the mutator level for efficient block copying.\n *\n * @param originalBlockId id of the block to duplicate\n * @param before id of the block to insert new block before\n * @param author author marker for the duplication operation\n * @param newBlockId internal id to be assigned for the duplicated block,\n * if omitted, a randomly generated UUID will be assigned\n *\n * @return returns newly created block id\n * */\n public async duplicateBlock(\n originalBlockId: string,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n newBlockId: string = randomUUID(),\n ): Promise<string> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.duplicateBlock(originalBlockId, newBlockId, before),\n );\n await this.projectTree.refreshState();\n\n return newBlockId;\n }\n\n /**\n * Update block to new block pack, optionally resetting args and ui state to\n * initial values\n * */\n public async updateBlockPack(\n blockId: string,\n blockPackSpec: BlockPackSpecAny,\n resetArgs: boolean = false,\n author?: AuthorMarker,\n ): Promise<void> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfg = extractConfig(await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec));\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? { args: blockCfg.initialArgs, uiState: blockCfg.initialUiState } : undefined,\n ),\n );\n await this.projectTree.refreshState();\n }\n\n /** Deletes a block with all associated data. */\n public async deleteBlock(blockId: string, author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId));\n this.navigationStates.deleteBlock(blockId);\n await this.projectTree.refreshState();\n }\n\n /**\n * Updates block order according to the given array of block ids.\n *\n * Provided array must contain exactly the same set of ids current project cosists of,\n * an error will be thrown instead.\n */\n public async reorderBlocks(blocks: string[], author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n const currentStructure = mut.structure;\n if (currentStructure.groups.length !== 1)\n throw new Error('Unexpected project structure, non-sinular block group');\n const currentGroup = currentStructure.groups[0];\n if (currentGroup.blocks.length !== blocks.length)\n throw new Error(`Lengh mismatch: ${currentGroup.blocks.length} !== ${blocks.length}`);\n if (new Set<string>(blocks).size !== blocks.length) throw new Error(`Repeated block ids`);\n const newStructure: ProjectStructure = {\n groups: [\n {\n id: currentGroup.id,\n label: currentGroup.label,\n blocks: blocks.map((blockId) => {\n const block = currentGroup.blocks.find((b) => b.id === blockId);\n if (block === undefined) throw new Error(`Can't find block: ${blockId}`);\n return block;\n }),\n },\n ],\n };\n mut.updateStructure(newStructure);\n });\n await this.projectTree.refreshState();\n }\n\n /**\n * Renders production part of the block starting all connected heavy computations.\n * Upstream blocks of the specified block will be started automatically if in\n * stale state.\n * */\n public async runBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true));\n await this.projectTree.refreshState();\n }\n\n /**\n * Stops the block if it is running by destroying its production state. All\n * its downstreams will also be destroyed or moved to limbo if already\n * calculated.\n * */\n public async stopBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.stopProduction(blockId));\n await this.projectTree.refreshState();\n }\n\n // /** Update block label. */\n // public async setBlockLabel(blockId: string, label: string, author?: AuthorMarker) {\n // await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n // mut.setBlockLabel(blockId, label);\n // });\n // await this.projectTree.refreshState();\n // }\n\n /**\n * Sets block args, and changes whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgs(blockId: string, args: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, args }]),\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets ui block state associated with the block.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setUiState(blockId: string, uiState: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, uiState }]),\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\n // eslint-disable-next-line @typescript-eslint/require-await\n public async setNavigationState(blockId: string, state: NavigationState): Promise<void> {\n this.navigationStates.setState(blockId, state);\n }\n\n /**\n * Sets block args and ui state, and changes the whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgsAndUiState(\n blockId: string,\n args: unknown,\n uiState: unknown,\n author?: AuthorMarker,\n ) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n mut.setStates([{ blockId, args, uiState }]);\n });\n await this.projectTree.refreshState();\n }\n\n /** Update block settings */\n public async setBlockSettings(blockId: string, newValue: BlockSettings) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, undefined, (mut) => {\n mut.setBlockSettings(blockId, newValue);\n });\n await this.projectTree.refreshState();\n }\n\n /** Resets arguments and ui state of the block to initial state */\n public async resetBlockArgsAndUiState(blockId: string, author?: AuthorMarker): Promise<void> {\n await this.env.pl.withWriteTx('BlockInputsReset', async (tx) => {\n // reading default arg values from block pack\n const bpHolderRid = ensureResourceIdNotNull(\n (await tx.getField(field(this.rid, projectFieldName(blockId, 'blockPack')))).value,\n );\n const bpRid = ensureResourceIdNotNull(\n (await tx.getField(field(bpHolderRid, Pl.HolderRefField))).value,\n );\n const bpData = await tx.getResourceData(bpRid, false);\n const config = extractConfig(cachedDeserialize<BlockPackInfo>(notEmpty(bpData.data)).config);\n await withProjectAuthored(this.env.projectHelper, tx, this.rid, author, (prj) => {\n prj.setStates([{ blockId, args: config.initialArgs, uiState: config.initialUiState }]);\n });\n await tx.commit();\n });\n await this.projectTree.refreshState();\n }\n\n private getBlockComputables(blockId: string): BlockStateComputables {\n const cached = this.blockComputables.get(blockId);\n if (cached === null) throw new Error(`Block ${blockId} is deleted`);\n if (cached === undefined) {\n // state consists of inputs (args + ui state) and outputs\n const outputs = blockOutputs(this.projectTree.entry(), blockId, this.env);\n const fullState = Computable.make(\n (ctx) => {\n return {\n argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId),\n overview: this.overview,\n };\n },\n {\n postprocessValue: (v) => {\n const sdkVersion = v.overview?.blocks?.find((b) => b.id == blockId)?.sdkVersion;\n const toString = sdkVersion && shouldStillUseStringErrors(sdkVersion);\n const newOutputs = toString && v.outputs !== undefined\n ? convertErrorsToStrings(v.outputs)\n : v.outputs;\n\n return {\n ...v.argsAndUiState,\n outputs: newOutputs,\n navigationState: v.navigationState,\n } as BlockStateInternal;\n },\n },\n );\n\n const computables: BlockStateComputables = {\n fullState: fullState.withPreCalculatedValueTree(),\n };\n\n this.blockComputables.set(blockId, computables);\n\n return computables;\n }\n return cached;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch full block state,\n * including outputs, arguments, ui state.\n * */\n public getBlockState(blockId: string): Computable<BlockStateInternal> {\n return this.getBlockComputables(blockId).fullState;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch path of the\n * folder containing frontend code.\n * */\n public getBlockFrontend(blockId: string): ComputableStableDefined<FrontendData> {\n const cached = this.blockFrontends.get(blockId);\n if (cached === undefined) {\n const fd = frontendData(\n this.projectTree.entry(),\n blockId,\n this.env,\n ).withPreCalculatedValueTree();\n this.blockFrontends.set(blockId, fd);\n return fd;\n }\n return cached;\n }\n\n /** Called by middle layer on close */\n public async destroy(): Promise<void> {\n // terminating the project service loop\n this.destroyed = true;\n this.abortController.abort();\n await this.refreshLoopResult;\n\n // terminating the synchronized project tree\n await this.projectTree.terminate();\n\n // the following will deregister all external resource holders, like\n // downloaded files, running uploads and alike\n this.overview.resetState();\n this.blockFrontends.forEach((c) => c.resetState());\n this.blockComputables.forEach((c) => {\n if (c !== null) c.fullState.resetState();\n });\n this.activeConfigs.resetState();\n }\n\n /** @deprecated */\n public async destroyAndAwaitTermination(): Promise<void> {\n await this.destroy();\n }\n\n public static async init(env: MiddleLayerEnvironment, rid: ResourceId): Promise<Project> {\n // Applying migrations to the project resource, if needed\n await applyProjectMigrations(env.pl, rid);\n\n // Doing a no-op mutation to apply all migration and schema fixes\n await withProject(env.projectHelper, env.pl, rid, (_) => {});\n\n // Loading project tree\n const projectTree = await SynchronizedTreeState.init(\n env.pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: projectTreePruning,\n },\n env.logger,\n );\n\n if (env.ops.debugOps.dumpInitialTreeState) {\n const state = projectTree.dumpState();\n state.sort((a, b) => (b.data?.byteLength ?? 0) - (a.data?.byteLength ?? 0));\n const stats = treeDumpStats(state);\n await fs.writeFile(`${resourceIdToString(rid)}.json`, stringifyForDump(state));\n await fs.writeFile(`${resourceIdToString(rid)}.stats.json`, stringifyForDump(stats));\n }\n\n return new Project(env, rid, projectTree);\n }\n}\n\nfunction projectTreePruning(r: ExtendedResourceData): FieldData[] {\n // console.log(\n // JSON.stringify(\n // { ...r, kv: [], data: undefined } satisfies ExtendedResourceData,\n // (_, v) => {\n // if (typeof v === 'bigint') return v.toString();\n // return v;\n // }\n // )\n // );\n if (r.type.name.startsWith('StreamWorkdir/'))\n return [];\n switch (r.type.name) {\n case 'BlockPackCustom':\n return r.fields.filter((f) => f.name !== 'template');\n case 'UserProject':\n return r.fields.filter((f) => !f.name.startsWith('__serviceTemplate'));\n case 'Blob':\n return [];\n default:\n return r.fields;\n }\n}\n\n/** Returns true if sdk version of the block is old and we need to convert\n * ErrorLike errors to strings like it was.\n * We need it for keeping old blocks and new UI compatibility. */\nfunction shouldStillUseStringErrors(sdkVersion: string): boolean {\n return !isVersionGreater(sdkVersion, '1.26.0');\n}\n\n/** Checks if sdk version is greater that a target version. */\nfunction isVersionGreater(sdkVersion: string, targetVersion: string): boolean {\n const version = sdkVersion.split('.').map(Number);\n const target = targetVersion.split('.').map(Number);\n\n return (\n version[0] > target[0]\n || (version[0] === target[0] && version[1] > target[1])\n || (version[0] === target[0] && version[1] === target[1] && version[2] > target[2])\n );\n};\n\n/** Converts ErrorLike errors to strings in the outputs like it was in old ML versions. */\nfunction convertErrorsToStrings(\n outputs: Record<string, ComputableValueOrErrors<unknown>>,\n): Record<string, ComputableValueOrErrors<unknown>> {\n const result: Record<string, ComputableValueOrErrors<unknown>> = {};\n for (const [key, val] of Object.entries(outputs)) {\n if (val.ok) {\n result[key] = val;\n continue;\n }\n\n result[key] = {\n ok: false,\n errors: val.errors.map((e) => {\n if (typeof e === 'string') {\n return e;\n } else if (e.type == 'PlError' && e.fullMessage !== undefined) {\n return e.fullMessage;\n }\n return e.message;\n }),\n moreErrors: val.moreErrors,\n };\n }\n\n return result;\n}\n","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 pFrameConcurrency: 1,\n pTableConcurrency: 1,\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\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","'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","import type { PollPoolOps } from '@milaboratories/computable';\nimport { PollComputablePool } from '@milaboratories/computable';\nimport type {\n BlockPackFromRegistryV2,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n blockPackIdToString,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { Dispatcher } from 'undici';\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from './registry';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport semver from 'semver';\nimport canonicalize from 'canonicalize';\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500,\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = '__no_updates__';\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {},\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case 'dev-v1':\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'dev-v2':\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'from-registry-v2':\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case 'dev-v1': {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'dev-v2': {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'from-registry-v2': {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === 'patch') return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`,\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case 'major':\n vMainSuggestion = vSuggestions.find((v) => v.type !== 'major')?.update;\n break;\n case 'minor':\n vMainSuggestion = vSuggestions.find((v) => v.type === 'patch')?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } },\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion },\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n","import { isDisposable, isAsyncDisposable } from '@milaboratories/ts-helpers';\n\n/**\n * Function associated with particular entry from the RefCountResourcePool.\n *\n * Calling the function will release the reference acquired when object was\n * retieved from the pool.\n */\nexport type UnrefFn = () => void;\n\nexport interface PollResource<R> {\n /** Resource itself */\n readonly resource: R;\n\n /** Resource key, calculated using provided */\n readonly key: string;\n\n /** Callback to be called when requested resource can be disposed. */\n readonly unref: UnrefFn;\n}\n\nexport abstract class RefCountResourcePool<P, R> {\n private readonly resources = new Map<string, RefCountEnvelop<R>>();\n private readonly disposeQueue = Promise.resolve();\n protected abstract createNewResource(params: P): R;\n protected abstract calculateParamsKey(params: P): string;\n\n private check(key: string) {\n const envelop = this.resources.get(key);\n if (envelop === undefined) throw new Error('Unexpected state.');\n if (envelop.refCount === 0) {\n this.resources.delete(key);\n const resource = envelop.resource;\n\n if (isDisposable(resource)) {\n const _ = this.disposeQueue.then(() => resource[Symbol.dispose]());\n } else if (isAsyncDisposable(resource)) {\n const _ = this.disposeQueue.then(() => resource[Symbol.asyncDispose]());\n }\n }\n }\n\n public acquire(params: P): PollResource<R> {\n const key = this.calculateParamsKey(params);\n let envelop = this.resources.get(key);\n if (envelop === undefined) {\n envelop = { refCount: 0, resource: this.createNewResource(params) };\n this.resources.set(key, envelop);\n }\n\n // adding ref count\n envelop.refCount++;\n\n let unrefereced = false;\n return {\n resource: envelop.resource,\n key,\n unref: () => {\n if (unrefereced) return; // unref is idempotent, calling it many times have no effect\n // subtracting ref count\n envelop.refCount--;\n unrefereced = true;\n this.check(key);\n },\n };\n }\n\n public getByKey(key: string): R {\n const envelop = this.resources.get(key);\n if (envelop === undefined) throw new Error(`resource not found, key = ${key}`);\n return envelop.resource;\n }\n\n public tryGetByKey(key: string): R | undefined {\n return this.resources.get(key)?.resource;\n }\n}\n\ntype RefCountEnvelop<R> = {\n refCount: number;\n readonly resource: R;\n};\n","import type { DownloadDriver } from '@milaboratories/pl-drivers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { isPlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type { ComputableCtx, ComputableStableDefined } from '@milaboratories/computable';\nimport type {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n FindColumnsRequest,\n FindColumnsResponse,\n LocalBlobHandleAndSize,\n PColumnIdAndSpec,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n PTableColumnSpec,\n PTableHandle,\n PTableShape,\n PTableVector,\n TableRange,\n UniqueValuesRequest,\n UniqueValuesResponse,\n PFrameDriver as SdkPFrameDriver,\n PColumn,\n PFrameDef,\n JoinEntry,\n PTableDef,\n ValueType,\n PTableRecordSingleValueFilterV2,\n PTableRecordFilter,\n PColumnValues,\n DataInfo,\n PColumnValue,\n} from '@platforma-sdk/model';\nimport {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n mapDataInfo,\n isDataInfo,\n ensureError,\n PFrameDriverError,\n isAbortError,\n isPFrameDriverError,\n} from '@platforma-sdk/model';\nimport { LRUCache } from 'lru-cache';\nimport type { PollResource } from './ref_count_pool';\nimport { RefCountResourcePool } from './ref_count_pool';\nimport { allBlobs, makeDataInfoFromPColumnValues, mapBlobs, parseDataInfoResource } from './data';\nimport { createHash } from 'node:crypto';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { assertNever, emptyDir, ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport { PFrame } from '@milaboratories/pframes-rs-node';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { getDebugFlags } from '../debug';\n\ntype PColumnDataUniversal = PlTreeNodeAccessor | DataInfo<PlTreeNodeAccessor> | PColumnValues;\n\nfunction blobKey(res: ResourceInfo): string {\n return String(res.id);\n}\n\ntype InternalPFrameData = PFrameDef<DataInfo<ResourceInfo>>;\n\nconst valueTypes: ValueType[] = ['Int', 'Long', 'Float', 'Double', 'String', 'Bytes'] as const;\n\nfunction migrateFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === 'bySingleColumn') {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: 'bySingleColumnV2',\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n console.warn(\n `type overriten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filtersV2;\n}\n\nfunction migratePTableFilters<T>(\n def: Omit<PTableDef<T>, 'partitionFilters'> | PTableDef<T>,\n): PTableDef<T> {\n if (!('partitionFilters' in def)) {\n // For old blocks assume all axes filters to be partition filters\n return {\n ...def,\n partitionFilters: migrateFilters(def.filters.filter((f) => f.column.type === 'axis')),\n filters: migrateFilters(def.filters.filter((f) => f.column.type === 'column')),\n };\n }\n return {\n ...def,\n partitionFilters: migrateFilters(def.partitionFilters),\n filters: migrateFilters(def.filters),\n };\n}\n\nconst bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toString() : v);\n\nclass PTableCache {\n private readonly perFrame = new Map<PFrameHandle, LRUCache<PTableHandle, PollResource<PTableHolder>>>();\n private readonly global: LRUCache<PTableHandle, PollResource<PTableHolder>>;\n private readonly disposeListeners = new Map<PTableHandle, () => void>();\n\n constructor(\n private readonly logger: MiLogger,\n private readonly ops: PFrameDriverOps,\n ) {\n this.global = new LRUCache<PTableHandle, PollResource<PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === 'evict') {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n const disposeListener = this.disposeListeners.get(key)!;\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener('abort', disposeListener);\n\n resource.unref();\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(`calculateTableData cache - removed PTable ${key}`);\n }\n },\n });\n }\n\n public cache(resource: PollResource<PTableHolder>, size: number): void {\n const key = resource.key as PTableHandle;\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(`calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size });\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PollResource<PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === 'evict') {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n };\n this.disposeListeners.set(key, disposeListener);\n resource.resource.disposeSignal.addEventListener('abort', disposeListener);\n }\n}\n\nclass PFrameHolder implements PFrameInternal.PFrameDataSource, AsyncDisposable {\n public readonly pFramePromise: Promise<PFrameInternal.PFrameV9>;\n private readonly abortController = new AbortController();\n private readonly blobIdToResource = new Map<string, ResourceInfo>();\n private readonly blobHandleComputables = new Map<\n string,\n ComputableStableDefined<LocalBlobHandleAndSize>\n >();\n\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly spillPath: string,\n columns: InternalPFrameData,\n ) {\n const logFunc: PFrameInternal.Logger = (level, message) => this.logger[level](message);\n\n for (const column of columns) {\n for (const blob of allBlobs(column.data)) {\n this.blobIdToResource.set(blobKey(blob), blob);\n }\n }\n const distinctСolumns = [\n ...new Map(columns.map((column) => ({\n ...column,\n data: mapBlobs(column.data, blobKey),\n })).map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ];\n\n try {\n const pFrame = new PFrame(this.spillPath, logFunc);\n pFrame.setDataSource(this);\n const promises: Promise<void>[] = [];\n for (const column of distinctСolumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.dispose();\n throw new PFrameDriverError(\n `PFrame creation failed asynchronously, columns: ${JSON.stringify(distinctСolumns)}, error: ${ensureError(err)}`,\n );\n });\n } catch (err: unknown) {\n throw new PFrameDriverError(\n `PFrame creation failed synchronously, columns: ${JSON.stringify(distinctСolumns)}, error: ${ensureError(err)}`,\n );\n }\n }\n\n private getOrCreateComputableForBlob(blobId: string) {\n let computable = this.blobHandleComputables.get(blobId);\n if (computable !== undefined) return computable;\n\n const blobResource = this.blobIdToResource.get(blobId);\n if (blobResource === undefined) throw new PFrameDriverError(`Blob with id ${blobId} not found.`);\n\n // precalculation of value tree will trigger the download proecess right away\n computable = this.blobDriver.getDownloadedBlob(blobResource).withPreCalculatedValueTree();\n\n this.blobHandleComputables.set(blobId, computable);\n\n return computable;\n }\n\n public readonly preloadBlob = async (blobIds: string[]): Promise<void> => {\n const computables = blobIds.map((blobId) => this.getOrCreateComputableForBlob(blobId));\n for (const computable of computables) {\n try {\n await computable.awaitStableFullValue(this.disposeSignal);\n } catch (err: unknown) {\n if (isAbortError(err)) {\n break; // silence abort errors\n }\n throw err;\n }\n }\n };\n\n public readonly resolveBlobContent = async (blobId: string): Promise<Uint8Array> => {\n const computable = this.getOrCreateComputableForBlob(blobId);\n const path = this.blobDriver.getLocalPath((await computable.awaitStableValue(this.disposeSignal)).handle);\n return await fsp.readFile(path);\n };\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n for (const computable of this.blobHandleComputables.values()) computable.resetState();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.dispose();\n await this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => { /* mute error */ });\n }\n}\n\nclass PTableHolder implements AsyncDisposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV6>,\n public readonly predecessor?: PollResource<PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([pFrameDisposeSignal, this.abortController.signal]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.abortController.abort();\n await this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => { /* mute error */ });\n this.predecessor?.unref();\n }\n}\n\ntype FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport type PFrameDriverOps = {\n // Concurrency limits for `getUniqueValues` and `calculateTableData` requests\n pFrameConcurrency: number;\n // Concurrency limits for `getShape` and `getData` requests\n pTableConcurrency: number;\n // Maximum number of `calculateTableData` results cached for each PFrame\n pFrameCacheMaxCount: number;\n // Maximum size of `calculateTableData` results cached for PFrames overall.\n // The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n // Also each table has predeccessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n pFramesCacheMaxSize: number;\n};\n\n/**\n * Extends public and safe SDK's driver API with methods used internally in the middle\n * layer and in tests.\n */\nexport interface InternalPFrameDriver extends SdkPFrameDriver {\n /**\n * Dump active PFrames allocations in pprof format.\n * The result of this function should be saved as `profile.pb.gz`.\n * Use {@link https://pprof.me/} or {@link https://www.speedscope.app/}\n * to view the allocation flamechart.\n * @warning This method will always reject on Windows!\n */\n pprofDump(): Promise<Uint8Array>;\n\n /** Create a new PFrame */\n createPFrame(\n def: PFrameDef<PColumnDataUniversal>,\n ctx: ComputableCtx,\n ): PFrameHandle;\n\n /** Create a new PTable */\n createPTable(\n def: PTableDef<PColumn<PColumnDataUniversal>>,\n ctx: ComputableCtx,\n ): PTableHandle;\n\n /** Calculates data for the table and returns complete data representation of it */\n calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal\n ): Promise<CalculateTableDataResponse>;\n\n /** Calculate set of unique values for a specific axis for the filtered set of records */\n getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal\n ): Promise<UniqueValuesResponse>;\n\n /** Unified table shape */\n getShape(\n handle: PTableHandle,\n signal?: AbortSignal,\n ): Promise<PTableShape>;\n\n /**\n * Retrieve the data from the table. To retrieve only data required, it can be\n * sliced both horizontally ({@link columnIndices}) and vertically\n * ({@link range}).\n *\n * @param columnIndices unified indices of columns to be retrieved\n * @param range optionally limit the range of records to retrieve\n * */\n getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]>;\n}\n\nexport class PFrameDriver implements InternalPFrameDriver {\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>;\n private readonly pTables: RefCountResourcePool<FullPTableDef, PTableHolder>;\n private readonly pTableCache: PTableCache;\n private readonly frameConcurrencyLimiter: ConcurrencyLimitingExecutor;\n private readonly tableConcurrencyLimiter: ConcurrencyLimitingExecutor;\n\n public async pprofDump(): Promise<Uint8Array> {\n return await PFrame.pprofDump();\n }\n\n public static async init(\n blobDriver: DownloadDriver,\n logger: MiLogger,\n spillPath: string,\n ops: PFrameDriverOps,\n ): Promise<PFrameDriver> {\n const resolvedSpillPath = path.resolve(spillPath);\n await emptyDir(resolvedSpillPath);\n return new PFrameDriver(blobDriver, logger, resolvedSpillPath, ops);\n }\n\n private constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly spillPath: string,\n ops: PFrameDriverOps,\n ) {\n const concurrencyLimiter = new ConcurrencyLimitingExecutor(ops.pFrameConcurrency);\n this.frameConcurrencyLimiter = concurrencyLimiter;\n this.tableConcurrencyLimiter = new ConcurrencyLimitingExecutor(ops.pTableConcurrency);\n\n this.pTableCache = new PTableCache(this.logger, ops);\n\n this.pFrames = new (class extends RefCountResourcePool<InternalPFrameData, PFrameHolder> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n public acquire(params: InternalPFrameData): PollResource<PFrameHolder> {\n return super.acquire(params);\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) throw new PFrameDriverError(`PFrame not found, handle = ${key}`);\n return resource;\n }\n\n protected createNewResource(params: InternalPFrameData): PFrameHolder {\n if (getDebugFlags().logPFrameRequests)\n logger.info(\n `PFrame creation (pFrameHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n return new PFrameHolder(this.blobDriver, this.logger, this.spillPath, params);\n }\n\n protected calculateParamsKey(params: InternalPFrameData): string {\n try {\n return stableKeyFromPFrameData(params);\n } catch (err: unknown) {\n if (isPFrameDriverError(err)) throw err;\n throw new PFrameDriverError(`PFrame handle calculation failed, request: ${JSON.stringify(params, bigintReplacer)}, error: ${ensureError(err)}`);\n }\n }\n })(this.blobDriver, this.logger, this.spillPath);\n\n this.pTables = new (class extends RefCountResourcePool<\n FullPTableDef,\n PTableHolder\n > {\n constructor(\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>,\n ) {\n super();\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) throw new PFrameDriverError(`PTable not found, handle = ${key}`);\n return resource;\n }\n\n protected createNewResource(params: FullPTableDef): PTableHolder {\n if (getDebugFlags().logPFrameRequests) {\n logger.info(\n `PTable creation (pTableHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const handle = params.pFrameHandle;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\n\n // 3. Sort\n if (params.def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n sorting: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(params.def.sorting));\n return new PTableHolder(handle, disposeSignal, sortedTable, predecessor);\n }\n\n // 2. Filter\n if (params.def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n filters: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(params.def.filters));\n return new PTableHolder(handle, disposeSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) => pFrame.createTable({\n src: joinEntryToInternal(params.def.src),\n filters: params.def.partitionFilters,\n }));\n return new PTableHolder(handle, disposeSignal, table);\n }\n\n protected calculateParamsKey(params: FullPTableDef): string {\n try {\n return stableKeyFromFullPTableDef(params);\n } catch (err: unknown) {\n throw new PFrameDriverError(`PTable handle calculation failed, request: ${JSON.stringify(params)}, error: ${ensureError(err)}`);\n }\n }\n })(this.pFrames);\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(\n def: PFrameDef<PColumnDataUniversal>,\n ctx: ComputableCtx,\n ): PFrameHandle {\n const internalData = def\n .filter((c) => valueTypes.find((t) => t === c.spec.valueType))\n .map((c) =>\n mapPObjectData(c, (d) =>\n isPlTreeNodeAccessor(d)\n ? parseDataInfoResource(d)\n : isDataInfo(d)\n ? mapDataInfo(d, (a) => a.resourceInfo)\n : makeDataInfoFromPColumnValues(c.spec, d),\n ),\n );\n const res = this.pFrames.acquire(internalData);\n ctx.addOnDestroy(res.unref);\n return res.key as PFrameHandle;\n }\n\n public createPTable(\n rawDef: PTableDef<PColumn<PColumnDataUniversal>>,\n ctx: ComputableCtx,\n ): PTableHandle {\n const def = migratePTableFilters(rawDef);\n const pFrameHandle = this.createPFrame(extractAllColumns(def.src), ctx);\n const defIds = mapPTableDef(def, (c) => c.id);\n const res = this.pTables.acquire({ def: defIds, pFrameHandle });\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Create PTable call (pFrameHandle = ${pFrameHandle}; pTableHandle = ${JSON.stringify(res)}): ${JSON.stringify(\n mapPTableDef(def, (c) => c.spec),\n bigintReplacer,\n )}`,\n );\n ctx.addOnDestroy(res.unref); // in addition to pframe unref added in createPFrame above\n return res.key as PTableHandle;\n }\n\n //\n // PFrame istance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [{\n axesSpec: [\n ...new Map(request.compatibleWith.map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ],\n qualifications: [],\n }]\n : [],\n };\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n const responce = await pFrame.findColumns(iRequest);\n return {\n hits: responce.hits\n .filter((h) => // only exactly matching columns\n h.mappingVariants.length === 0\n || h.mappingVariants.some((v) =>\n v.qualifications.forHit.length === 0\n && v.qualifications.forQueries.every((q) => q.length === 0)))\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(handle: PFrameHandle, columnId: PObjectId): Promise<PColumnSpec> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.getColumnSpec(columnId);\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.listColumns();\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<CalculateTableDataResponse> {\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const table = this.pTables.acquire({\n pFrameHandle: handle,\n def: migratePTableFilters(request),\n });\n const { resource: { pTablePromise, disposeSignal } } = table;\n const pTable = await pTablePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.frameConcurrencyLimiter.run(async () => {\n try {\n const spec = pTable.getSpec();\n const data = await pTable.getData([...spec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const size = await pTable.getFootprint({\n withPredecessors: true,\n signal: combinedSignal,\n });\n this.pTableCache.cache(table, size);\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n } catch (err: unknown) {\n table.unref();\n throw err;\n }\n });\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal,\n ): Promise<UniqueValuesResponse> {\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrame.getUniqueValues({\n ...request,\n filters: migrateFilters(request.filters),\n }, {\n signal: combinedSignal,\n });\n });\n }\n\n //\n // PTable istance methods\n //\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const { pTablePromise } = this.pTables.getByKey(handle);\n const pTable = await pTablePromise;\n return pTable.getSpec();\n }\n\n public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {\n const { pTablePromise, disposeSignal } = this.pTables.getByKey(handle);\n const pTable = await pTablePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.tableConcurrencyLimiter.run(async () => {\n return await pTable.getShape({\n signal: combinedSignal,\n });\n });\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]> {\n const { pTablePromise, disposeSignal } = this.pTables.getByKey(handle);\n const pTable = await pTablePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.tableConcurrencyLimiter.run(async () => {\n return await pTable.getData(columnIndices, {\n range,\n signal: combinedSignal,\n });\n });\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV3 {\n switch (entry.type) {\n case 'column':\n return {\n type: 'column',\n columnId: entry.column,\n };\n case 'slicedColumn':\n return {\n type: 'slicedColumn',\n columnId: entry.column,\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case 'inlineColumn':\n return {\n type: 'inlineColumn',\n newId: entry.column.id,\n spec: entry.column.spec,\n dataInfo: {\n type: 'Json',\n keyLength: entry.column.spec.axesSpec.length,\n data: entry.column.data.reduce((acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n }, {} as Record<string, PColumnValue>),\n },\n };\n case 'inner':\n case 'full':\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case 'outer':\n return {\n type: 'outer',\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction stableKeyFromFullPTableDef(data: FullPTableDef): string {\n const hash = createHash('sha256');\n hash.update(canonicalize(data)!);\n return hash.digest().toString('hex');\n}\n\nfunction stableKeyFromPFrameData(data: PColumn<DataInfo<ResourceInfo>>[]): string {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case 'Json':\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case 'JsonPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: blobKey(info),\n })),\n };\n break;\n case 'BinaryPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [blobKey(info.index), blobKey(info.values)] as const,\n })),\n };\n break;\n default:\n throw new PFrameDriverError(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);\n }\n result.payload.sort((lhs, rhs) => lhs.key.localeCompare(rhs.key));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => lhs.id.localeCompare(rhs.id));\n\n const hash = createHash('sha256');\n hash.update(canonicalize(orderedData)!);\n return hash.digest().toString('hex');\n}\n","import type { PlClient } from '@milaboratories/pl-client';\nimport type {\n InternalLsDriver } from '@milaboratories/pl-drivers';\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from '@milaboratories/pl-drivers';\nimport type * as Sdk from '@milaboratories/pl-model-common';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { InternalPFrameDriver } from '../pool';\nimport { PFrameDriver } from '../pool';\nimport type {\n DriverKitOps,\n DriverKitOpsConstructor,\n} from './ops';\nimport {\n DefaultDriverKitOpsPaths,\n DefaultDriverKitOpsSettings,\n} from './ops';\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit {\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const pFrameDriver = await PFrameDriver.init(\n blobDriver,\n ops.logger,\n ops.pframesSpillPath,\n ops.pFrameDriverOps,\n );\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n return {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n };\n}\n","import { extractCodeWithInfo, type BlockConfig, type PlRef } from '@platforma-sdk/model';\nimport { LRUCache } from 'lru-cache';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { executeSingleLambda } from '../js_render';\nimport type { ResourceId } from '@milaboratories/pl-client';\n\ntype EnrichmentTargetsRequest = {\n blockConfig: () => BlockConfig;\n args: () => unknown;\n};\n\ntype EnrichmentTargetsValue = {\n value: PlRef[] | undefined;\n};\n\nexport class ProjectHelper {\n private readonly enrichmentTargetsCache = new LRUCache<string, EnrichmentTargetsValue, EnrichmentTargetsRequest>({\n max: 256,\n memoMethod: (_key, _value, { context }) => {\n return { value: this.calculateEnrichmentTargets(context) };\n },\n });\n\n constructor(private readonly quickJs: QuickJSWASMModule) {}\n\n private calculateEnrichmentTargets(req: EnrichmentTargetsRequest): PlRef[] | undefined {\n const blockConfig = req.blockConfig();\n if (blockConfig.enrichmentTargets === undefined) return undefined;\n const args = req.args();\n const result = executeSingleLambda(this.quickJs, blockConfig.enrichmentTargets, extractCodeWithInfo(blockConfig)!, args) as PlRef[];\n return result;\n }\n\n public getEnrichmentTargets(blockConfig: () => BlockConfig, args: () => unknown, key?: { argsRid: ResourceId; blockPackRid: ResourceId }): PlRef[] | undefined {\n const req = { blockConfig, args };\n if (key === undefined)\n return this.calculateEnrichmentTargets(req);\n const cacheKey = `${key.argsRid}:${key.blockPackRid}`;\n return this.enrichmentTargetsCache.memo(cacheKey, { context: req }).value;\n }\n}\n","import type {\n PlClient,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n field,\n isNullResourceId,\n toGlobalResourceId,\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProjectAuthored } from '../mutator/project';\nimport type { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { BlockEventDispatcher } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport type {\n MiddleLayerOps,\n MiddleLayerOpsConstructor,\n} from './ops';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectListEntry } from '../model';\nimport type { AuthorMarker, ProjectMeta } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { getQuickJS } from 'quickjs-emscripten';\nimport type { MiddleLayerDriverKit } from './driver_kit';\nimport { initDriverKit } from './driver_kit';\nimport type { DriverKit, SupportedRequirement } from '@platforma-sdk/model';\nimport { RuntimeCapabilities } from '@platforma-sdk/model';\nimport type { DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport type { Dispatcher } from 'undici';\nimport { RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\nimport { ProjectHelper } from '../model/project_helper';\n\nexport interface MiddleLayerEnvironment {\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(requirement: SupportedRequirement, value: number | boolean = true): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {\n prj.setMeta(meta);\n });\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx('MLRemoveProject', async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx('Project id to resource id', async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error('Unexpected project list structure.');\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === 'string') return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them. */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.retryHttpDispatcher.destroy();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement('requiresModelAPIVersion', 1);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher: retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n","import type { ValueOrError } from '@milaboratories/ts-helpers';\nimport { setTimeout } from 'node:timers/promises';\nimport { request } from 'undici';\nimport type { Dispatcher } from 'undici';\nimport type { CheckNetworkOpts } from './network_check';\nimport { UnauthenticatedPlClient, type PlClientConfig } from '@milaboratories/pl-client';\n\n/** A report about one concrete ping to the service. */\nexport interface NetworkReport<T> {\n elapsedMs: number;\n response: ValueOrError<T>;\n}\n\nexport type HttpNetworkReport = NetworkReport<{\n statusCode: number;\n beginningOfBody: string;\n}>;\n\nexport async function backendPings(ops: CheckNetworkOpts, plConfig: PlClientConfig): Promise<NetworkReport<string>[]> {\n return await recordPings(ops.pingCheckDurationMs, ops.maxPingsPerSecond, async () => {\n const uaClient = new UnauthenticatedPlClient(plConfig);\n const response = await uaClient.ping();\n return JSON.stringify(response).slice(0, ops.bodyLimit) + '...';\n });\n}\n\nexport async function blockRegistryOverviewPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () =>\n await requestUrl(new URL(ops.blockOverviewPath, ops.blockRegistryUrl), ops, httpClient),\n );\n}\n\nexport async function blockGARegistryOverviewPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockOverviewPath, ops.blockGARegistryUrl), ops, httpClient),\n );\n}\n\nexport async function blockRegistryUiPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockRegistryUrl), ops, httpClient),\n );\n}\n\nexport async function blockGARegistryUiPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockGARegistryUrl), ops, httpClient),\n );\n}\n\nexport async function autoUpdateCdnPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.autoUpdateCdnDurationMs,\n ops.maxAutoUpdateCdnChecksPerSecond,\n async () => await requestUrl(ops.autoUpdateCdnUrl, ops, httpClient),\n );\n}\n\n/** Executes a body several times per second up to the given duration,\n * and returns results and elapsed time for every result. */\nexport async function recordPings<T>(\n pingCheckDurationMs: number,\n maxPingsPerSecond: number,\n body: () => Promise<T>,\n): Promise<NetworkReport<T>[]> {\n const startPings = Date.now();\n const reports: NetworkReport<T>[] = [];\n\n while (elapsed(startPings) < pingCheckDurationMs) {\n const startPing = Date.now();\n let response: ValueOrError<T>;\n try {\n response = { ok: true, value: await body() };\n } catch (e) {\n response = { ok: false, error: e };\n }\n const elapsedPing = elapsed(startPing);\n\n reports.push({\n elapsedMs: elapsedPing,\n response,\n });\n\n const sleepBetweenPings = 1000 / maxPingsPerSecond - elapsedPing;\n\n if (sleepBetweenPings > 0) {\n await setTimeout(sleepBetweenPings);\n }\n }\n\n return reports;\n}\n\nexport async function requestUrl(url: string | URL, ops: CheckNetworkOpts, httpClient: Dispatcher) {\n const { body: rawBody, statusCode } = await request(url, {\n dispatcher: httpClient,\n headersTimeout: ops.httpTimeoutMs,\n bodyTimeout: ops.httpTimeoutMs,\n });\n const body = await rawBody.text();\n\n return {\n statusCode: statusCode,\n beginningOfBody: body.slice(0, ops.bodyLimit) + '...',\n };\n}\n\nexport function elapsed(startMs: number): number {\n return Date.now() - startMs;\n}\n\nexport function reportToString<T>(report: NetworkReport<T>[]): {\n ok: boolean;\n details: string;\n} {\n const successes = report.filter((r) => r.response.ok);\n const errorsLen = report.length - successes.length;\n const { mean: mean, median: median } = elapsedStat(report);\n\n const details = `\n total: ${report.length};\n successes: ${successes.length};\n errors: ${errorsLen};\n mean in ms: ${mean};\n median in ms: ${median};\n `;\n\n return {\n ok: errorsLen === 0,\n details,\n };\n}\n\nfunction elapsedStat(reports: { elapsedMs: number }[]) {\n const checks = reports.map((p) => p.elapsedMs).sort();\n const mean = checks.reduce((sum, p) => sum + p) / checks.length;\n\n let median = undefined;\n if (checks.length > 0) {\n const mid = Math.floor(checks.length / 2);\n median = checks.length % 2 ? checks[mid] : (checks[mid - 1] + checks[mid]) / 2;\n }\n\n return { mean, median };\n}\n","import type { FieldId, FieldRef, PlClient, ResourceData } from '@milaboratories/pl-client';\nimport { type PlTransaction, ContinuePolling, field, isNotNullResourceId, isNullResourceId, Pl, poll, toGlobalFieldId } from '@milaboratories/pl-client';\nimport { createRenderTemplate } from '../mutator/template/render_template';\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\nimport type { TemplateSpecAny } from '../model/template_spec';\nimport { loadTemplate, prepareTemplateSpec } from '../mutator/template/template_loading';\nimport type { ClientDownload, LsDriver } from '@milaboratories/pl-drivers';\nimport { ImportFileHandleUploadData, isSignMatch, isUpload, uploadBlob, type ClientUpload, type LsEntryWithAdditionalInfo } from '@milaboratories/pl-drivers';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { notEmpty, type MiLogger } from '@milaboratories/ts-helpers';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\nimport { text } from 'node:stream/consumers';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { StorageEntry } from '@milaboratories/pl-model-common';\n\nexport interface TemplateReport {\n status: 'ok' | 'warn' | 'failed';\n message: string;\n}\n\n/** Uploads `hello-world` template and checks the output is correct. */\nexport async function uploadTemplate(logger: MiLogger, pl: PlClient, name: string): Promise<TemplateReport> {\n try {\n const gotGreeting = await runUploadTemplate(logger, pl, name);\n if (gotGreeting !== `Hello, ${name}`) {\n return { status: 'failed', message: `Template uploading failed: expected: ${name}, got: ${gotGreeting}` };\n }\n\n return { status: 'ok', message: `Template uploading succeeded: ${gotGreeting}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `Template uploading failed: error occurred: ${e}` };\n }\n}\n\nexport async function runUploadTemplate(\n logger: MiLogger,\n pl: PlClient,\n name: string,\n): Promise<string> {\n const outputs = await runTemplate(\n pl,\n SdkTemplates['check_network.upload_template'],\n true,\n (tx) => ({\n name: tx.createValue(Pl.JsonObject, JSON.stringify(name)),\n }),\n ['greeting'],\n );\n\n try {\n return JSON.parse(notEmpty((await getFieldValue(pl, outputs.greeting)).data?.toString()));\n } finally {\n if (outputs != undefined) {\n await deleteFields(pl, Object.values(outputs));\n }\n }\n}\n\n/** Uploads a file to the backend and checks the output is a Blob resource. */\nexport async function uploadFile(\n logger: MiLogger,\n signer: Signer,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n pl: PlClient,\n filePath: string,\n): Promise<TemplateReport> {\n try {\n const gotBlob = await runUploadFile(logger, signer, lsDriver, uploadClient, pl, filePath);\n\n if (gotBlob.type.name !== 'Blob') {\n return { status: 'failed', message: `File uploading failed: ${gotBlob.type.name}` };\n }\n\n return { status: 'ok', message: `File uploading succeeded: ${gotBlob.type.name}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `File uploading failed: error occurred: ${e}` };\n }\n}\n\nexport async function runUploadFile(\n logger: MiLogger,\n signer: Signer,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n pl: PlClient,\n filePath: string,\n): Promise<ResourceInfo> {\n const handle = await lsDriver.getLocalFileHandle(filePath);\n const result = await runTemplate(\n pl,\n SdkTemplates['check_network.upload_blob'],\n true,\n (tx) => ({\n file: tx.createValue(Pl.JsonObject, JSON.stringify(handle)),\n }),\n ['progress', 'file'],\n );\n\n try {\n const progress = await getFieldValue(pl, result.progress);\n\n if (isUpload(progress)) {\n const uploadData = ImportFileHandleUploadData.parse(JSON.parse(notEmpty(progress.data?.toString())));\n const isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);\n\n if (isUploadSignMatch) {\n await uploadBlob(\n logger,\n uploadClient,\n progress,\n uploadData,\n () => false,\n {\n nPartsWithThisUploadSpeed: 10,\n nPartsToIncreaseUpload: 10,\n currentSpeed: 10,\n maxSpeed: 10,\n },\n );\n }\n }\n\n return await getFieldValue(pl, result.file);\n } finally {\n await deleteFields(pl, Object.values(result));\n }\n}\n\n/** Uploads a file to the backend and then tries to download it back. */\nexport async function downloadFile(\n logger: MiLogger,\n pl: PlClient,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n downloadClient: ClientDownload,\n filePath: string,\n fileContent: string,\n): Promise<TemplateReport> {\n try {\n const gotFileContent = await runDownloadFile(logger, pl, lsDriver, uploadClient, downloadClient, filePath);\n\n if (gotFileContent !== fileContent) {\n return { status: 'failed', message: `File downloading failed: expected: ${fileContent}, got: ${gotFileContent}` };\n }\n return { status: 'ok', message: `File downloading succeeded: ${gotFileContent}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `File downloading failed: error occurred: ${e}` };\n }\n}\n\nexport async function runDownloadFile(\n logger: MiLogger,\n pl: PlClient,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n downloadClient: ClientDownload,\n filePath: string,\n) {\n const handle = await lsDriver.getLocalFileHandle(filePath);\n\n const outputs = await runTemplate(\n pl,\n SdkTemplates['check_network.download_blob'],\n true,\n (tx) => ({ file: tx.createValue(Pl.JsonObject, JSON.stringify(handle)) }),\n ['progress', 'file'],\n );\n\n try {\n const progress = await getFieldValue(pl, outputs.progress);\n\n await uploadBlob(\n logger,\n uploadClient,\n progress,\n ImportFileHandleUploadData.parse(JSON.parse(notEmpty(progress.data?.toString()))),\n () => false,\n {\n nPartsWithThisUploadSpeed: 1,\n nPartsToIncreaseUpload: 1,\n currentSpeed: 1,\n maxSpeed: 1,\n },\n );\n\n const fileInfo = await getFieldValue(pl, outputs.file);\n const { content } = await downloadClient.downloadBlob(fileInfo);\n\n return await text(content);\n } finally {\n await deleteFields(pl, Object.values(outputs));\n }\n}\n\n/** Runs Go's hello-world binary. */\nexport async function softwareCheck(pl: PlClient): Promise<TemplateReport> {\n try {\n const gotGreeting = await runSoftware(pl);\n\n if (gotGreeting !== 'Hello from go binary\\n') {\n return { status: 'failed', message: `Software check failed: got: ${gotGreeting}` };\n }\n return { status: 'ok', message: `Software check succeeded: ${gotGreeting}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `Software check failed: error occurred: ${e}` };\n }\n}\n\nexport async function runSoftware(pl: PlClient): Promise<string> {\n const result = await runTemplate(\n pl,\n SdkTemplates['check_network.run_hello_world'],\n true,\n (_: PlTransaction) => ({}),\n ['greeting'],\n );\n\n try {\n return notEmpty((await getFieldValue(pl, result.greeting)).data?.toString());\n } finally {\n await deleteFields(pl, Object.values(result));\n }\n}\n\n/** Runs Python hello-world. */\nexport async function pythonSoftware(pl: PlClient, name: string): Promise<TemplateReport> {\n try {\n const gotGreeting = await runPythonSoftware(pl, name);\n\n if (gotGreeting !== `Hello, ${name}!\\n`) {\n return { status: 'failed', message: `Python software check failed: got: ${gotGreeting}` };\n }\n return { status: 'ok', message: `Python software check succeeded: ${gotGreeting}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `Python software check failed: error occurred: ${e}` };\n }\n}\n\nexport async function runPythonSoftware(pl: PlClient, name: string): Promise<string> {\n const result = await runTemplate(\n pl,\n SdkTemplates['check_network.run_hello_world_py'],\n true,\n (tx) => ({ name: tx.createValue(Pl.JsonObject, JSON.stringify(name)) }),\n ['greeting'],\n );\n\n try {\n return notEmpty((await getFieldValue(pl, result.greeting)).data?.toString());\n } finally {\n await deleteFields(pl, Object.values(result));\n }\n}\n\n/** Tries to download a file from every storage. */\nexport async function downloadFromEveryStorage(\n logger: MiLogger,\n pl: PlClient,\n lsDriver: LsDriver,\n ops: {\n minLsRequests: number;\n bytesLimit: number;\n minFileSize: number;\n maxFileSize: number;\n nFilesToCheck: number;\n },\n): Promise<Record<string, TemplateReport>> {\n try {\n const storages = await lsDriver.getStorageList();\n const results: Record<string, TemplateReport> = {};\n\n for (const storage of storages) {\n const result = await chooseFile(lsDriver, storage, ops.nFilesToCheck, ops.minFileSize, ops.maxFileSize, ops.minLsRequests);\n if (result.file === undefined) {\n results[storage.name] = {\n status: 'warn',\n message: `No file between ${ops.minFileSize} and ${ops.maxFileSize} bytes `\n + `found in storage ${storage.name}, checked ${result.nCheckedFiles} files, `\n + `did ${result.nLsRequests} ls requests`,\n };\n continue;\n }\n\n logger.info(`Downloading file ${JSON.stringify(result)} from storage ${storage.name}`);\n const outputs = await runTemplate(\n pl,\n SdkTemplates['check_network.create_workdir_from_storage'],\n true,\n (tx) => ({ file: tx.createValue(Pl.JsonObject, JSON.stringify((result.file as { handle: string }).handle)) }),\n ['workdirTypeName'],\n );\n\n try {\n const workdirTypeName = JSON.parse(Buffer.from((await getFieldValue(pl, outputs.workdirTypeName)).data!).toString()) as string;\n\n if (workdirTypeName?.startsWith('WorkingDirectory')) {\n results[storage.name] = {\n status: 'ok',\n message: `Workdir creation succeeded, size of file: ${result.file?.size}, `\n + `checked ${result.nCheckedFiles} files, did ${result.nLsRequests} ls requests`,\n };\n } else {\n results[storage.name] = {\n status: 'failed',\n message: `Workdir creation failed: ${workdirTypeName}, size of file: ${result.file?.size}, `\n + `checked ${result.nCheckedFiles} files, did ${result.nLsRequests} ls requests`,\n };\n }\n } finally {\n await deleteFields(pl, Object.values(outputs));\n }\n }\n\n return results;\n } catch (e: unknown) {\n return { unknown: { status: 'failed', message: `Download from every storage failed: error occurred: ${e}` } };\n }\n}\n\n/** Chooses a random file from the storage in a size range.\n * If we couldn't find a normal-sized file, we'll return a small file to check at least something.\n */\nexport async function chooseFile(\n lsDriver: LsDriver,\n storage: StorageEntry,\n limit: number,\n minSize: number,\n maxSize: number,\n minLsRequests: number,\n): Promise<{\n file: LsEntryWithAdditionalInfo | undefined;\n nLsRequests: number;\n nCheckedFiles: number;\n }> {\n const files = listFilesSequence(lsDriver, storage, '', 0);\n\n // return small file in case we don't have many normal-sized files.\n // While we'll download only a small range of bytes from the file,\n // we don't want to return a big file in case the underlying S3 doesn't support range requests.\n let smallFile: LsEntryWithAdditionalInfo | undefined;\n let nCheckedFiles = 0;\n let maxNLsRequests = 0;\n\n for await (const { file, nLsRequests } of files) {\n maxNLsRequests = Math.max(maxNLsRequests, nLsRequests);\n\n if (nCheckedFiles >= limit && maxNLsRequests > minLsRequests) {\n // we reached a limit on both the number of files and the number of ls requests.\n return { file: smallFile, nLsRequests: maxNLsRequests, nCheckedFiles };\n }\n nCheckedFiles++;\n if (minSize <= file.size && file.size <= maxSize) {\n return { file, nLsRequests: maxNLsRequests, nCheckedFiles };\n } else if (file.size < minSize) {\n smallFile = file;\n }\n }\n\n return { file: smallFile, nLsRequests: maxNLsRequests, nCheckedFiles };\n}\n\n/** Deep-first search for files in the storage. */\nexport async function* listFilesSequence(\n lsDriver: LsDriver,\n storage: StorageEntry,\n parent: string,\n nLsRequests: number,\n): AsyncGenerator<{ file: LsEntryWithAdditionalInfo; nLsRequests: number }, void, unknown> {\n nLsRequests++;\n const files = await lsDriver.listRemoteFilesWithAdditionalInfo(storage.handle, parent);\n\n for (const file of files.entries) {\n if (file.type === 'file' && file.fullPath.startsWith(parent)) {\n yield {\n file,\n nLsRequests,\n };\n } else if (file.type === 'dir') {\n for await (const nestedFile of listFilesSequence(lsDriver, storage, file.fullPath, nLsRequests)) {\n nLsRequests = Math.max(nestedFile.nLsRequests, nLsRequests);\n yield nestedFile;\n }\n }\n }\n}\n\n/** Creates a big temporary file with random content. */\nexport async function createBigTempFile(): Promise<{ filePath: string }> {\n const filePath = path.join(os.tmpdir(), `check-network-big-temp-${Date.now()}.bin`);\n const fileSize = 20 * 1024 * 1024; // 20 MiB\n\n const fileContent = randomBytes(fileSize);\n\n await fs.appendFile(filePath, fileContent);\n\n return { filePath };\n}\n\n/** Creates a temporarly file we could use for uploading and downloading. */\nexport async function createTempFile(): Promise<{ filePath: string; fileContent: string }> {\n const filePath = path.join(os.tmpdir(), `check-network-temp-${Date.now()}.txt`);\n\n const fileContent = 'Hello, world! ' + new Date().toISOString();\n await fs.writeFile(filePath, fileContent);\n\n return { filePath, fileContent };\n}\n\n/** Creates a template and RenderTemplate resources, gets all resources from outputs.\n * Throws a error if any of the outputs failed.\n */\nasync function runTemplate(\n client: PlClient,\n tpl: TemplateSpecAny,\n ephemeral: boolean,\n inputs: (tx: PlTransaction) => Pl.PlRecord,\n outputs: string[],\n): Promise<Record<string, FieldId>> {\n return await client.withWriteTx('TemplateRender', async (tx) => {\n const preparedTemplate = await prepareTemplateSpec(tpl);\n const tplResource = loadTemplate(tx, preparedTemplate);\n\n const outputFields: Record<string, FieldRef> = createRenderTemplate(\n tx, tplResource, ephemeral, inputs(tx), outputs,\n );\n\n const outputsIds: Record<string, FieldId> = {};\n\n for (const output of outputs) {\n const fieldRef = field(client.clientRoot, output);\n tx.createField(fieldRef, 'Dynamic', outputFields[output]);\n outputsIds[output] = await toGlobalFieldId(fieldRef);\n }\n\n await tx.commit();\n\n return outputsIds;\n });\n}\n\n/** Gets a resource from field's value or throws a error. */\nasync function getFieldValue(\n client: PlClient,\n fieldId: FieldId,\n): Promise<ResourceData> {\n // We could also do polling with pl-tree, but it seemed like an overkill,\n // that's why we have a simple polling here.\n\n return await poll(client, async (tx) => {\n const field = await tx.tx.getField(fieldId);\n if (isNotNullResourceId(field.error)) {\n const err = await tx.tx.getResourceData(field.error, true);\n throw new Error(`getFieldValue of \"${fieldId.fieldName}\" field failed: ${err.data}`);\n }\n\n if (isNullResourceId(field.value)) {\n throw new ContinuePolling();\n }\n\n return await tx.tx.getResourceData(field.value, true);\n });\n}\n\nasync function deleteFields(client: PlClient, fieldIds: FieldId[]) {\n await client.withWriteTx('DeleteFields', async (tx) => {\n for (const fieldId of fieldIds) {\n tx.resetField(fieldId);\n }\n await tx.commit();\n });\n}\n","/** A utility to check network problems and gather statistics.\n * It's useful when we cannot connect to the server of a company\n * because of security reasons,\n * but they can send us and their DevOps team this report.\n *\n * What we check:\n * - pings to backend\n * - block registry for block overview and ui.\n * - autoupdate CDN.\n * - upload workflow to backend (workflow part via our API).\n * - the desktop could do multipart upload.\n * - the desktop could download files from S3.\n * - backend could download software and run it.\n * - backend could run python software.\n * - try to get something from every storage to work storage.\n *\n * We don't check backend access to S3 storage, it is checked on the start of backend.\n */\n\nimport type { AuthInformation, PlClientConfig } from '@milaboratories/pl-client';\nimport { PlClient, UnauthenticatedPlClient, plAddressToConfig } from '@milaboratories/pl-client';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { ConsoleLoggerAdapter, HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport { channel } from 'node:diagnostics_channel';\nimport type { ClientDownload, ClientUpload } from '@milaboratories/pl-drivers';\nimport { LsDriver, createDownloadClient, createUploadBlobClient } from '@milaboratories/pl-drivers';\nimport type { HttpNetworkReport, NetworkReport } from './pings';\nimport { autoUpdateCdnPings, backendPings, blockGARegistryOverviewPings, blockGARegistryUiPings, blockRegistryOverviewPings, blockRegistryUiPings, reportToString } from './pings';\nimport type { Dispatcher } from 'undici';\nimport type { TemplateReport } from './template';\nimport { uploadTemplate, uploadFile, downloadFile, createTempFile, pythonSoftware, softwareCheck, createBigTempFile, downloadFromEveryStorage } from './template';\nimport { randomUUID } from 'node:crypto';\n\n/** All reports we need to collect. */\ninterface NetworkReports {\n plPings: NetworkReport<string>[];\n\n blockRegistryOverviewChecks: HttpNetworkReport[];\n blockGARegistryOverviewChecks: HttpNetworkReport[];\n blockRegistryUiChecks: HttpNetworkReport[];\n blockGARegistryUiChecks: HttpNetworkReport[];\n\n autoUpdateCdnChecks: HttpNetworkReport[];\n\n uploadTemplateCheck: TemplateReport;\n uploadFileCheck: TemplateReport;\n downloadFileCheck: TemplateReport;\n softwareCheck: TemplateReport;\n pythonSoftwareCheck: TemplateReport;\n storageToDownloadReport: Record<string, TemplateReport>;\n}\n\nexport interface CheckNetworkOpts {\n /** Platforma Backend pings options. */\n pingCheckDurationMs: number;\n pingTimeoutMs: number;\n maxPingsPerSecond: number;\n\n /** An options for CDN and block registry. */\n httpTimeoutMs: number;\n\n /** Block registry pings options. */\n blockRegistryDurationMs: number;\n maxRegistryChecksPerSecond: number;\n blockRegistryUrl: string;\n blockGARegistryUrl: string;\n blockOverviewPath: string;\n blockUiPath: string;\n\n /** CDN for auto-update pings options. */\n autoUpdateCdnDurationMs: number;\n maxAutoUpdateCdnChecksPerSecond: number;\n autoUpdateCdnUrl: string;\n\n /** Body limit for requests. */\n bodyLimit: number;\n\n /** Limit for the size of files to download from every storage. */\n everyStorageBytesLimit: number;\n /** Minimal size of files to create a directory from for every storage. */\n everyStorageMinFileSize: number;\n /** Maximal size of files to create a directory from for every storage. */\n everyStorageMaxFileSize: number;\n /** How many files to check from every storage. */\n everyStorageNFilesToCheck: number;\n /** Minimal number of ls requests for every storage. */\n everyStorageMinLsRequests: number;\n}\n\n/** Checks connectivity to Platforma Backend, to block registry\n * and to auto-update CDN,\n * and generates a string report. */\nexport async function checkNetwork(\n plCredentials: string,\n plUser: string | undefined,\n plPassword: string | undefined,\n optsOverrides: Partial<CheckNetworkOpts> = {},\n): Promise<string> {\n const undiciLogs: any[] = [];\n // Subscribe to all Undici diagnostic events\n undiciEvents.forEach((event) => {\n const diagnosticChannel = channel(event);\n diagnosticChannel.subscribe((message: any) => {\n const timestamp = new Date().toISOString();\n const data = { ...message };\n if (data?.response?.headers) {\n data.response = { ...data.response };\n data.response.headers = data.response.headers.slice();\n data.response.headers = data.response.headers.map((h: any) => h.toString());\n }\n\n // we try to upload big files, don't include the buffer in the report.\n if (data?.request?.body) {\n data.request = { ...data.request };\n data.request.body = `too big`;\n }\n\n undiciLogs.push(\n JSON.stringify({\n timestamp,\n event,\n data,\n }),\n );\n });\n });\n\n try {\n const {\n logger,\n plConfig,\n client,\n signer,\n downloadClient,\n uploadBlobClient,\n lsDriver,\n httpClient,\n ops,\n } = await initNetworkCheck(plCredentials, plUser, plPassword, optsOverrides);\n\n const { filePath: filePathToDownload, fileContent: fileContentToDownload } = await createTempFile();\n const { filePath: filePathToUpload } = await createBigTempFile();\n\n const report: NetworkReports = {\n plPings: await backendPings(ops, plConfig),\n blockRegistryOverviewChecks: await blockRegistryOverviewPings(ops, httpClient),\n blockGARegistryOverviewChecks: await blockGARegistryOverviewPings(ops, httpClient),\n blockRegistryUiChecks: await blockRegistryUiPings(ops, httpClient),\n blockGARegistryUiChecks: await blockGARegistryUiPings(ops, httpClient),\n\n autoUpdateCdnChecks: await autoUpdateCdnPings(ops, httpClient),\n\n uploadTemplateCheck: await uploadTemplate(logger, client, 'Jack'),\n uploadFileCheck: await uploadFile(logger, signer, lsDriver, uploadBlobClient, client, filePathToUpload),\n downloadFileCheck: await downloadFile(logger, client, lsDriver, uploadBlobClient, downloadClient, filePathToDownload, fileContentToDownload),\n softwareCheck: await softwareCheck(client),\n pythonSoftwareCheck: await pythonSoftware(client, 'Jack'),\n storageToDownloadReport: await downloadFromEveryStorage(\n logger,\n client,\n lsDriver,\n {\n minLsRequests: ops.everyStorageMinLsRequests,\n bytesLimit: ops.everyStorageBytesLimit,\n minFileSize: ops.everyStorageMinFileSize,\n maxFileSize: ops.everyStorageMaxFileSize,\n nFilesToCheck: ops.everyStorageNFilesToCheck,\n },\n ),\n };\n\n return reportsToString(report, plCredentials, ops, undiciLogs);\n } catch (e) {\n return `Unhandled error while checking the network: ${e}`;\n }\n}\n\nexport async function initNetworkCheck(\n plCredentials: string,\n plUser: string | undefined,\n plPassword: string | undefined,\n optsOverrides: Partial<CheckNetworkOpts> = {},\n): Promise<{\n logger: MiLogger;\n plConfig: PlClientConfig;\n signer: Signer;\n client: PlClient;\n downloadClient: ClientDownload;\n uploadBlobClient: ClientUpload;\n lsDriver: LsDriver;\n httpClient: Dispatcher;\n ops: CheckNetworkOpts;\n terminate: () => Promise<void>;\n }> {\n const ops: CheckNetworkOpts = {\n pingCheckDurationMs: 10000,\n pingTimeoutMs: 3000,\n maxPingsPerSecond: 50,\n\n httpTimeoutMs: 3000,\n\n blockRegistryDurationMs: 3000,\n maxRegistryChecksPerSecond: 1,\n\n blockRegistryUrl: 'https://blocks.pl-open.science',\n blockGARegistryUrl: 'https://blocks-ga.pl-open.science',\n blockOverviewPath: 'v2/overview.json',\n blockUiPath: 'v2/milaboratories/samples-and-data/1.7.0/ui.tgz',\n\n autoUpdateCdnDurationMs: 5000,\n maxAutoUpdateCdnChecksPerSecond: 1,\n autoUpdateCdnUrl:\n 'https://cdn.platforma.bio/software/platforma-desktop-v2/windows/amd64/latest.yml',\n\n bodyLimit: 300,\n\n everyStorageBytesLimit: 1024,\n everyStorageMinFileSize: 1024,\n everyStorageMaxFileSize: 200 * 1024 * 1024, // 200 MB\n everyStorageNFilesToCheck: 300,\n everyStorageMinLsRequests: 50,\n ...optsOverrides,\n };\n\n const plConfig = plAddressToConfig(plCredentials, {\n defaultRequestTimeout: ops.pingTimeoutMs,\n });\n\n // exposing alternative root for fields not to interfere with\n // projects of the user.\n plConfig.alternativeRoot = `check_network_${randomUUID()}`;\n\n const uaClient = new UnauthenticatedPlClient(plConfig);\n\n let auth: AuthInformation = {};\n if (plUser && plPassword) {\n auth = await uaClient.login(plUser, plPassword);\n }\n\n const client = await PlClient.init(plCredentials, { authInformation: auth });\n\n const httpClient = uaClient.ll.httpDispatcher;\n const logger = new ConsoleLoggerAdapter();\n\n // FIXME: do we need to get an actual secret?\n const signer = new HmacSha256Signer('localSecret');\n\n // We could initialize middle-layer here, but for now it seems like an overkill.\n // Here's the code to do it:\n //\n // const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'platforma-network-check-'));\n // const ml = await MiddleLayer.init(client, tmpDir, {\n // logger,\n // localSecret: '',\n // localProjections: [],\n // openFileDialogCallback: () => Promise.resolve([]),\n // preferredUpdateChannel: 'stable',\n // });\n\n const downloadClient = createDownloadClient(logger, client, []);\n const uploadBlobClient = createUploadBlobClient(client, logger);\n\n const lsDriver = await LsDriver.init(\n logger,\n client,\n signer,\n [],\n () => Promise.resolve([]),\n [],\n );\n\n const terminate = async () => {\n downloadClient.close();\n uploadBlobClient.close();\n await httpClient.close();\n await client.close();\n };\n\n return {\n logger,\n plConfig,\n client,\n signer,\n downloadClient,\n uploadBlobClient,\n lsDriver,\n httpClient,\n ops,\n terminate,\n };\n}\n\nfunction reportsToString(\n report: NetworkReports,\n plEndpoint: string,\n opts: CheckNetworkOpts,\n undiciLogs: any[],\n): string {\n const successPings = report.plPings.filter((p) => p.response.ok);\n const failedPings = report.plPings.filter((p) => !p.response.ok);\n const successPingsBodies = [\n ...new Set(successPings.map((p) => JSON.stringify((p.response as any).value))),\n ];\n\n const summary = (ok: boolean) => ok ? 'OK' : 'FAILED';\n const templateSummary = (report: TemplateReport) => report.status === 'ok' ? 'OK' : report.status === 'warn' ? 'WARN' : 'FAILED';\n\n const pings = reportToString(report.plPings);\n const blockRegistryOverview = reportToString(report.blockRegistryOverviewChecks);\n const blockGARegistryOverview = reportToString(report.blockGARegistryOverviewChecks);\n const blockRegistryUi = reportToString(report.blockRegistryUiChecks);\n const blockGARegistryUi = reportToString(report.blockGARegistryUiChecks);\n const autoUpdateCdn = reportToString(report.autoUpdateCdnChecks);\n\n const storagesSummary = Object.entries(report.storageToDownloadReport)\n .map(([storage, report]) => `${templateSummary(report)} ${storage} storage check`).join('\\n');\n\n return `\n${summary(pings.ok)} pings to Platforma Backend\n${summary(blockRegistryOverview.ok)} block registry overview\n${summary(blockGARegistryOverview.ok)} block ga registry overview\n${summary(blockRegistryUi.ok)} block registry ui\n${summary(blockGARegistryUi.ok)} block ga registry ui\n${summary(autoUpdateCdn.ok)} auto-update CDN\n${templateSummary(report.uploadTemplateCheck)} upload template\n${templateSummary(report.uploadFileCheck)} upload file\n${templateSummary(report.downloadFileCheck)} download file\n${templateSummary(report.softwareCheck)} software check\n${templateSummary(report.pythonSoftwareCheck)} python software check\n${storagesSummary}\n\ndetails:\npl endpoint: ${plEndpoint};\noptions: ${JSON.stringify(opts, null, 2)}.\n\nUpload template response: ${report.uploadTemplateCheck.message}\n\nUpload file response: ${report.uploadFileCheck.message}\n\nDownload file response: ${report.downloadFileCheck.message}\n\nSoftware check response: ${report.softwareCheck.message}\nPython software check response: ${report.pythonSoftwareCheck.message}\nStorage to download responses: ${JSON.stringify(report.storageToDownloadReport, null, 2)}\n\nPlatforma pings: ${pings.details}\n\nBlock registry overview responses: ${blockRegistryOverview.details}\n\nBlock ga registry overview responses: ${blockGARegistryOverview.details}\n\nBlock registry ui responses: ${blockRegistryUi.details}\n\nBlock ga registry ui responses: ${blockGARegistryUi.details}\n\nAuto-update CDN responses: ${autoUpdateCdn.details}\n\ndumps:\nBlock registry overview dumps:\n${JSON.stringify(report.blockRegistryOverviewChecks, null, 2)}\n\nBlock ga registry overview dumps:\n${JSON.stringify(report.blockGARegistryOverviewChecks, null, 2)}\n\nBlock registry ui dumps:\n${JSON.stringify(report.blockRegistryUiChecks, null, 2)}\n\nBlock ga registry ui dumps:\n${JSON.stringify(report.blockGARegistryUiChecks, null, 2)}\n\nAuto-update CDN dumps:\n${JSON.stringify(report.autoUpdateCdnChecks, null, 2)}\n\nPlatforma pings error dumps:\n${JSON.stringify(failedPings, null, 2)}\n\nPlatforma pings success dump examples:\n${JSON.stringify(successPingsBodies, null, 2)}\n\nUndici logs:\n${undiciLogs.join('\\n')}\n`;\n}\n\n// List of Undici diagnostic channels\nconst undiciEvents: string[] = [\n 'undici:request:create', // When a new request is created\n 'undici:request:bodySent', // When the request body is sent\n 'undici:request:headers', // When request headers are sent\n 'undici:request:error', // When a request encounters an error\n 'undici:request:trailers', // When a response completes.\n\n 'undici:client:sendHeaders',\n 'undici:client:beforeConnect',\n 'undici:client:connected',\n 'undici:client:connectError',\n\n 'undici:socket:close', // When a socket is closed\n 'undici:socket:connect', // When a socket connects\n 'undici:socket:error', // When a socket encounters an error\n\n 'undici:pool:request', // When a request is added to the pool\n 'undici:pool:connect', // When a pool creates a new connection\n 'undici:pool:disconnect', // When a pool connection is closed\n 'undici:pool:destroy', // When a pool is destroyed\n 'undici:dispatcher:request', // When a dispatcher processes a request\n 'undici:dispatcher:connect', // When a dispatcher connects\n 'undici:dispatcher:disconnect', // When a dispatcher disconnects\n 'undici:dispatcher:retry', // When a dispatcher retries a request\n];\n"],"names":["tryStat","path","fsp","error","LegacyDevBlockPackMetaYaml","RegistryV1","LegacyDevBlockPackMetaJson","LegacyDevBlockPackTemplate","LegacyDevBlockPackConfig","LegacyDevBlockPackFrontendFolder","CanonicalBlockConfigRequest","CanonicalBlockUiRequestPackageJson","LegacyDevBlockPackFiles","isLegacyDevPackage","packageRoot","mustResolve","root","request","res","tryResolve","resolveDevPacket","ignoreErrors","workflow","config","uiPackageJson","getFileContent","fs","getFileStat","getDevV1PacketMtime","devPath","mtime","f","fullPath","stat","getDevV2PacketMtime","description","wfStats","modelStats","BlockPackRegistry","v2Provider","registries","http","regEntry","result","regSpec","httpOptions","overview","overviewEntry","organization","pkg","latestMeta","latestVersion","id","latestOverview","AnyChannel","StableChannel","e","entry","legacyYamlContent","YAML","actualDevPath","v2Description","tryLoadPackDescription","bpSubfolder","BlockPackMetaEmbedAbsoluteBytes","assertNever","blockPacks","regSpecs","registryId","blockId","channel","_a","reg","V2RegistryProvider","__publicField","url","fromCache","newRegistry","RegistryV2Reader","folderReaderByUrl","CentralBlockRegistry","V1CentralRegistry","V1CentralDevSnapshotRegistry","InitialBlockStructure","InitialProjectRenderingState","InitialBlockMeta","ProjectResourceType","SchemaVersionKey","SchemaVersionCurrent","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","BlockArgsAuthorKeyPrefix","blockArgsAuthorKey","ProjectStructureAuthorKey","ServiceTemplateCacheFieldPrefix","getServiceTemplateField","hash","FieldsToDuplicate","projectFieldName","fieldName","projectFieldPattern","parseProjectField","name","match","ProjectsField","ProjectsResourceType","ProjectsListTreePruningFunction","resource","resourceTypesEqual","createProjectList","pl","rid","openedProjects","env","tree","SynchronizedTreeState","Computable","ctx","node","oProjects","field","prj","meta","notEmpty","created","lastModified","p","EphRenderTemplate","RenderTemplate","createRenderTemplate","tx","tpl","ephemeral","inputs","outputNames","rId","tplField","inputsField","Pl","BContextEnd","BContext","BContextId","BContextMultiParentPrefix","HeavyBlockOutputNames","createRenderHeavyBlock","createBContextEnd","createBContextFromUpstreams","upstreamCtxs","randomUUID","i","createTemplateV3Tree","tplData","resourceCache","createResourceCached","renderer","hashToSource","key","createHash","rKey","TemplateRenderer","LibRenderer","sources","PlTemplateLibV1","getSourceCode","_creator","SoftwareInfoRenderer","PlTemplateSoftwareV1","sw","ref","PlTemplateV1","srt","entries","a","b","libId","lib","swId","tplId","tplRef","fld","depTplId","depTpl","overrideRef","PlTemplateOverrideV1","sourceHash","loadTemplateFromExplicitDirect","spec","templateInfo","parseTemplate","templateFormat","createTemplateV2Tree","loadTemplateFromPrepared","templateData","createResource","hasher","TengoTemplateGet","TengoTemplateGetRegistry","TengoTemplateGetTemplateURI","TengoTemplateGetTemplate","TengoTemplatePack","TengoTemplatePackConvert","TengoTemplatePackConvertTemplatePack","TengoTemplatePackConvertTemplate","prepareTemplateSpec","loadTemplateFromRegistry","getTemplate","registry","uri","templateFromRegistry","loadTemplate","FrontendFromUrlResourceType","FrontendFromFolderResourceType","createFrontend","WorkerManager","workerPath","worker","Worker","data","resolve","reject","msg","type","args","BlockPackCustomType","BlockPackTemplateField","BlockPackFrontendField","tSlash","str","bufferToString","buffer","bufferToJson","BlockPackPreparer","v2RegistryProvider","signer","LRUCache","value","devPaths","configContent","loadPackDescription","urlPrefix","configResponse","components","_stack","explicit","workerManager","__using","_","_error","_hasError","_promise","__callDispose","templateContent","frontendPath","workflowContent","source","templateUrl","templateResponse","getModel","getWorkflow","model","createCustomBlockPack","blockPackInfo","bp","createBlockPack","outputRef","requireEnrichments","isBlockOutputReference","obj","addAllReferencedBlocks","allowed","child","inferAllReferencedBlocks","allBlocks","structure","g","BlockGraph","nodes","direction","rootBlockIds","all","r","cb","unprocessed","queued","nextUnprocessed","info","v","stagingGraph","previous","current","productionGraph","infoProvider","resultMap","resultGraph","allAbove","references","potentialUpstreams","upstreams","pId","transitiveUpstream","enrichmentTargets","t","dep","setsEqual","intersects","graphDiff","onlyInA","onlyInB","different","fromA","fromB","preparedTemplateEnvelop","getPreparedExportTemplateEnvelope","preparedTemplate","SdkTemplates","exportContext","exportTpl","flags","getDebugFlags","cached","modIdCb","valueCb","initialized","lastModId","currentModId","BlockInfo","fields","cachedDeserialize","bin","NoNewBlocks","ProjectMutator","author","schema","struct","renderingState","blocksInLimbo","blockInfos","ctxExportTplHolder","projectHelper","blockInfo","initialBlockSettings","InitialBlockSettings","prod","bInfo","argsField","blockPackField","isResourceId","content","block","state","fid","status","fieldNames","deleted","_b","_c","requests","changedArgs","somethingChanged","req","blockChanged","stateKey","statePart","gzipped","canonicalJsonBytes","binary","isGzipped","canonicalJsonGzBytes","statePartRef","newValue","upstream","upstreamContexts","results","extractConfig","diff","setA","setB","x","originalBlockInfo","fieldNamesToDuplicate","fieldState","newStructure","newBlockInitializer","currentStagingGraph","currentActualProductionGraph","newStagingGraph","stagingDiff","newActualProductionGraph","prodDiff","before","newStruct","done","group","idx","originalBlockId","newBlockId","after","originalBlock","newBlock","newArgsAndUiState","blockIds","addUpstreams","blockIdsSet","prodGraph","rendered","render","renderedArray","activeProdGraph","queue","Denque","stopped","downstream","lags","lag","upstreamLag","stagingRenderingRate","elapsed","lagThreshold","_d","markerStr","fullResourceStateP","schemaP","lastModifiedP","metaP","structureP","renderingStateP","fullResourceState","blockInfoStates","projectField","isNullResourceId","blockFieldRequests","fName","isResource","isResourceRef","stagingRefreshTimestamp","UiError","blockPackRequests","response","isNotNullResourceId","refField","ensureResourceIdNotNull","bpInfo","ctxExportTplEnvelope","ctxExportTplCacheFieldName","ctxExportTplField","blocksInLimboSet","blockConfig","blockPack","blockInStruct","createProject","ts","withProject","txOrPl","withProjectAuthored","PlClient","mut","allBlobs","blob","index","values","mapValues","callback","mapBlobs","mapping","PColumnDataJsonPartitioned","resourceType","PColumnDataJsonSuperPartitioned","PColumnDataBinaryPartitioned","PColumnDataBinarySuperPartitioned","PColumnDataJson","parseDataInfoResource","resourceData","dataContent","parts","superKey","superPart","keys","partKey","part","superData","resourceTypeToString","makeDataInfoFromPColumnValues","keyLength","jsonData","val","deriveLegacyPObjectId","canonicalize","deriveGlobalPObjectId","exportName","deriveLocalPObjectId","resolvePath","outputName","parseRawPObjectCollection","errorOnUnknownField","ignoreFieldErrors","prefix","entryPattern","locked","parseFinalPObjectCollection","rawCollection","assert","collection","ResultPool","blocks","allSpecsAvailable","outer","_f","_e","mapValueInVOE","resultWithErrors","isComplete","instabilityMarker","markUnstable","marker","tryAddEntry","exportsProcessed","predicate","found","exportsChecked","addToFound","executePSpecPredicate","prjEntry","rootBlockId","targetBlocks","loadCtx","staging","calculated","ctxAccessor","constructBlockContextArgsOnly","projectEntry","cCtx","cachedDecode","constructBlockContext","traverseCfg","cfg","guide","mapRecord","mapper","ifNotUndef","isActiveCfg","hasActiveCfgComponents","nested","resOp","SRMakeObject","k","SRFlatten","SRGetResourceField","mapArrayToRecord","elements","length","SRMapArrayValues1","ops","SRCollectArrayFromArgs","renderCfg","SRMapRecordValues1","nextArgs","newCtx","SRMapRecordValues2","SRIsEmpty","arg","SRNot","operand","SRAnd","operand1","operand2","SROr","SRResourceValueAsJson","SRGetJsonField","SRMapResourceFields1","SRMapResourceFields2","SRGetBlobContent","range","drivers","SRGetBlobContentAsString","resourceInfo","SRGetBlobContentAsJson","c","SRGetDownloadedBlobContent","SRGetOnDemandBlobContent","SRExtractArchiveAndGetURL","format","SRGetImportProgress","SRGetLastLogs","lines","SRGetProgressLog","patternToSearch","SRGetProgressLogWithInfo","SRGetLogHandle","ctxValue","computableFromCfgUnsafe","NonKeyCtxFields","toCfgContext","uiState","ReturnOpKey","ReturnArgKey","ReturnDestination","isReturnDestination","destination","zeroStack","execute","stack","operations","allowComputables","operationQueue","deliverResult","pending","computables","mainLoop","op","action","newOpKey","argRequests","initialArgCounter","operation","computableFromCfg","bCtx","resolvedOps","mc","postEnv","copyOfPendingSubrotines","copiedStack","bytesToBase64","ComputableContextHelper","parent","blockCtx","featureFlags","computableCtx","wellKnownAccessor","ctxKey","lambda","handle","commonOptions","steps","resolveSteps","acc","accResult","mapPObjectData","d","hPrefix","computable","fHandle","nLines","specs","def","mapPTableDef","isDataInfo","mapDataInfo","message","accessor","nextHandle","configCtx","vm","Scope","localScope","exportCtxFunction","fn","withCachedError","newErr","fnh","checkBlockFlag","activeArgs","step","stepHandle","isArrayBufferOrView","JsExecutionContext","scope","deadlineSetter","computableEnv","ErrorRepository","json","code","err","cbName","targetCallback","manage","simpleHandle","text","strHandle","JsRenderInternal","errorId","quickJSError","errors","stringifyWithResourceId","cause","causeName","PlQuickJSError","logOutputStatus","renderedResult","stable","recalculationCounter","unstableMarker","computableFromRF","fh","codeWithInfo","configKey","keepVmAlive","runtime","deadlineSettings","rCtx","s","toBeResolved","importedResult","resolved","executeSingleLambda","quickJs","isActive","isConfigLambda","computableFromCfgOrRF","cfgOrFh","getBlockPackInfo","bpAcc","argsEquals","clean","R","projectOverview","navigationStates","infos","cInputs","currentArguments","rInputs","prodArgs","currentGraph","limbo","defaultLabel","renderingMode","gNode","calculationStatus","sections","title","inputsValid","sdkVersion","isIncompatibleWithRuntime","bpId","blockCtxArgsOnly","extractCodeWithInfo","settings","updates","resourceIdToString","cantRun","staleBlocks","stale","u","canRun","bb","kernel","frontendRes","frontendUrlComputable","frontendData","frontendEntry","blockArgsAndUiState","deepFreeze","blockOutputs","outputs","cellId","cellCfg","computableOutput","activeConfigs","ret","activeOutputConfigs","NavigationStates","ChangeSource","DefaultNavigationState","projectOverviewLight","SchemaVersionV1","BlockFrontendStateKeyPrefixV1","applyProjectMigrations","schemaVersion","migrateV1ToV2","allKV","kvMap","kv","kvKey","valueJson","uiStateR","uiStateF","stringifyForDump","object","Project","projectTree","setTimeout","overviewLight","existingBlocks","isNotFoundError","isTimeoutOrCancelError","blockLabel","blockPackSpec","preparedBp","blockCfgContainer","blockCfg","resetArgs","currentStructure","currentGroup","bpHolderRid","bpRid","bpData","newOutputs","shouldStillUseStringErrors","convertErrorsToStrings","fd","projectTreePruning","stats","treeDumpStats","isVersionGreater","targetVersion","version","target","DefaultDriverKitOpsSettings","ConsoleLoggerAdapter","DefaultDriverKitOpsPaths","workDir","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","SEMVER_SPEC_VERSION","MAX_LENGTH","MAX_SAFE_INTEGER","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","constants","debug_1","require$$0","debug","require$$1","exports","module","re","safeRe","src","safeSrc","LETTERDASHNUMBER","safeRegexReplacements","makeSafeRegex","token","max","createToken","isGlobal","safe","looseOption","emptyOpts","parseOptions_1","options","numeric","compareIdentifiers","anum","bnum","identifiers","require$$2","parseOptions","require$$3","require$$4","SemVer","m","num","other","release","identifier","identifierBase","base","prerelease","semver","parse_1","throwErrors","er","parse","valid_1","clean_1","inc_1","diff_1","version1","version2","v1","v2","comparison","v1Higher","highVersion","lowVersion","highHasPre","major_1","loose","minor_1","patch_1","prerelease_1","parsed","compare_1","compare","rcompare_1","compareLoose_1","compareBuild_1","versionA","versionB","compareBuild","sort_1","list","rsort_1","gt_1","lt_1","eq_1","neq_1","gte_1","lte_1","eq","neq","gt","gte","lt","lte","require$$5","cmp_1","coerce_1","coerceRtlRegex","next","major","minor","patch","build","firstKey","lrucache","SPACE_CHARACTERS","Range","Comparator","first","isNullSet","isAny","comps","memoKey","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","cache","hr","hyphenReplace","comparatorTrimReplace","tildeTrimReplace","caretTrimReplace","rangeList","comp","parseComparator","replaceGTE0","rangeMap","comparators","thisComparators","isSatisfiable","rangeComparators","thisComparator","rangeComparator","testSet","LRU","require$$6","remainingComparators","testComparator","otherComparator","replaceCarets","replaceTildes","replaceXRanges","replaceStars","isX","replaceTilde","M","pr","replaceCaret","z","replaceXRange","gtlt","xM","xm","xp","anyX","incPr","$0","from","fM","fm","fp","fpr","fb","to","tM","tm","tp","tpr","set","ANY","cmp","comparator","satisfies_1","toComparators_1","maxSatisfying_1","versions","maxSV","rangeObj","minSatisfying_1","min","minSV","minVersion_1","minver","setMin","compver","valid","satisfies","require$$7","outside_1","hilo","gtfn","ltefn","ltfn","ecomp","high","low","outside","gtr_1","ltr_1","intersects_1","r1","r2","simplify","prev","ranges","simplified","original","subset","sub","dom","sawNonNull","OUTER","simpleSub","simpleDom","isSub","simpleSubset","minimumVersionWithPreRelease","minimumVersion","eqSet","higherGT","lowerLT","gtltComp","higher","lower","hasDomLT","hasDomGT","needDomLTPre","needDomGTPre","subset_1","internalRe","inc","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","rcompare","require$$14","compareLoose","require$$15","require$$16","sort","require$$17","rsort","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","coerce","require$$26","require$$27","require$$28","require$$29","toComparators","require$$30","maxSatisfying","require$$31","minSatisfying","require$$32","minVersion","require$$33","validRange","require$$34","require$$35","gtr","require$$36","ltr","require$$37","require$$38","simplifyRange","require$$39","require$$40","DefaultBlockUpdateWatcherOps","NoUpdatesKey","BlockUpdateWatcher","PollComputablePool","registryProvider","logger","cSpec","versionLock","skipVersion","blockPackIdToString","vSuggestions","vMainSuggestion","suggestions","update","mainSuggestion","res1","res2","RefCountResourcePool","envelop","isDisposable","isAsyncDisposable","params","unrefereced","blobKey","valueTypes","migrateFilters","filters","filtersV1","filtersV2","filter","filtersV1Json","migratePTableFilters","bigintReplacer","PTableCache","reason","disposeListener","size","perFrame","_resource","PFrameHolder","blobDriver","spillPath","columns","blobIds","blobId","isAbortError","logFunc","level","column","distinctСolumns","item","pFrame","PFrame","promises","PFrameDriverError","ensureError","blobResource","PTableHolder","pFrameDisposeSignal","pTablePromise","predecessor","pTable","PFrameDriver","concurrencyLimiter","ConcurrencyLimitingExecutor","stableKeyFromPFrameData","isPFrameDriverError","pFrames","pFramePromise","disposeSignal","sortedTable","filteredTable","table","joinEntryToInternal","stableKeyFromFullPTableDef","resolvedSpillPath","emptyDir","internalData","isPlTreeNodeAccessor","rawDef","pFrameHandle","extractAllColumns","defIds","iRequest","h","q","columnId","signal","combinedSignal","columnIndices","row","col","orderedData","lhs","rhs","initDriverKit","workdir","frontendDownloadPath","_ops","HmacSha256Signer","downloadClient","createDownloadClient","logsClient","createLogsClient","uploadBlobClient","createUploadBlobClient","uploadProgressClient","createUploadProgressClient","DownloadDriver","blobToURLDriver","DownloadBlobToURLDriver","uploadDriver","UploadDriver","logsStreamDriver","LogsStreamDriver","logDriver","LogsDriver","lsDriver","LsDriver","pFrameDriver","frontendDownloadDriver","DownloadUrlDriver","ProjectHelper","_key","_value","context","cacheKey","MiddleLayer","driverKit","projectListResourceId","openedProjectsList","projectListTree","blockRegistryProvider","projectList","requirement","toGlobalResourceId","projects","projectsField","projectsFieldData","retryHttpDispatcher","RetryAgent","bpPreparer","getQuickJS","runtimeCapabilities","RuntimeCapabilities","BlockEventDispatcher","WatchableValue","projectListTC","backendPings","plConfig","recordPings","UnauthenticatedPlClient","blockRegistryOverviewPings","httpClient","requestUrl","blockGARegistryOverviewPings","blockRegistryUiPings","blockGARegistryUiPings","autoUpdateCdnPings","pingCheckDurationMs","maxPingsPerSecond","body","startPings","reports","startPing","elapsedPing","sleepBetweenPings","rawBody","statusCode","startMs","reportToString","report","successes","errorsLen","mean","median","elapsedStat","details","checks","sum","mid","uploadTemplate","gotGreeting","runUploadTemplate","runTemplate","getFieldValue","deleteFields","uploadFile","uploadClient","filePath","gotBlob","runUploadFile","progress","isUpload","uploadData","ImportFileHandleUploadData","isSignMatch","uploadBlob","downloadFile","fileContent","gotFileContent","runDownloadFile","fileInfo","softwareCheck","runSoftware","pythonSoftware","runPythonSoftware","downloadFromEveryStorage","storages","storage","chooseFile","workdirTypeName","limit","minSize","maxSize","minLsRequests","files","listFilesSequence","smallFile","nCheckedFiles","maxNLsRequests","file","nLsRequests","nestedFile","createBigTempFile","os","fileSize","randomBytes","createTempFile","client","tplResource","outputFields","outputsIds","output","fieldRef","toGlobalFieldId","fieldId","poll","ContinuePolling","fieldIds","checkNetwork","plCredentials","plUser","plPassword","optsOverrides","undiciLogs","undiciEvents","event","timestamp","initNetworkCheck","filePathToDownload","fileContentToDownload","filePathToUpload","reportsToString","plAddressToConfig","uaClient","auth","plEndpoint","opts","successPings","failedPings","successPingsBodies","summary","ok","templateSummary","pings","blockRegistryOverview","blockGARegistryOverview","blockRegistryUi","blockGARegistryUi","autoUpdateCdn","storagesSummary"],"mappings":"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","x_google_ignoreList":[45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/dev_env/util.ts","../src/dev_env/index.ts","../src/block_registry/registry.ts","../src/block_registry/registry-v2-provider.ts","../src/block_registry/well_known_registries.ts","../src/model/project_model.ts","../src/middle_layer/project_list.ts","../src/mutator/template/render_template.ts","../src/mutator/template/render_block.ts","../src/mutator/template/direct_template_loader_v3.ts","../src/mutator/template/direct_template_loader.ts","../src/mutator/template/template_loading.ts","../src/model/block_pack_spec.ts","../src/mutator/block-pack/frontend.ts","../src/worker/WorkerManager.ts","../src/mutator/block-pack/block_pack.ts","../src/model/args.ts","../src/model/project_model_util.ts","../src/mutator/context_export.ts","../src/debug/index.ts","../src/mutator/project.ts","../src/pool/data.ts","../src/pool/p_object_collection.ts","../src/pool/result_pool.ts","../src/middle_layer/block_ctx.ts","../src/cfg_render/traverse.ts","../src/cfg_render/util.ts","../src/cfg_render/renderer.ts","../src/middle_layer/block_ctx_unsafe.ts","../src/cfg_render/executor.ts","../src/js_render/computable_context.ts","../src/js_render/context.ts","../src/js_render/index.ts","../src/middle_layer/render.ts","../src/middle_layer/util.ts","../src/middle_layer/project_overview.ts","../src/middle_layer/frontend_path.ts","../src/middle_layer/block.ts","../src/middle_layer/active_cfg.ts","../src/middle_layer/navigation_states.ts","../src/middle_layer/project_overview_light.ts","../src/model/project_model_v1.ts","../src/mutator/migration.ts","../src/middle_layer/project.ts","../src/middle_layer/ops.ts","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/constants.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/debug.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/re.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/parse-options.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/identifiers.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/classes/semver.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/parse.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/valid.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/clean.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/inc.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/diff.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/major.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/minor.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/patch.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/prerelease.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/compare.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/rcompare.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/compare-loose.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/compare-build.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/sort.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/rsort.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/gt.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/lt.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/eq.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/neq.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/gte.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/lte.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/cmp.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/coerce.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/lrucache.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/classes/range.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/classes/comparator.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/functions/satisfies.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/to-comparators.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/max-satisfying.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/min-satisfying.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/min-version.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/valid.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/outside.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/gtr.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/ltr.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/intersects.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/simplify.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/subset.js","../../../../node_modules/.pnpm/semver@7.7.2/node_modules/semver/index.js","../src/block_registry/watcher.ts","../src/pool/ref_count_pool.ts","../src/pool/driver.ts","../src/middle_layer/driver_kit.ts","../src/model/project_helper.ts","../src/middle_layer/middle_layer.ts","../src/network_check/pings.ts","../src/network_check/template.ts","../src/network_check/network_check.ts"],"sourcesContent":["import type { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n","import { RegistryV1 } from '@platforma-sdk/block-tools';\nimport path from 'node:path';\nimport { tryStat } from './util';\nimport { tryResolve } from '@milaboratories/resolve-helper';\n\nexport const LegacyDevBlockPackMetaYaml = [RegistryV1.PlPackageYamlConfigFile];\nexport const LegacyDevBlockPackMetaJson = [RegistryV1.PlPackageJsonConfigFile];\nexport const LegacyDevBlockPackTemplate = ['backend', 'dist', 'tengo', 'tpl', 'main.plj.gz'];\nexport const LegacyDevBlockPackConfig = ['config', 'dist', 'config.json'];\nexport const LegacyDevBlockPackFrontendFolder = ['frontend', 'dist'];\n\nexport const CanonicalBlockWorkflowRequest = 'block-workflow/dist/tengo/tpl/main.plj.gz';\nexport const CanonicalBlockConfigRequest = 'block-model/dist/config.json';\nexport const CanonicalBlockUiRequestPackageJson = 'block-ui/package.json';\n\nexport const LegacyDevBlockPackFiles = [\n LegacyDevBlockPackTemplate,\n LegacyDevBlockPackConfig,\n LegacyDevBlockPackMetaYaml,\n LegacyDevBlockPackMetaJson,\n LegacyDevBlockPackFrontendFolder,\n];\n\nexport type DevPacketPaths = {\n /** main.plj.gz */\n readonly workflow: string;\n /** config.json */\n readonly config: string;\n /** ui dist folder */\n readonly ui: string;\n};\n\nexport async function isLegacyDevPackage(packageRoot: string): Promise<boolean> {\n return (\n (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackConfig))) !== undefined\n || (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackTemplate))) !== undefined\n );\n}\n\nfunction mustResolve(root: string, request: string): string {\n const res = tryResolve(root, request);\n if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);\n return res;\n}\n\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: true\n): Promise<DevPacketPaths | undefined>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: false\n): Promise<DevPacketPaths>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: boolean,\n): Promise<DevPacketPaths | undefined> {\n if (!path.isAbsolute(packageRoot)) packageRoot = path.resolve(packageRoot);\n if (await isLegacyDevPackage(packageRoot))\n return {\n workflow: path.join(packageRoot, ...LegacyDevBlockPackTemplate),\n config: path.join(packageRoot, ...LegacyDevBlockPackConfig),\n ui: path.join(packageRoot, ...LegacyDevBlockPackFrontendFolder),\n };\n if (ignoreErrors) {\n const workflow = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (workflow === undefined) return undefined;\n const config = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (config === undefined) return undefined;\n const uiPackageJson = tryResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n if (uiPackageJson === undefined) return undefined;\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n } else {\n const workflow = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const config = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const uiPackageJson = mustResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n }\n}\n","import type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type {\n BlockPackDescriptionAbsolute } from '@platforma-sdk/block-tools';\nimport {\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1,\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: latestMeta['title'] ?? 'No title',\n description: latestMeta['description'] ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks())\n .map((e) => ({ ...e, registryId: regEntry.id }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV',\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n","import { folderReaderByUrl, RegistryV2Reader } from '@platforma-sdk/block-tools';\nimport type { Dispatcher } from 'undici';\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n","import type { RegistrySpec } from '@milaboratories/pl-model-middle-layer';\n\nexport const CentralBlockRegistry: RegistrySpec = {\n type: 'remote-v2',\n url: 'https://blocks.pl-open.science/',\n};\n\nexport const V1CentralRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/releases',\n};\n\nexport const V1CentralDevSnapshotRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/dev',\n};\n","import type { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project',\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const SchemaVersionCurrent = '2';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockArgsAuthorKeyPrefix = 'BlockArgsAuthor/';\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = 'ProjectStructureAuthor';\n\nexport const ServiceTemplateCacheFieldPrefix = '__serviceTemplate_';\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | 'blockPack'\n | 'blockSettings'\n | 'uiState'\n | 'prodArgs'\n | 'currentArgs'\n | 'prodCtx'\n | 'prodUiCtx'\n | 'prodOutput'\n | 'prodCtxPrevious'\n | 'prodUiCtxPrevious'\n | 'prodOutputPrevious'\n | 'stagingCtx'\n | 'stagingUiCtx'\n | 'stagingOutput'\n | 'stagingCtxPrevious'\n | 'stagingUiCtxPrevious'\n | 'stagingOutputPrevious';\n}\n\nexport const FieldsToDuplicate: Set<ProjectField['fieldName']> = new Set([\n 'blockPack',\n 'blockSettings',\n 'uiState',\n 'prodArgs',\n 'currentArgs',\n 'prodCtx',\n 'prodUiCtx',\n 'prodOutput',\n]);\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern\n = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|uiState|prodArgs|currentArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n","import type { PruningFunction } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport type { PlClient, ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport { resourceTypesEqual } from '@milaboratories/pl-client';\nimport type { TreeAndComputableU } from './types';\nimport type { WatchableValue } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type {\n ProjectListEntry } from '../model/project_model';\nimport {\n ProjectCreatedTimestamp,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n} from '../model/project_model';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport type { ProjectMeta } from '@milaboratories/pl-model-middle-layer';\n\nexport const ProjectsField = 'projects';\nexport const ProjectsResourceType: ResourceType = { name: 'Projects', version: '1' };\n\nexport const ProjectsListTreePruningFunction: PruningFunction = (resource) => {\n if (!resourceTypesEqual(resource.type, ProjectsResourceType)) return [];\n return resource.fields;\n};\n\nexport async function createProjectList(\n pl: PlClient,\n rid: ResourceId,\n openedProjects: WatchableValue<ResourceId[]>,\n env: MiddleLayerEnvironment,\n): Promise<TreeAndComputableU<ProjectListEntry[]>> {\n const tree = await SynchronizedTreeState.init(\n pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: ProjectsListTreePruningFunction,\n },\n env.logger,\n );\n\n const c = Computable.make((ctx) => {\n const node = ctx.accessor(tree.entry()).node();\n const oProjects = openedProjects.getValue(ctx);\n if (node === undefined) return undefined;\n const result: ProjectListEntry[] = [];\n for (const field of node.listDynamicFields()) {\n const prj = node.traverse(field);\n if (prj === undefined) continue;\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n result.push({\n id: field,\n rid: prj.id,\n created: new Date(created),\n lastModified: new Date(lastModified),\n opened: oProjects.indexOf(prj.id) >= 0,\n meta,\n });\n }\n result.sort((p) => -p.lastModified.valueOf());\n return result;\n }).withStableType();\n\n return { computable: c, tree };\n}\n","import type { AnyRef, FieldRef, PlTransaction } from '@milaboratories/pl-client';\nimport { field, Pl } from '@milaboratories/pl-client';\nimport type { ResourceType } from '@platforma-sdk/model';\n\nconst EphRenderTemplate: ResourceType = {\n name: 'EphRenderTemplate',\n version: '1',\n};\nconst RenderTemplate: ResourceType = {\n name: 'RenderTemplate',\n version: '1',\n};\n\n/**\n * Creates render template operation, for a given remplate and inputs.\n *\n * @param tx transaction to use during rendering creation\n * @param tpl reference to the template resource (see {@link loadTemplate})\n * @param ephemeral true for ephemeral templates, false for pure templates\n * @param inputs map of inputs pointing to other resources or fields\n * @param outputNames names of the outputs to collect and return from this method\n */\nexport function createRenderTemplate<O extends string>(\n tx: PlTransaction,\n tpl: AnyRef,\n ephemeral: boolean,\n inputs: Pl.PlRecord,\n outputNames: O[],\n): Record<O, FieldRef> {\n if (outputNames.length === 0) throw new Error('Zero output names provided');\n const rId = ephemeral ? tx.createEphemeral(EphRenderTemplate) : tx.createStruct(RenderTemplate);\n\n const tplField = field(rId, 'template');\n const inputsField = field(rId, 'inputs');\n\n tx.createField(tplField, 'Input', tpl);\n tx.createField(inputsField, 'Input', Pl.createPlMap(tx, inputs, ephemeral));\n tx.lockInputs(rId);\n\n return Pl.futureRecord(tx, rId, outputNames, 'Output', 'outputs/');\n}\n","import type {\n AnyRef,\n PlTransaction,\n ResourceRef,\n ResourceType } from '@milaboratories/pl-client';\nimport {\n field,\n Pl,\n} from '@milaboratories/pl-client';\nimport { randomUUID } from 'node:crypto';\nimport { createRenderTemplate } from './render_template';\n\nexport const BContextEnd: ResourceType = { name: 'BContextEnd', version: '1' };\nexport const BContext: ResourceType = { name: 'BContext', version: '1' };\nexport const BContextId = 'id';\nexport const BContextParent = 'parent';\nexport const BContextMultiParentPrefix = 'parent/';\n\n// TODO: add implementation for dual context heavy block.\n// export type BlockType =\n// | 'LightBlock'\n// | 'HeavyBlock'\n// | 'DualContextHeavyBlock';\n// moved to project model ==>>>\n\nexport type HeavyBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n isProduction: AnyRef;\n context: AnyRef;\n};\n\nexport type HeavyBlockOutputs = {\n context: AnyRef;\n result: AnyRef;\n};\n\nexport const HeavyBlockOutputNames: (keyof HeavyBlockOutputs)[] = ['context', 'result'];\n\nexport function createRenderHeavyBlock(\n tx: PlTransaction,\n tpl: AnyRef,\n inputs: HeavyBlockInputs,\n): HeavyBlockOutputs {\n return createRenderTemplate(tx, tpl, true, inputs, HeavyBlockOutputNames);\n}\n\nexport type LightBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n stagingContext: AnyRef;\n productionContext: AnyRef;\n};\n\nexport type LightBlockOutput = {\n result: AnyRef;\n};\n\nexport const LightBlockOutputNames: (keyof LightBlockOutput)[] = ['result'];\n\nexport function createRenderLightBlock(\n tx: PlTransaction,\n tpl: ResourceRef,\n inputs: LightBlockInputs,\n): LightBlockOutput {\n return createRenderTemplate(tx, tpl, true, inputs, LightBlockOutputNames);\n}\n\nexport function createBContextEnd(tx: PlTransaction): ResourceRef {\n const ctx = tx.createEphemeral(BContextEnd);\n tx.lock(ctx);\n return ctx;\n}\n\nexport function createBContextFromUpstreams(tx: PlTransaction, upstreamCtxs: AnyRef[]): AnyRef {\n if (upstreamCtxs.length === 0) return createBContextEnd(tx);\n\n if (upstreamCtxs.length === 1) return upstreamCtxs[0];\n\n const ctx = tx.createEphemeral(BContext);\n\n // setting id\n tx.createField(field(ctx, BContextId), 'Input', Pl.createPlString(tx, randomUUID()));\n\n // setting parents\n for (let i = 0; i < upstreamCtxs.length; i++)\n tx.createField(field(ctx, `${BContextMultiParentPrefix}${i}`), 'Input', upstreamCtxs[i]);\n\n tx.lock(ctx);\n\n return ctx;\n}\n","import type { AnyRef, AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type { Hash } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport type {\n CompiledTemplateV3,\n TemplateDataV3,\n TemplateLibDataV3,\n TemplateSoftwareDataV3,\n} from '@milaboratories/pl-model-backend';\nimport {\n PlTemplateLibV1,\n PlTemplateSoftwareV1,\n PlTemplateV1,\n PlTemplateOverrideV1,\n} from '@milaboratories/pl-model-backend';\nimport { notEmpty } from '@milaboratories/ts-helpers';\n\n/**\n * Renders the tree of templates by caching all resource ids\n * by their cache keys.\n * It's different from v2 version because we provide\n * the hash map of the code of all sources everywhere.\n * It does a double-dispatch on the node type (template, library etc),\n * and creates resources.\n *\n * IMO, it'd be clearer to rewrite it with Visitor pattern, and separate\n * tree traversing and operations on it, but I don't have time to do it now.\n*/\nexport function createTemplateV3Tree(tx: PlTransaction, tplData: CompiledTemplateV3): AnyRef {\n const resourceCache = new Map<string, AnyResourceRef>();\n\n const createResourceCached = <T>(resource: T, renderer: Renderer<T>, hashToSource: Record<string, string>): AnyResourceRef => {\n const key: Hash = createHash('sha256');\n renderer.updateCacheKey(resource, key, hashToSource);\n\n const rKey = key.digest('hex');\n\n if (!resourceCache.has(rKey)) {\n const rId = renderer.render(resource, tx, createResourceCached, hashToSource);\n resourceCache.set(rKey, rId);\n }\n\n return resourceCache.get(rKey)!;\n };\n\n return createResourceCached(tplData.template, TemplateRenderer, tplData.hashToSource);\n}\n\ntype Renderer<T> = {\n /** Updates the cache key by adding all info of the artifact. */\n updateCacheKey: CacheKey<T>;\n /** Create resources for all dependencies recursively and then for this artifact. */\n render: (resource: T, tx: PlTransaction, creator: Creator, sources: Record<string, string>) => AnyResourceRef;\n};\ntype CacheKey<T> = (resource: T, key: Hash, sources: Record<string, string>) => void;\ntype Creator = <T>(resource: T, renderer: Renderer<T>, sources: Record<string, string>) => AnyResourceRef;\n\nconst LibRenderer: Renderer<TemplateLibDataV3> = {\n updateCacheKey(resource, hash, sources) {\n hash\n .update(PlTemplateLibV1.type.name)\n .update(PlTemplateLibV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(getSourceCode(resource.name, sources, resource.sourceHash));\n },\n render(resource, tx, _creator, sources) {\n return tx.createValue(\n PlTemplateLibV1.type,\n JSON.stringify(PlTemplateLibV1.fromV3Data(resource, getSourceCode(resource.name, sources, resource.sourceHash)).data),\n );\n },\n};\n\nconst SoftwareInfoRenderer: Renderer<TemplateSoftwareDataV3> = {\n updateCacheKey(resource, hash, sources) {\n hash\n .update(PlTemplateSoftwareV1.type.name)\n .update(PlTemplateSoftwareV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(getSourceCode(resource.name, sources, resource.sourceHash));\n },\n render(resource, tx, _creator, sources) {\n const sw = PlTemplateSoftwareV1.fromV3Data(resource, getSourceCode(resource.name, sources, resource.sourceHash));\n const ref = tx.createStruct(PlTemplateSoftwareV1.type, sw.data);\n tx.setKValue(ref, PlTemplateSoftwareV1.metaNameKey, JSON.stringify(sw.name));\n tx.lock(ref);\n return ref;\n },\n};\n\nconst TemplateRenderer: Renderer<TemplateDataV3> = {\n updateCacheKey(resource, hash, sources) {\n hash\n .update(PlTemplateV1.type.name)\n .update(PlTemplateV1.type.version)\n .update(resource.hashOverride ?? 'no-override')\n .update(resource.name)\n .update(resource.version)\n .update(getSourceCode(resource.name, sources, resource.sourceHash));\n\n const srt = <T>(entries: [string, T][]): [string, T][] => {\n entries.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1));\n return entries;\n };\n\n for (const [libId, lib] of srt(Object.entries(resource.libs ?? {}))) {\n hash.update('lib:' + libId);\n LibRenderer.updateCacheKey(lib, hash, sources);\n }\n for (const [swId, sw] of srt(Object.entries(resource.software ?? {}))) {\n hash.update('soft:' + swId);\n SoftwareInfoRenderer.updateCacheKey(sw, hash, sources);\n }\n for (const [swId, sw] of srt(Object.entries(resource.assets ?? {}))) {\n hash.update('asset:' + swId);\n SoftwareInfoRenderer.updateCacheKey(sw, hash, sources);\n }\n for (const [tplId, tpl] of srt(Object.entries(resource.templates ?? {}))) {\n hash.update('tpl:' + tplId);\n this.updateCacheKey(tpl, hash, sources);\n }\n },\n render(resource, tx, _creator, sources) {\n const tplRef = tx.createStruct(\n PlTemplateV1.type,\n JSON.stringify(PlTemplateV1.fromV3Data(resource, getSourceCode(resource.name, sources, resource.sourceHash)).data),\n );\n // Render libraries\n for (const [libId, lib] of Object.entries(resource.libs ?? {})) {\n const fld = PlTemplateV1.libField(tplRef, libId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(lib, LibRenderer, sources));\n }\n\n // Render software and assets\n for (const [swId, sw] of Object.entries(resource.software ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer, sources));\n }\n for (const [swId, sw] of Object.entries(resource.assets ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer, sources));\n }\n\n // Render dependency templates\n for (const [depTplId, depTpl] of Object.entries(resource.templates ?? {})) {\n const fld = PlTemplateV1.tplField(tplRef, depTplId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(depTpl, TemplateRenderer, sources));\n }\n\n tx.lock(tplRef);\n\n if (!resource.hashOverride) return tplRef;\n\n // Override template hash with proxy resource, when hash override is configured for template\n const overrideRef = tx.createStruct(\n PlTemplateOverrideV1.type,\n JSON.stringify(PlTemplateOverrideV1.fromV3Data(resource)),\n );\n const fld = PlTemplateOverrideV1.tplField(overrideRef);\n tx.createField(fld, 'Service');\n tx.setField(fld, tplRef);\n tx.lock(overrideRef);\n return overrideRef;\n },\n};\n\n/**\n * Gets a source code of the artifact by its source hash.\n * the source hash was calculated and stored by tengo compiler\n * and is different from the hash we're using for caching here.\n */\nfunction getSourceCode(name: string, sources: Record<string, string>, sourceHash: string): string {\n return notEmpty(\n sources[sourceHash],\n `trying to get \"${name}\" source: sources map doesn't contain source hash ${sourceHash}`,\n );\n}\n","import type { AnyRef, AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport type { ExplicitTemplate, PreparedTemplate } from '../../model/template_spec';\nimport type { Hash } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport type {\n TemplateData,\n TemplateLibData,\n TemplateSoftwareData,\n} from '@milaboratories/pl-model-backend';\nimport {\n PlTemplateLibV1,\n PlTemplateSoftwareV1,\n PlTemplateV1,\n PlTemplateOverrideV1,\n parseTemplate,\n} from '@milaboratories/pl-model-backend';\nimport { createTemplateV3Tree } from './direct_template_loader_v3';\n\nexport function loadTemplateFromExplicitDirect(\n tx: PlTransaction,\n spec: ExplicitTemplate,\n): AnyRef {\n const templateInfo = parseTemplate(spec.content);\n\n const templateFormat = templateInfo.type;\n switch (templateFormat) {\n case 'pl.tengo-template.v2':\n return createTemplateV2Tree(tx, templateInfo);\n case 'pl.tengo-template.v3':\n return createTemplateV3Tree(tx, templateInfo);\n default:\n assertNever(templateFormat);\n }\n}\n\nexport function loadTemplateFromPrepared(\n tx: PlTransaction,\n spec: PreparedTemplate,\n): AnyRef {\n const templateData = spec.data;\n\n const templateFormat = templateData.type;\n switch (templateFormat) {\n case 'pl.tengo-template.v2':\n return createTemplateV2Tree(tx, templateData);\n case 'pl.tengo-template.v3':\n return createTemplateV3Tree(tx, templateData);\n default:\n assertNever(templateFormat);\n }\n}\n\ntype Renderer<T> = {\n hash: Hasher<T>;\n render: (resource: T, tx: PlTransaction, creator: Creator) => AnyResourceRef;\n};\ntype Hasher<T> = (resource: T, hash: Hash) => void;\ntype Creator = <T>(resource: T, renderer: Renderer<T>) => AnyResourceRef;\n\nconst LibRenderer: Renderer<TemplateLibData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateLibV1.type.name)\n .update(PlTemplateLibV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n return tx.createValue(\n PlTemplateLibV1.type,\n JSON.stringify(PlTemplateLibV1.fromV2Data(resource).data),\n );\n },\n};\n\nconst SoftwareInfoRenderer: Renderer<TemplateSoftwareData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateSoftwareV1.type.name)\n .update(PlTemplateSoftwareV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n const sw = PlTemplateSoftwareV1.fromV2Data(resource);\n const ref = tx.createStruct(PlTemplateSoftwareV1.type, sw.data);\n tx.setKValue(ref, PlTemplateSoftwareV1.metaNameKey, JSON.stringify(sw.name));\n tx.lock(ref);\n return ref;\n },\n};\n\nconst TemplateRenderer: Renderer<TemplateData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateV1.type.name)\n .update(PlTemplateV1.type.version)\n .update(resource.hashOverride ?? 'no-override')\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n\n const srt = <T>(entries: [string, T][]): [string, T][] => {\n entries.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1));\n return entries;\n };\n\n for (const [libId, lib] of srt(Object.entries(resource.libs ?? {}))) {\n hash.update('lib:' + libId);\n LibRenderer.hash(lib, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.software ?? {}))) {\n hash.update('soft:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.assets ?? {}))) {\n hash.update('asset:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [tplId, tpl] of srt(Object.entries(resource.templates ?? {}))) {\n hash.update('tpl:' + tplId);\n this.hash(tpl, hash);\n }\n },\n render(resource, tx, _creator) {\n const tplRef = tx.createStruct(\n PlTemplateV1.type,\n JSON.stringify(PlTemplateV1.fromV2Data(resource).data),\n );\n // Render libraries\n for (const [libId, lib] of Object.entries(resource.libs ?? {})) {\n const fld = PlTemplateV1.libField(tplRef, libId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(lib, LibRenderer));\n }\n\n // Render software and assets\n for (const [swId, sw] of Object.entries(resource.software ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n for (const [swId, sw] of Object.entries(resource.assets ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n\n // Render dependency templates\n for (const [depTplId, depTpl] of Object.entries(resource.templates ?? {})) {\n const fld = PlTemplateV1.tplField(tplRef, depTplId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(depTpl, TemplateRenderer));\n }\n\n tx.lock(tplRef);\n\n if (!resource.hashOverride) return tplRef;\n\n // Override template hash with proxy resource, when hash override is configured for template\n const overrideRef = tx.createStruct(\n PlTemplateOverrideV1.type,\n JSON.stringify(PlTemplateOverrideV1.fromV2Data(resource)),\n );\n const fld = PlTemplateOverrideV1.tplField(overrideRef);\n tx.createField(fld, 'Service');\n tx.setField(fld, tplRef);\n tx.lock(overrideRef);\n return overrideRef;\n },\n};\n\nfunction createTemplateV2Tree(tx: PlTransaction, tplData: TemplateData): AnyRef {\n const resourceCache = new Map<string, AnyResourceRef>();\n\n const createResource = <T>(resource: T, renderer: Renderer<T>): AnyResourceRef => {\n const hasher: Hash = createHash('sha256');\n renderer.hash(resource, hasher);\n\n const rKey = hasher.digest('hex');\n\n if (!resourceCache.has(rKey)) {\n const rId = renderer.render(resource, tx, createResource);\n resourceCache.set(rKey, rId);\n }\n\n return resourceCache.get(rKey)!;\n };\n\n return createResource(tplData, TemplateRenderer);\n}\n","import type { AnyRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field, Pl } from '@milaboratories/pl-client';\nimport fs from 'node:fs';\nimport type {\n TemplateFromRegistry,\n TemplateSpecAny,\n TemplateSpecPrepared,\n} from '../../model/template_spec';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { loadTemplateFromExplicitDirect, loadTemplateFromPrepared } from './direct_template_loader';\n\n//\n// Resource schema\n//\n\nexport const TengoTemplateGet: ResourceType = { name: 'TengoTemplateGet', version: '1' };\nexport const TengoTemplateGetRegistry = 'registry';\nexport const TengoTemplateGetTemplateURI = 'templateURI';\nexport const TengoTemplateGetTemplate = 'template';\n\nexport const TengoTemplatePack: ResourceType = { name: 'TengoTemplatePack', version: '1' };\nexport const TengoTemplatePackConvert: ResourceType = {\n name: 'TengoTemplatePackConvert',\n version: '1',\n};\nexport const TengoTemplatePackConvertTemplatePack = 'templatePack';\nexport const TengoTemplatePackConvertTemplate = 'template';\n\nexport async function prepareTemplateSpec(tpl: TemplateSpecAny): Promise<TemplateSpecPrepared> {\n switch (tpl.type) {\n case 'from-file':\n return {\n type: 'explicit',\n content: await fs.promises.readFile(tpl.path),\n };\n case 'from-registry':\n case 'explicit':\n return tpl;\n case 'prepared':\n return tpl;\n default:\n return assertNever(tpl);\n }\n}\n\nfunction loadTemplateFromRegistry(tx: PlTransaction, spec: TemplateFromRegistry): AnyRef {\n const getTemplate = tx.createStruct(TengoTemplateGet);\n const registry = field(getTemplate, TengoTemplateGetRegistry);\n const uri = field(getTemplate, TengoTemplateGetTemplateURI);\n const templateFromRegistry = field(getTemplate, TengoTemplateGetTemplate);\n\n // Note: it has a resource schema, so platforma creates fields by itself.\n\n tx.setField(registry, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.registry))));\n tx.setField(uri, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.path))));\n\n return templateFromRegistry;\n}\n\nexport function loadTemplate(tx: PlTransaction, spec: TemplateSpecPrepared): AnyRef {\n switch (spec.type) {\n case 'from-registry':\n return loadTemplateFromRegistry(tx, spec);\n case 'explicit':\n return loadTemplateFromExplicitDirect(tx, spec);\n case 'prepared':\n return loadTemplateFromPrepared(tx, spec);\n default:\n return assertNever(spec);\n }\n}\n","import type { ExplicitTemplate, PreparedTemplate } from './template_spec';\nimport type { ResourceType } from '@milaboratories/pl-client';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\n\nexport type FrontendSpec = FrontendFromUrl | FrontendFromFolder;\n\nexport interface FrontendFromUrlData {\n url: string;\n}\n\nexport const FrontendFromUrlResourceType: ResourceType = { name: 'Frontend/FromUrl', version: '1' };\n\n/** Directs user of the block pack to download the contents from the URL\n * outside the pl infrastructure. */\nexport interface FrontendFromUrl extends FrontendFromUrlData {\n type: 'url';\n}\n\nexport interface FrontendFromFolderData {\n path: string;\n /** HMAC signature of the path using local secret encoded as hex. */\n signature: string;\n}\n\nexport const FrontendFromFolderResourceType: ResourceType = {\n name: 'Frontend/FromFolder',\n version: '1',\n};\n\n/** Directs user of the block pack to load frontend from specific local\n * folder. Signature allows to confirm that this is the same client who\n * added the resource. */\nexport interface FrontendFromFolder extends FrontendFromFolderData {\n type: 'local';\n}\n\n/** Direct instructions to create block-pack from client. Currently, this\n * is the only block-pack spec that can be directly materialized. */\nexport interface BlockPackExplicit {\n type: 'explicit';\n template: ExplicitTemplate;\n config: BlockConfigContainer;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n}\n\n/** Block-pack spec that can be materialized in pl. */\nexport type BlockPackSpecPrepared = {\n type: 'prepared';\n template: PreparedTemplate;\n config: BlockConfigContainer;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n};\n\n/** All block-pack specs. */\nexport type BlockPackSpecAny = BlockPackSpecPrepared | BlockPackExplicit | BlockPackSpec;\n","import type { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData,\n FrontendSpec,\n} from '../../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n","import { Worker } from 'node:worker_threads';\nimport type { Scheme } from './workerApi';\nimport path from 'node:path';\n\nexport class WorkerManager implements AsyncDisposable {\n private nextMessageId = 0;\n private worker: Worker;\n private pendingRequests = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>();\n\n constructor() {\n const workerPath: string | undefined = typeof global !== 'undefined'\n && '__WORKER_PATH__' in global\n ? global.__WORKER_PATH__ as string\n : path.resolve(import.meta.dirname, 'worker.js');\n\n const worker = this.worker = new Worker(\n workerPath,\n {\n workerData: {},\n },\n );\n\n worker.on('message', ({ id, data, error }) => {\n const { resolve, reject } = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n if (error) {\n reject(new Error(error));\n } else {\n resolve(data);\n }\n });\n\n worker.on('error', (msg) => {\n console.error('Worker error', msg);\n this.rejectAllPendingRequests(msg);\n });\n }\n\n private rejectAllPendingRequests(msg: unknown) {\n Array.from(this.pendingRequests.values()).map(({ reject }) => {\n reject(msg);\n });\n }\n\n async process<\n Type extends keyof Scheme,\n Args extends Scheme[Type]['args'],\n Response extends Scheme[Type]['response']>(type: Type, ...args: Args): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n const id = ++this.nextMessageId;\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.worker.postMessage({ id, type, args });\n });\n }\n\n async terminate() {\n this.rejectAllPendingRequests(new Error('Worker terminated'));\n await this.worker.terminate();\n }\n\n [Symbol.asyncDispose]() {\n return this.terminate();\n }\n}\n","import type { AnyResourceRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport { createFrontend } from './frontend';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport type { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport type { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\nimport { LRUCache } from 'lru-cache';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { WorkerManager } from '../../worker/WorkerManager';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nfunction bufferToString(buffer: ArrayBuffer): string {\n return Buffer.from(buffer).toString('utf8');\n}\n\nfunction bufferToJson(buffer: ArrayBuffer): unknown {\n return JSON.parse(bufferToString(buffer));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'prepared':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return bufferToJson(configResponse) as BlockConfigContainer;\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return bufferToJson(configResponse) as BlockConfigContainer;\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === 'prepared') {\n return spec;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n return {\n ...explicit,\n type: 'prepared',\n template: {\n type: 'prepared',\n data: await workerManager.process('parseTemplate', explicit.template.content),\n },\n };\n }\n\n private async prepareWithoutUnpacking(spec: BlockPackExplicit | BlockPackSpec): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8'),\n ) as BlockConfigContainer;\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = JSON.parse(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n }),\n ) as BlockConfigContainer;\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = bufferToJson(configResponse) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n bufferToJson(await this.remoteContentCache.forceFetch(components.model.url)) as BlockConfigContainer;\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'prepared':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n","import { assertNever } from '@milaboratories/ts-helpers';\nimport type { PlRef } from '@platforma-sdk/model';\n\nexport function outputRef(blockId: string, name: string, requireEnrichments?: boolean): PlRef {\n if (requireEnrichments) return { __isRef: true, blockId, name, requireEnrichments };\n else return { __isRef: true, blockId, name };\n}\n\nexport function isBlockOutputReference(obj: unknown): obj is PlRef {\n return (\n typeof obj === 'object'\n && obj !== null\n && '__isRef' in obj\n && obj.__isRef === true\n && 'blockId' in obj\n && 'name' in obj\n );\n}\n\nfunction addAllReferencedBlocks(result: BlockUpstreams, node: unknown, allowed?: Set<string>) {\n const type = typeof node;\n switch (type) {\n case 'function':\n case 'bigint':\n case 'number':\n case 'string':\n case 'boolean':\n case 'symbol':\n case 'undefined':\n return;\n\n case 'object':\n if (node === null) return;\n\n if (isBlockOutputReference(node)) {\n if (allowed === undefined || allowed.has(node.blockId)) {\n result.upstreams.add(node.blockId);\n if (node.requireEnrichments)\n result.upstreamsRequiringEnrichments.add(node.blockId);\n } else result.missingReferences = true;\n } else if (Array.isArray(node)) {\n for (const child of node) addAllReferencedBlocks(result, child, allowed);\n } else {\n for (const [, child] of Object.entries(node as object))\n addAllReferencedBlocks(result, child, allowed);\n }\n\n return;\n\n default:\n assertNever(type);\n }\n}\n\nexport interface BlockUpstreams {\n /** All direct block dependencies */\n upstreams: Set<string>;\n /** Direct block dependencies which enrichments are also required by current block */\n upstreamsRequiringEnrichments: Set<string>;\n /** True if not-allowed references was encountered */\n missingReferences: boolean;\n}\n\n/** Extracts all resource ids referenced by args object. */\nexport function inferAllReferencedBlocks(args: unknown, allowed?: Set<string>): BlockUpstreams {\n const result = { upstreams: new Set<string>(), upstreamsRequiringEnrichments: new Set<string>(), missingReferences: false };\n addAllReferencedBlocks(result, args, allowed);\n return result;\n}\n","import type { Block, ProjectStructure } from './project_model';\nimport type { Optional, Writable } from 'utility-types';\nimport { inferAllReferencedBlocks } from './args';\nimport type { PlRef } from '@milaboratories/pl-model-common';\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n },\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Upstreams, calculated accounting for potential indirect block dependencies */\n readonly upstream: Set<string>;\n /** Direct upstream, listed in block args */\n readonly directUpstream: Set<string>;\n /** Downstreams, calculated accounting for potential indirect block dependencies */\n readonly downstream: Set<string>;\n /** Downstream blocks enriching current block's outputs */\n readonly enrichments: Set<string>;\n /** Direct downstreams listing our block in it's args */\n readonly directDownstream: Set<string>;\n /** Upstream blocks that current block may enrich with its exports */\n readonly enrichmentTargets: Set<string>;\n}\n\nexport type BlockGraphDirection = 'upstream' | 'downstream' | 'directUpstream' | 'directDownstream' | 'enrichments' | 'enrichmentTargets';\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: BlockGraphDirection,\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void,\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n const nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction].forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, BlockGraphDirection>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false,\n };\n result.set(id, current);\n if (previous === undefined) {\n current.directUpstream = current.upstream = new Set<string>();\n current.enrichments = current.enrichmentTargets = new Set<string>();\n } else {\n current.directUpstream = current.upstream = new Set<string>([previous.id]);\n previous.directDownstream = previous.downstream = new Set<string>([current.id]);\n previous.enrichments = previous.enrichmentTargets = new Set<string>();\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.directDownstream = previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport type ProductionGraphBlockInfo = {\n args: unknown;\n enrichmentTargets: PlRef[] | undefined;\n};\n\nexport function productionGraph(\n structure: ProjectStructure,\n infoProvider: (blockId: string) => ProductionGraphBlockInfo | undefined,\n): BlockGraph {\n const resultMap = new Map<string, BlockGraphNode>();\n // result graph is constructed to be able to perform traversal on incomplete graph\n // to calculate potentialUpstreams\n const resultGraph = new BlockGraph(resultMap);\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const allAbove = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const info = infoProvider(id);\n\n // skipping those blocks for which we don't have args\n if (info === undefined) continue;\n\n const references = inferAllReferencedBlocks(info.args, allAbove);\n\n // The algorithm here adds all downstream blocks of direct upstreams as potential upstreams.\n // They may produce additional columns, anchored in our direct upstream, those columns might be needed by the workflow.\n const potentialUpstreams = new Set([\n ...references.upstreams,\n ...resultGraph.traverseIds('enrichments', ...references.upstreamsRequiringEnrichments),\n ]);\n\n // To minimize complexity of the graph, we leave only the closest upstreams, removing all their transitive dependencies,\n // relying on the traversal mechanisms in BContexts and on UI level to connect our block with all upstreams\n const upstreams = new Set<string>();\n for (const { id: pId } of allBlocks(structure)) {\n if (pId === id) break; // stopping on current block\n if (potentialUpstreams.has(pId)) {\n upstreams.add(pId);\n for (const transitiveUpstream of resultGraph.traverseIdsExcludingRoots('upstream', pId))\n upstreams.delete(transitiveUpstream);\n }\n }\n\n // default assumption is that all direct upstreams are enrichment targets\n const enrichmentTargets = info.enrichmentTargets === undefined\n ? new Set(references.upstreams)\n : new Set(info.enrichmentTargets.map((t) => t.blockId));\n\n const node: BlockGraphNode = {\n id,\n missingReferences: references.missingReferences,\n upstream: upstreams,\n directUpstream: references.upstreams,\n enrichmentTargets,\n downstream: new Set<string>(), // will be populated from downstream blocks\n directDownstream: new Set<string>(), // will be populated from downstream blocks\n enrichments: new Set<string>(), // will be populated from downstream blocks\n };\n resultMap.set(id, node);\n references.upstreams.forEach((dep) => resultMap.get(dep)!.directDownstream.add(id));\n upstreams.forEach((dep) => resultMap.get(dep)!.downstream.add(id));\n enrichmentTargets.forEach((dep) => resultMap.get(dep)?.enrichments.add(id));\n allAbove.add(id);\n }\n\n return resultGraph;\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n","import type { AnyRef, PlTransaction } from '@milaboratories/pl-client';\nimport { createRenderTemplate } from './template/render_template';\nimport { prepareTemplateSpec } from './template/template_loading';\nimport type { TemplateSpecPrepared } from '../model/template_spec';\nimport { createHash } from 'node:crypto';\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(SdkTemplates['pframes.export-pframe-for-ui']);\n if (preparedTemplate.type !== 'explicit') throw new Error('Unexpected prepared template type.');\n const hash = createHash('sha256').update(preparedTemplate.content).digest('hex');\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, ['result']).result;\n}\n","export type MlDebugFlags = {\n logPFrameRequests: boolean;\n logTreeStats?: 'cumulative' | 'per-request';\n logProjectMutationStat: boolean;\n dumpInitialTreeState: boolean;\n logOutputStatus?: 'any' | 'unstable-only';\n logOutputRecalculations?: boolean;\n};\n\nlet flags: MlDebugFlags | undefined = undefined;\nexport function getDebugFlags() {\n if (flags) return flags;\n flags = {\n logPFrameRequests: process.env.MI_LOG_PFRAMES !== undefined,\n dumpInitialTreeState: process.env.MI_DUMP_INITIAL_TREE_STATE !== undefined,\n logProjectMutationStat: process.env.MI_LOG_PROJECT_MUTATION_STAT !== undefined,\n logOutputRecalculations: process.env.MI_LOG_OUTPUT_RECALCULATIONS !== undefined,\n };\n if (process.env.MI_LOG_OUTPUT_STATUS)\n flags.logOutputStatus = process.env.MI_LOG_OUTPUT_STATUS === 'unstable-only' ? 'unstable-only' : 'any';\n if (process.env.MI_LOG_TREE_STAT)\n flags.logTreeStats = process.env.MI_LOG_TREE_STAT === 'cumulative' ? 'cumulative' : 'per-request';\n return flags;\n}\n","import type {\n AnyRef,\n AnyResourceRef,\n BasicResourceData,\n PlTransaction,\n ResourceData,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n ensureResourceIdNotNull,\n field,\n isNotNullResourceId,\n isNullResourceId,\n isResource,\n isResourceId,\n isResourceRef,\n Pl,\n PlClient,\n} from '@milaboratories/pl-client';\nimport { createRenderHeavyBlock, createBContextFromUpstreams } from './template/render_block';\nimport type {\n Block,\n ProjectStructure,\n ProjectField,\n ProjectRenderingState } from '../model/project_model';\nimport {\n BlockRenderingStateKey,\n ProjectStructureKey,\n parseProjectField,\n projectFieldName,\n SchemaVersionCurrent,\n SchemaVersionKey,\n ProjectResourceType,\n InitialBlockStructure,\n InitialProjectRenderingState,\n ProjectMetaKey,\n InitialBlockMeta,\n blockArgsAuthorKey,\n ProjectLastModifiedTimestamp,\n ProjectCreatedTimestamp,\n ProjectStructureAuthorKey,\n getServiceTemplateField,\n FieldsToDuplicate,\n} from '../model/project_model';\nimport { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';\nimport type {\n BlockGraph,\n ProductionGraphBlockInfo } from '../model/project_model_util';\nimport {\n allBlocks,\n graphDiff,\n productionGraph,\n stagingGraph,\n} from '../model/project_model_util';\nimport type { BlockPackSpecPrepared } from '../model';\nimport type {\n AuthorMarker,\n BlockPackSpec,\n BlockSettings,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport {\n InitialBlockSettings,\n} from '@milaboratories/pl-model-middle-layer';\nimport Denque from 'denque';\nimport { exportContext, getPreparedExportTemplateEnvelope } from './context_export';\nimport { loadTemplate } from './template/template_loading';\nimport { cachedDeserialize, notEmpty, canonicalJsonGzBytes, canonicalJsonBytes } from '@milaboratories/ts-helpers';\nimport type { ProjectHelper } from '../model/project_helper';\nimport { extractConfig, UiError, type BlockConfig } from '@platforma-sdk/model';\nimport { getDebugFlags } from '../debug';\nimport type { BlockPackInfo } from '../model/block_pack';\n\ntype FieldStatus = 'NotReady' | 'Ready' | 'Error';\n\ninterface BlockFieldState {\n modCount: number;\n ref?: AnyRef;\n status?: FieldStatus;\n value?: Uint8Array;\n}\n\ntype BlockFieldStates = Partial<Record<ProjectField['fieldName'], BlockFieldState>>;\ntype BlockFieldStateValue = Omit<BlockFieldState, 'modCount'>;\n\ninterface BlockInfoState {\n readonly id: string;\n readonly fields: BlockFieldStates;\n blockConfig?: BlockConfig;\n blockPack?: BlockPackSpec;\n}\n\nfunction cached<ModId, T>(modIdCb: () => ModId, valueCb: () => T): () => T {\n let initialized = false;\n let lastModId: ModId | undefined = undefined;\n let value: T | undefined = undefined;\n return () => {\n if (!initialized) {\n initialized = true;\n lastModId = modIdCb();\n value = valueCb();\n return value;\n }\n const currentModId = modIdCb();\n if (lastModId !== currentModId) {\n lastModId = currentModId;\n value = valueCb();\n }\n return valueCb();\n };\n}\n\nclass BlockInfo {\n constructor(\n public readonly id: string,\n public readonly fields: BlockFieldStates,\n public readonly config: BlockConfig,\n public readonly source: BlockPackSpec,\n ) {}\n\n public check() {\n // state assertions\n\n if ((this.fields.prodOutput === undefined) !== (this.fields.prodCtx === undefined))\n throw new Error('inconsistent prod fields');\n\n if ((this.fields.stagingOutput === undefined) !== (this.fields.stagingCtx === undefined))\n throw new Error('inconsistent stage fields');\n\n if (\n (this.fields.prodOutputPrevious === undefined)\n !== (this.fields.prodCtxPrevious === undefined)\n )\n throw new Error('inconsistent prod cache fields');\n\n if (\n (this.fields.stagingOutputPrevious === undefined)\n !== (this.fields.stagingCtxPrevious === undefined)\n )\n throw new Error('inconsistent stage cache fields');\n\n if (this.fields.blockPack === undefined) throw new Error('no block pack field');\n\n if (this.fields.currentArgs === undefined) throw new Error('no current args field');\n }\n\n private readonly currentArgsC = cached(\n () => this.fields.currentArgs!.modCount,\n () => cachedDeserialize(this.fields.currentArgs!.value!),\n );\n\n private readonly prodArgsC = cached(\n () => this.fields.prodArgs?.modCount,\n () => {\n const bin = this.fields.prodArgs?.value;\n if (bin === undefined) return undefined;\n return cachedDeserialize(bin);\n },\n );\n\n get currentArgs(): unknown {\n return this.currentArgsC();\n }\n\n get stagingRendered(): boolean {\n return this.fields.stagingCtx !== undefined;\n }\n\n get productionRendered(): boolean {\n return this.fields.prodCtx !== undefined;\n }\n\n get productionHasErrors(): boolean {\n return this.fields.prodUiCtx?.status === 'Error';\n }\n\n private readonly productionStaleC: () => boolean = cached(\n () => `${this.fields.currentArgs!.modCount}_${this.fields.prodArgs?.modCount}`,\n () =>\n this.fields.prodArgs === undefined\n || Buffer.compare(this.fields.currentArgs!.value!, this.fields.prodArgs.value!) !== 0,\n );\n\n // get productionStale(): boolean {\n // return this.productionRendered && this.productionStaleC() && ;\n // }\n\n get requireProductionRendering(): boolean {\n return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;\n }\n\n get prodArgs(): unknown {\n return this.prodArgsC();\n }\n\n public getTemplate(tx: PlTransaction): AnyRef {\n return tx.getFutureFieldValue(\n Pl.unwrapHolder(tx, this.fields.blockPack!.ref!),\n BlockPackTemplateField,\n 'Input',\n );\n }\n}\n\nexport interface NewBlockSpec {\n blockPack: BlockPackSpecPrepared;\n args: string;\n uiState: string;\n}\n\nconst NoNewBlocks = (blockId: string) => {\n throw new Error(`No new block info for ${blockId}`);\n};\n\nexport interface SetStatesRequest {\n blockId: string;\n args?: unknown;\n uiState?: unknown;\n}\n\ntype _GraphInfoFields =\n | 'stagingUpstream'\n | 'stagingDownstream'\n | 'futureProductionUpstream'\n | 'futureProductionDownstream'\n | 'actualProductionUpstream'\n | 'actualProductionDownstream';\n\nexport type ArgsAndUiState = {\n args: unknown;\n uiState: unknown;\n};\n\nexport class ProjectMutator {\n private globalModCount = 0;\n private fieldsChanged: boolean = false;\n\n //\n // Change trackers\n //\n\n private lastModifiedChanged = false;\n private structureChanged = false;\n private metaChanged = false;\n private renderingStateChanged = false;\n\n /** Set blocks will be assigned current mutator author marker on save */\n private readonly blocksWithChangedInputs = new Set<string>();\n\n constructor(\n public readonly rid: ResourceId,\n private readonly tx: PlTransaction,\n private readonly author: AuthorMarker | undefined,\n private readonly schema: string,\n private lastModified: number,\n private meta: ProjectMeta,\n private struct: ProjectStructure,\n private readonly renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>,\n private readonly blocksInLimbo: Set<string>,\n private readonly blockInfos: Map<string, BlockInfo>,\n private readonly ctxExportTplHolder: AnyResourceRef,\n private readonly projectHelper: ProjectHelper,\n ) {}\n\n private fixProblemsAndMigrate() {\n // Fixing problems introduced by old code\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodArgs === undefined\n || blockInfo.fields.prodOutput === undefined\n || blockInfo.fields.prodCtx === undefined\n )\n this.deleteBlockFields(blockInfo.id, 'prodArgs', 'prodOutput', 'prodCtx');\n });\n\n // Migration for addition of block settings field\n let initialBlockSettings: Omit<BlockFieldState, 'modCount'> | undefined;\n this.blockInfos.forEach((blockInfo) => {\n if (blockInfo.fields.blockSettings === undefined) {\n if (initialBlockSettings === undefined)\n initialBlockSettings = this.createJsonFieldValue(InitialBlockSettings);\n this.setBlockFieldObj(blockInfo.id, 'blockSettings', initialBlockSettings);\n }\n });\n }\n\n get wasModified(): boolean {\n return (\n this.lastModifiedChanged\n || this.structureChanged\n || this.fieldsChanged\n || this.metaChanged\n || this.renderingStateChanged\n );\n }\n\n get structure(): ProjectStructure {\n // clone\n return JSON.parse(JSON.stringify(this.struct)) as ProjectStructure;\n }\n\n //\n // Graph calculation\n //\n\n private stagingGraph: BlockGraph | undefined = undefined;\n private pendingProductionGraph: BlockGraph | undefined = undefined;\n private actualProductionGraph: BlockGraph | undefined = undefined;\n\n private getStagingGraph(): BlockGraph {\n if (this.stagingGraph === undefined) this.stagingGraph = stagingGraph(this.struct);\n return this.stagingGraph;\n }\n\n private getProductionGraphBlockInfo(blockId: string, prod: boolean): ProductionGraphBlockInfo | undefined {\n const bInfo = this.getBlockInfo(blockId);\n\n let argsField: BlockFieldState;\n let args: unknown;\n\n if (prod) {\n if (bInfo.fields.prodArgs === undefined) return undefined;\n argsField = bInfo.fields.prodArgs;\n args = bInfo.prodArgs;\n } else {\n argsField = notEmpty(bInfo.fields.currentArgs);\n args = bInfo.currentArgs;\n }\n\n const blockPackField = notEmpty(bInfo.fields.blockPack);\n\n if (isResourceId(argsField.ref!) && isResourceId(blockPackField.ref!))\n return {\n args,\n enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args,\n { argsRid: argsField.ref, blockPackRid: blockPackField.ref }),\n };\n else\n return {\n args,\n enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args),\n };\n }\n\n private getPendingProductionGraph(): BlockGraph {\n if (this.pendingProductionGraph === undefined)\n this.pendingProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getProductionGraphBlockInfo(blockId, false),\n );\n return this.pendingProductionGraph;\n }\n\n private getActualProductionGraph(): BlockGraph {\n if (this.actualProductionGraph === undefined)\n this.actualProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getProductionGraphBlockInfo(blockId, true),\n );\n return this.actualProductionGraph;\n }\n\n //\n // Generic helpers to interact with project state\n //\n\n private getBlockInfo(blockId: string): BlockInfo {\n const info = this.blockInfos.get(blockId);\n if (info === undefined) throw new Error(`No such block: ${blockId}`);\n return info;\n }\n\n private createJsonFieldValueByContent(content: string): BlockFieldStateValue {\n const value = Buffer.from(content);\n const ref = this.tx.createValue(Pl.JsonObject, value);\n return { ref, value, status: 'Ready' };\n }\n\n private createJsonFieldValue(obj: unknown): BlockFieldStateValue {\n return this.createJsonFieldValueByContent(JSON.stringify(obj));\n }\n\n private getBlock(blockId: string): Block {\n for (const block of allBlocks(this.struct)) if (block.id === blockId) return block;\n throw new Error('block not found');\n }\n\n private setBlockFieldObj(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n state: BlockFieldStateValue,\n ) {\n const fid = field(this.rid, projectFieldName(blockId, fieldName));\n\n if (state.ref === undefined) throw new Error('Can\\'t set value with empty ref');\n\n if (this.getBlockInfo(blockId).fields[fieldName] === undefined)\n this.tx.createField(fid, 'Dynamic', state.ref);\n else this.tx.setField(fid, state.ref);\n\n this.getBlockInfo(blockId).fields[fieldName] = {\n modCount: this.globalModCount++,\n ...state,\n };\n\n this.fieldsChanged = true;\n }\n\n private setBlockField(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n ref: AnyRef,\n status: FieldStatus,\n value?: Uint8Array,\n ) {\n this.setBlockFieldObj(blockId, fieldName, { ref, status, value });\n }\n\n private deleteBlockFields(blockId: string, ...fieldNames: (keyof BlockFieldStates)[]): boolean {\n let deleted = false;\n const info = this.getBlockInfo(blockId);\n for (const fieldName of fieldNames) {\n const fields = info.fields;\n if (!(fieldName in fields)) continue;\n this.tx.removeField(field(this.rid, projectFieldName(blockId, fieldName)));\n delete fields[fieldName];\n this.fieldsChanged = true;\n deleted = true;\n }\n return deleted;\n }\n\n private updateLastModified() {\n this.lastModified = Date.now();\n this.lastModifiedChanged = true;\n }\n\n //\n // Main project actions\n //\n\n private resetStagingRefreshTimestamp() {\n this.renderingState.stagingRefreshTimestamp = Date.now();\n this.renderingStateChanged = true;\n }\n\n private resetStaging(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.stagingOutput?.status === 'Ready'\n && fields.stagingCtx?.status === 'Ready'\n && fields.stagingUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'stagingOutputPrevious', fields.stagingOutput);\n this.setBlockFieldObj(blockId, 'stagingCtxPrevious', fields.stagingCtx);\n this.setBlockFieldObj(blockId, 'stagingUiCtxPrevious', fields.stagingUiCtx);\n }\n if (this.deleteBlockFields(blockId, 'stagingOutput', 'stagingCtx', 'stagingUiCtx'))\n this.resetStagingRefreshTimestamp();\n }\n\n private resetProduction(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.prodOutput?.status === 'Ready'\n && fields.prodCtx?.status === 'Ready'\n && fields.prodUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'prodOutputPrevious', fields.prodOutput);\n this.setBlockFieldObj(blockId, 'prodCtxPrevious', fields.prodCtx);\n this.setBlockFieldObj(blockId, 'prodUiCtxPrevious', fields.prodUiCtx);\n }\n this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Running blocks are reset, already computed moved to limbo. Returns if\n * either of the actions were actually performed.\n * This method ensures the block is left in a consistent state that passes check() constraints. */\n private resetOrLimboProduction(blockId: string): boolean {\n const fields = this.getBlockInfo(blockId).fields;\n\n // Check if we can safely move to limbo (both core production fields are ready)\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {\n if (this.blocksInLimbo.has(blockId))\n // we are already in limbo\n return false;\n\n // limbo - keep the ready production results but clean up cache\n this.blocksInLimbo.add(blockId);\n this.renderingStateChanged = true;\n\n // doing some gc - clean up previous cache fields\n this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');\n\n return true;\n } else {\n // reset - clean up any partial/inconsistent production stat\n return this.deleteBlockFields(\n blockId,\n 'prodOutput',\n 'prodCtx',\n 'prodUiCtx',\n 'prodArgs',\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n );\n }\n }\n\n /** Optimally sets inputs for multiple blocks in one go */\n public setStates(requests: SetStatesRequest[]) {\n const changedArgs: string[] = [];\n let somethingChanged = false;\n for (const req of requests) {\n const info = this.getBlockInfo(req.blockId);\n let blockChanged = false;\n for (const stateKey of ['args', 'uiState'] as const) {\n if (!(stateKey in req)) continue;\n const statePart = req[stateKey];\n if (statePart === undefined || statePart === null)\n throw new Error(\n `Can't set ${stateKey} to null or undefined, please omit the key if you don't want to change it`,\n );\n\n const fieldName = stateKey === 'args' ? 'currentArgs' : 'uiState';\n\n let data: Uint8Array;\n let gzipped: boolean = false;\n if (stateKey === 'args') {\n // don't gzip args, workflow code can't uncompress gzip yet\n data = canonicalJsonBytes(statePart);\n } else {\n const { data: binary, isGzipped } = canonicalJsonGzBytes(statePart);\n data = binary;\n gzipped = isGzipped;\n }\n if (Buffer.compare(info.fields[fieldName]!.value!, data) === 0) continue;\n console.log('setting', fieldName, gzipped, data.length);\n const statePartRef = this.tx.createValue(gzipped ? Pl.JsonGzObject : Pl.JsonObject, data);\n this.setBlockField(req.blockId, fieldName, statePartRef, 'Ready', data);\n\n blockChanged = true;\n if (stateKey === 'args') changedArgs.push(req.blockId);\n }\n if (blockChanged) {\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(req.blockId);\n somethingChanged = true;\n }\n }\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', changedArgs, ({ id }) => this.resetStaging(id));\n\n if (somethingChanged) this.updateLastModified();\n }\n\n public setBlockSettings(blockId: string, newValue: BlockSettings): void {\n this.setBlockFieldObj(blockId, 'blockSettings', this.createJsonFieldValue(newValue));\n this.updateLastModified();\n }\n\n private createProdCtx(upstream: Set<string>): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields['prodCtx']?.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields['prodCtx'].ref));\n });\n return createBContextFromUpstreams(this.tx, upstreamContexts);\n }\n\n private createStagingCtx(upstream: Set<string>): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields['stagingCtx']?.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields['stagingCtx'].ref));\n if (info.fields['prodCtx']?.ref !== undefined)\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields['prodCtx'].ref));\n });\n return createBContextFromUpstreams(this.tx, upstreamContexts);\n }\n\n private exportCtx(ctx: AnyRef): AnyRef {\n return exportContext(this.tx, Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);\n }\n\n private renderStagingFor(blockId: string) {\n this.resetStaging(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createStagingCtx(this.getStagingGraph().nodes.get(blockId)!.upstream);\n\n if (this.getBlock(blockId).renderingMode !== 'Heavy') throw new Error('not supported yet');\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(false)),\n context: ctx,\n });\n\n this.setBlockField(\n blockId,\n 'stagingCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady',\n );\n\n this.setBlockField(blockId, 'stagingUiCtx', this.exportCtx(results.context), 'NotReady');\n\n this.setBlockField(blockId, 'stagingOutput', results.result, 'NotReady');\n }\n\n private renderProductionFor(blockId: string) {\n this.resetProduction(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId)!.upstream);\n\n if (this.getBlock(blockId).renderingMode === 'Light')\n throw new Error('Can\\'t render production for light block.');\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(true)),\n context: ctx,\n });\n this.setBlockField(\n blockId,\n 'prodCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady',\n );\n this.setBlockField(blockId, 'prodUiCtx', this.exportCtx(results.context), 'NotReady');\n this.setBlockField(blockId, 'prodOutput', results.result, 'NotReady');\n\n // saving inputs for which we rendered the production\n this.setBlockFieldObj(blockId, 'prodArgs', info.fields.currentArgs!);\n\n // removing block from limbo as we juts rendered fresh production for it\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n }\n\n //\n // Structure changes\n //\n\n private initializeNewBlock(blockId: string, spec: NewBlockSpec): void {\n const info = new BlockInfo(blockId, {}, extractConfig(spec.blockPack.config), spec.blockPack.source);\n this.blockInfos.set(blockId, info);\n\n // block pack\n const bp = createBlockPack(this.tx, spec.blockPack);\n this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');\n\n // settings\n this.setBlockFieldObj(\n blockId,\n 'blockSettings',\n this.createJsonFieldValue(InitialBlockSettings),\n );\n\n // args\n this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));\n\n // uiState\n this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));\n\n // checking structure\n info.check();\n }\n\n private getFieldNamesToDuplicate(blockId: string): Set<ProjectField['fieldName']> {\n const fields = this.getBlockInfo(blockId).fields;\n\n const diff = <T>(setA: Set<T>, setB: Set<T>): Set<T> => new Set([...setA].filter((x) => !setB.has(x)));\n\n // Check if we can safely move to limbo (both core production fields are ready)\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {\n if (this.blocksInLimbo.has(blockId))\n // we are already in limbo\n return FieldsToDuplicate;\n\n return diff(FieldsToDuplicate, new Set([\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n ]));\n } else {\n return diff(FieldsToDuplicate, new Set([\n 'prodOutput',\n 'prodCtx',\n 'prodUiCtx',\n 'prodArgs',\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n ]));\n }\n }\n\n private initializeBlockDuplicate(blockId: string, originalBlockInfo: BlockInfo) {\n const info = new BlockInfo(\n blockId,\n {},\n originalBlockInfo.config,\n originalBlockInfo.source,\n );\n\n this.blockInfos.set(blockId, info);\n\n const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);\n\n // Copy all fields from original block to new block by sharing references\n for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) {\n if (fieldNamesToDuplicate.has(fieldName as ProjectField['fieldName']) && fieldState && fieldState.ref) {\n this.setBlockFieldObj(blockId, fieldName as keyof BlockFieldStates, {\n ref: fieldState.ref,\n status: fieldState.status,\n value: fieldState.value,\n });\n }\n }\n\n this.resetOrLimboProduction(blockId);\n\n info.check();\n }\n\n /** Very generic method, better check for more specialized case-specific methods first. */\n public updateStructure(\n newStructure: ProjectStructure,\n newBlockInitializer: (blockId: string) => void = NoNewBlocks,\n ): void {\n const currentStagingGraph = this.getStagingGraph();\n const currentActualProductionGraph = this.getActualProductionGraph();\n\n const newStagingGraph = stagingGraph(newStructure);\n\n const stagingDiff = graphDiff(currentStagingGraph, newStagingGraph);\n\n // removing blocks\n for (const blockId of stagingDiff.onlyInA) {\n const { fields } = this.getBlockInfo(blockId);\n this.deleteBlockFields(blockId, ...(Object.keys(fields) as ProjectField['fieldName'][]));\n this.blockInfos.delete(blockId);\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n }\n\n // creating new blocks\n for (const blockId of stagingDiff.onlyInB) {\n newBlockInitializer(blockId);\n }\n\n // resetting stagings affected by topology change\n for (const blockId of stagingDiff.different) this.resetStaging(blockId);\n\n // new actual production graph without new blocks\n const newActualProductionGraph = productionGraph(\n newStructure,\n (blockId) => this.getProductionGraphBlockInfo(blockId, true),\n );\n\n const prodDiff = graphDiff(currentActualProductionGraph, newActualProductionGraph);\n\n // applying changes due to topology change in production to affected nodes and\n // all their downstreams\n currentActualProductionGraph.traverse('downstream', [...prodDiff.different], (node) => {\n this.resetOrLimboProduction(node.id);\n });\n\n if (\n stagingDiff.onlyInB.size > 0\n || stagingDiff.onlyInA.size > 0\n || stagingDiff.different.size > 0\n )\n this.resetStagingRefreshTimestamp();\n\n this.struct = newStructure;\n this.structureChanged = true;\n this.stagingGraph = undefined;\n this.pendingProductionGraph = undefined;\n this.actualProductionGraph = undefined;\n\n this.updateLastModified();\n }\n\n //\n // Structure change helpers\n //\n\n public addBlock(block: Block, spec: NewBlockSpec, before?: string): void {\n const newStruct = this.structure; // copy current structure\n if (before === undefined) {\n // adding as a very last block\n newStruct.groups[newStruct.groups.length - 1].blocks.push(block);\n } else {\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === before);\n if (idx < 0) continue;\n group.blocks.splice(idx, 0, block);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${before}`);\n }\n this.updateStructure(newStruct, (blockId) => {\n if (blockId !== block.id) throw new Error('Unexpected');\n this.initializeNewBlock(blockId, spec);\n });\n }\n\n /**\n * Duplicates an existing block by copying all its fields and structure.\n * This method creates a deep copy of the block at the mutator level.\n *\n * @param originalBlockId id of the block to duplicate\n * @param newBlockId id for the new duplicated block\n * @param after id of the block to insert new block after\n */\n public duplicateBlock(originalBlockId: string, newBlockId: string, after?: string): void {\n // Get the original block from structure\n const originalBlock = this.getBlock(originalBlockId);\n const originalBlockInfo = this.getBlockInfo(originalBlockId);\n\n // Create new block in structure\n const newBlock: Block = {\n id: newBlockId,\n label: originalBlock.label,\n renderingMode: originalBlock.renderingMode,\n };\n\n // Add the new block to structure\n const newStruct = this.structure; // copy current structure\n if (after === undefined) {\n // adding as a very last block\n newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);\n } else {\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === after);\n if (idx < 0) continue;\n group.blocks.splice(idx + 1, 0, newBlock);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${after}`);\n }\n\n this.updateStructure(newStruct, (blockId) => {\n if (blockId !== newBlockId) throw new Error('Unexpected');\n this.initializeBlockDuplicate(blockId, originalBlockInfo);\n });\n }\n\n public deleteBlock(blockId: string): void {\n const newStruct = this.structure; // copy current structure\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === blockId);\n if (idx < 0) continue;\n group.blocks.splice(idx, 1);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${blockId}`);\n this.updateStructure(newStruct);\n }\n\n //\n // Block-pack migration\n //\n\n public migrateBlockPack(blockId: string, spec: BlockPackSpecPrepared, newArgsAndUiState?: ArgsAndUiState): void {\n const info = this.getBlockInfo(blockId);\n\n this.setBlockField(\n blockId,\n 'blockPack',\n Pl.wrapInHolder(this.tx, createBlockPack(this.tx, spec)),\n 'NotReady',\n );\n\n if (newArgsAndUiState !== undefined) {\n // this will also reset all downstream stagings\n this.setStates([{ blockId, args: newArgsAndUiState.args, uiState: newArgsAndUiState.uiState }]);\n } else {\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', [blockId], ({ id }) => this.resetStaging(id));\n }\n\n // also reset or limbo all downstream productions\n if (info.productionRendered)\n this.getActualProductionGraph().traverse('downstream', [blockId], ({ id }) =>\n this.resetOrLimboProduction(id),\n );\n\n this.updateLastModified();\n }\n\n //\n // Render\n //\n\n public renderProduction(blockIds: string[], addUpstreams: boolean = false): Set<string> {\n const blockIdsSet = new Set(blockIds);\n\n const prodGraph = this.getPendingProductionGraph();\n if (addUpstreams)\n // adding all upstreams automatically\n prodGraph.traverse('upstream', blockIds, (node) => {\n blockIdsSet.add(node.id);\n });\n else // checking that targets contain all upstreams\n for (const blockId of blockIdsSet) {\n const node = prodGraph.nodes.get(blockId);\n if (node === undefined) throw new Error(`Can't find block with id: ${blockId}`);\n for (const upstream of node.upstream)\n if (!blockIdsSet.has(upstream))\n throw new Error('Can\\'t render blocks not including all upstreams.');\n }\n\n // traversing in topological order and rendering target blocks\n const rendered = new Set<string>();\n for (const block of allBlocks(this.structure)) {\n if (!blockIdsSet.has(block.id)) continue;\n\n let render\n = this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);\n\n if (!render)\n for (const upstream of prodGraph.nodes.get(block.id)!.upstream)\n if (rendered.has(upstream)) {\n render = true;\n break;\n }\n\n if (render) {\n this.renderProductionFor(block.id);\n rendered.add(block.id);\n }\n }\n\n const renderedArray = [...rendered];\n\n // sending to limbo all downstream blocks\n prodGraph.traverse('downstream', renderedArray, (node) => {\n if (rendered.has(node.id))\n // don't send to limbo blocks that were just rendered\n return;\n this.resetOrLimboProduction(node.id);\n });\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', renderedArray, ({ id }) => {\n // don't reset staging of the first rendered block\n if (renderedArray[0] !== id) this.resetStaging(id);\n });\n\n if (rendered.size > 0) this.updateLastModified();\n\n return rendered;\n }\n\n /** Stops running blocks from the list and modify states of other blocks\n * accordingly */\n public stopProduction(...blockIds: string[]) {\n const activeProdGraph = this.getActualProductionGraph();\n\n // we will stop all blocks listed in request and all their downstreams\n const queue = new Denque(blockIds);\n const queued = new Set(blockIds);\n const stopped: string[] = [];\n\n while (!queue.isEmpty()) {\n const blockId = queue.shift()!;\n const fields = this.getBlockInfo(blockId).fields;\n\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready')\n // skipping finished blocks\n continue;\n\n if (this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs')) {\n // was actually stopped\n stopped.push(blockId);\n\n // will try to stop all its downstreams\n for (const downstream of activeProdGraph.traverseIdsExcludingRoots('downstream', blockId)) {\n if (queued.has(downstream)) continue;\n queue.push(downstream);\n queued.add(downstream);\n }\n }\n }\n\n // blocks under stopped blocks, but still having results, goes to limbo\n for (const blockId of activeProdGraph.traverseIdsExcludingRoots('downstream', ...stopped))\n this.resetOrLimboProduction(blockId);\n }\n\n private traverseWithStagingLag(cb: (blockId: string, lag: number) => void) {\n const lags = new Map<string, number>();\n const stagingGraph = this.getStagingGraph();\n stagingGraph.nodes.forEach((node) => {\n const info = this.getBlockInfo(node.id);\n let lag = info.stagingRendered ? 0 : 1;\n node.upstream.forEach((upstream) => {\n const upstreamLag = lags.get(upstream)!;\n if (upstreamLag === 0) return;\n lag = Math.max(upstreamLag + 1, lag);\n });\n cb(node.id, lag);\n lags.set(node.id, lag);\n });\n }\n\n /** @param stagingRenderingRate rate in blocks per second */\n private refreshStagings(stagingRenderingRate?: number) {\n const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;\n const lagThreshold\n = stagingRenderingRate === undefined\n ? undefined\n : 1 + Math.max(0, (elapsed * stagingRenderingRate) / 1000);\n let rendered = 0;\n this.traverseWithStagingLag((blockId, lag) => {\n if (lag === 0)\n // meaning staging already rendered\n return;\n if (lagThreshold === undefined || lag <= lagThreshold) {\n this.renderStagingFor(blockId);\n rendered++;\n }\n });\n if (rendered > 0) this.resetStagingRefreshTimestamp();\n }\n\n //\n // Meta\n //\n\n /** Updates project metadata */\n public setMeta(meta: ProjectMeta): void {\n this.meta = meta;\n this.metaChanged = true;\n this.updateLastModified();\n }\n\n //\n // Maintenance\n //\n\n /** @param stagingRenderingRate rate in blocks per second */\n public doRefresh(stagingRenderingRate?: number) {\n this.refreshStagings(stagingRenderingRate);\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodCtx?.status === 'Ready'\n && blockInfo.fields.prodOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious',\n );\n if (\n blockInfo.fields.stagingCtx?.status === 'Ready'\n && blockInfo.fields.stagingOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'stagingOutputPrevious',\n 'stagingCtxPrevious',\n 'stagingUiCtxPrevious',\n );\n });\n }\n\n private assignAuthorMarkers() {\n const markerStr = this.author ? JSON.stringify(this.author) : undefined;\n\n for (const blockId of this.blocksWithChangedInputs)\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, blockArgsAuthorKey(blockId));\n else this.tx.setKValue(this.rid, blockArgsAuthorKey(blockId), markerStr);\n\n if (this.metaChanged || this.structureChanged) {\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, ProjectStructureAuthorKey);\n else this.tx.setKValue(this.rid, ProjectStructureAuthorKey, markerStr);\n }\n }\n\n public save() {\n if (!this.wasModified) return;\n\n if (this.lastModifiedChanged)\n this.tx.setKValue(this.rid, ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));\n\n if (this.structureChanged)\n this.tx.setKValue(this.rid, ProjectStructureKey, JSON.stringify(this.struct));\n\n if (this.renderingStateChanged)\n this.tx.setKValue(\n this.rid,\n BlockRenderingStateKey,\n JSON.stringify({\n ...this.renderingState,\n blocksInLimbo: [...this.blocksInLimbo],\n } as ProjectRenderingState),\n );\n\n if (this.metaChanged) this.tx.setKValue(this.rid, ProjectMetaKey, JSON.stringify(this.meta));\n\n this.assignAuthorMarkers();\n }\n\n public static async load(\n projectHelper: ProjectHelper,\n tx: PlTransaction,\n rid: ResourceId,\n author?: AuthorMarker,\n ): Promise<ProjectMutator> {\n //\n // Sending initial requests to read project state (start of round-trip #1)\n //\n\n const fullResourceStateP = tx.getResourceData(rid, true);\n const schemaP = tx.getKValueJson<string>(rid, SchemaVersionKey);\n const lastModifiedP = tx.getKValueJson<number>(rid, ProjectLastModifiedTimestamp);\n const metaP = tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey);\n const structureP = tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey);\n const renderingStateP = tx.getKValueJson<ProjectRenderingState>(rid, BlockRenderingStateKey);\n\n const fullResourceState = await fullResourceStateP;\n\n // loading field information\n const blockInfoStates = new Map<string, BlockInfoState>();\n for (const f of fullResourceState.fields) {\n const projectField = parseProjectField(f.name);\n\n // processing only fields with known structure\n if (projectField === undefined) continue;\n\n let info = blockInfoStates.get(projectField.blockId);\n if (info === undefined) {\n info = {\n id: projectField.blockId,\n fields: {},\n };\n blockInfoStates.set(projectField.blockId, info);\n }\n\n info.fields[projectField.fieldName] = isNullResourceId(f.value)\n ? { modCount: 0 }\n : { modCount: 0, ref: f.value };\n }\n\n //\n // Roundtrip #1 not yet finished, but as soon as field list is received,\n // we can start sending requests to read states of referenced resources\n // (start of round-trip #2)\n //\n\n const blockFieldRequests: [BlockInfoState, ProjectField['fieldName'], BlockFieldState, Promise<BasicResourceData | ResourceData>][] = [];\n blockInfoStates.forEach((info) => {\n const fields = info.fields;\n for (const [fName, state] of Object.entries(fields)) {\n if (state.ref === undefined) continue;\n if (!isResource(state.ref) || isResourceRef(state.ref))\n throw new Error('unexpected behaviour');\n const fieldName = fName as ProjectField['fieldName'];\n blockFieldRequests.push([\n info, fieldName,\n state, tx.getResourceData(state.ref, fieldName == 'blockPack')]);\n }\n });\n\n // loading jsons\n const [\n schema,\n lastModified,\n meta,\n structure,\n { stagingRefreshTimestamp, blocksInLimbo },\n ] = await Promise.all([\n schemaP,\n lastModifiedP,\n metaP,\n structureP,\n renderingStateP,\n ]);\n\n // Checking schema version of the project\n if (schema !== SchemaVersionCurrent) {\n if (Number(schema) < Number(SchemaVersionCurrent))\n throw new UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);\n else\n throw new UiError(`Can't perform this action on this project because it has newer schema. Upgrade your desktop app to the latest version.`);\n }\n\n //\n // <- at this point we have all the responses from round-trip #1\n //\n\n //\n // Receiving responses from round-trip #2 and sending requests to read block pack descriptions\n // (start of round-trip #3)\n //\n\n const blockPackRequests: [BlockInfoState, Promise<BasicResourceData>][] = [];\n for (const [info, fieldName, state, response] of blockFieldRequests) {\n const result = await response;\n state.value = result.data;\n if (isNotNullResourceId(result.error)) state.status = 'Error';\n else if (result.resourceReady || isNotNullResourceId(result.originalResourceId))\n state.status = 'Ready';\n else state.status = 'NotReady';\n\n // For block pack we need to traverse the ref field from the resource data\n if (fieldName === 'blockPack') {\n const refField = (result as ResourceData).fields.find((f) => f.name === Pl.HolderRefField);\n if (refField === undefined)\n throw new Error('Block pack ref field is missing');\n blockPackRequests.push([info, tx.getResourceData(ensureResourceIdNotNull(refField.value), false)]);\n }\n }\n\n //\n // <- at this point we have all the responses from round-trip #2\n //\n\n for (const [info, response] of blockPackRequests) {\n const result = await response;\n const bpInfo = cachedDeserialize<BlockPackInfo>(notEmpty(result.data));\n info.blockConfig = extractConfig(bpInfo.config);\n info.blockPack = bpInfo.source;\n }\n\n //\n // <- at this point we have all the responses from round-trip #3\n //\n\n // loading ctx export template to check if we already have cached materialized template in our project\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n\n // expected field name\n const ctxExportTplCacheFieldName = getServiceTemplateField(ctxExportTplEnvelope.hash);\n const ctxExportTplField = fullResourceState.fields.find(\n (f) => f.name === ctxExportTplCacheFieldName,\n );\n let ctxExportTplHolder: AnyResourceRef;\n if (ctxExportTplField !== undefined)\n ctxExportTplHolder = ensureResourceIdNotNull(ctxExportTplField.value);\n else {\n ctxExportTplHolder = Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec));\n tx.createField(\n field(rid, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n ctxExportTplHolder,\n );\n }\n\n const renderingState = { stagingRefreshTimestamp };\n const blocksInLimboSet = new Set(blocksInLimbo);\n\n const blockInfos = new Map<string, BlockInfo>();\n blockInfoStates.forEach(({ id, fields, blockConfig, blockPack }) => blockInfos.set(id,\n new BlockInfo(id, fields, notEmpty(blockConfig), notEmpty(blockPack))));\n\n // check consistency of project state\n const blockInStruct = new Set<string>();\n for (const b of allBlocks(structure)) {\n if (!blockInfos.has(b.id))\n throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);\n blockInStruct.add(b.id);\n }\n blockInfos.forEach((info) => {\n if (!blockInStruct.has(info.id))\n throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);\n // checking structure\n info.check();\n });\n\n const prj = new ProjectMutator(\n rid,\n tx,\n author,\n schema,\n lastModified,\n meta,\n structure,\n renderingState,\n blocksInLimboSet,\n blockInfos,\n ctxExportTplHolder,\n projectHelper,\n );\n\n prj.fixProblemsAndMigrate();\n\n return prj;\n }\n}\n\nexport interface ProjectState {\n schema: string;\n structure: ProjectStructure;\n renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>;\n blocksInLimbo: Set<string>;\n blockInfos: Map<string, BlockInfo>;\n}\n\nexport async function createProject(\n tx: PlTransaction,\n meta: ProjectMeta = InitialBlockMeta,\n): Promise<AnyResourceRef> {\n const prj = tx.createEphemeral(ProjectResourceType);\n tx.lock(prj);\n const ts = String(Date.now());\n tx.setKValue(prj, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n tx.setKValue(prj, ProjectCreatedTimestamp, ts);\n tx.setKValue(prj, ProjectLastModifiedTimestamp, ts);\n tx.setKValue(prj, ProjectMetaKey, JSON.stringify(meta));\n tx.setKValue(prj, ProjectStructureKey, JSON.stringify(InitialBlockStructure));\n tx.setKValue(prj, BlockRenderingStateKey, JSON.stringify(InitialProjectRenderingState));\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n tx.createField(\n field(prj, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec)),\n );\n return prj;\n}\n\nexport async function withProject<T>(\n projectHelper: ProjectHelper,\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n cb: (p: ProjectMutator) => T | Promise<T>,\n): Promise<T> {\n return withProjectAuthored(projectHelper, txOrPl, rid, undefined, cb);\n}\n\nexport async function withProjectAuthored<T>(\n projectHelper: ProjectHelper,\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n author: AuthorMarker | undefined,\n cb: (p: ProjectMutator) => T | Promise<T>,\n): Promise<T> {\n if (txOrPl instanceof PlClient) {\n return await txOrPl.withWriteTx('ProjectAction', async (tx) => {\n const mut = await ProjectMutator.load(projectHelper, tx, rid, author);\n const result = await cb(mut);\n if (!mut.wasModified)\n // skipping save and commit altogether if no modifications were actually made\n return result;\n mut.save();\n await tx.commit();\n if (getDebugFlags().logProjectMutationStat) console.log(JSON.stringify(tx.stat));\n return result;\n });\n } else {\n const mut = await ProjectMutator.load(projectHelper, txOrPl, rid, author);\n const result = await cb(mut);\n mut.save();\n return result;\n }\n}\n","import type { BinaryChunk, DataInfo, JsonDataInfo, PColumnSpec, PColumnValue, PColumnValues, PlRef, PObjectId, PObjectSpec } from '@platforma-sdk/model';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport {\n isNullResourceId,\n resourceType,\n resourceTypeToString,\n resourceTypesEqual,\n} from '@milaboratories/pl-client';\nimport type { Writable } from 'utility-types';\nimport { createHash } from 'node:crypto';\n\nexport function* allBlobs<B>(data: DataInfo<B>): Generator<B> {\n switch (data.type) {\n case 'Json':\n return;\n case 'JsonPartitioned':\n for (const [, blob] of Object.entries(data.parts)) yield blob;\n return;\n case 'BinaryPartitioned':\n for (const [, { index, values }] of Object.entries(data.parts)) {\n yield index;\n yield values;\n }\n return;\n default:\n assertNever(data);\n }\n}\n\nfunction mapValues<T extends object, TResult>(\n obj: T,\n callback: (v: T[keyof T], key: keyof T) => TResult,\n): { [K in keyof T]: TResult } {\n return Object.fromEntries(\n (Object.entries(obj) as { [K in keyof T]: [K, T[K]]; }[keyof T][])\n .map(([key, value]) => [key, callback(value, key)]),\n ) as { [K in keyof T]: TResult };\n}\n\nexport function mapBlobs<B1, B2>(\n data: DataInfo<B1>,\n mapping: (blob: B1) => B2,\n): DataInfo<B2> {\n switch (data.type) {\n case 'Json':\n return { ...data };\n case 'JsonPartitioned':\n return { ...data, parts: mapValues(data.parts, mapping) };\n case 'BinaryPartitioned':\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: mapping(v.index),\n values: mapping(v.values),\n })),\n };\n default:\n assertNever(data);\n }\n}\n\nexport const PColumnDataJsonPartitioned = resourceType('PColumnData/JsonPartitioned', '1');\nexport const PColumnDataJsonSuperPartitioned = resourceType(\n 'PColumnData/Partitioned/JsonPartitioned',\n '1',\n);\nexport const PColumnDataBinaryPartitioned = resourceType('PColumnData/BinaryPartitioned', '1');\nexport const PColumnDataBinarySuperPartitioned = resourceType(\n 'PColumnData/Partitioned/BinaryPartitioned',\n '1',\n);\nexport const PColumnDataJson = resourceType('PColumnData/Json', '1');\n\nexport type PColumnDataJsonResourceValue = {\n keyLength: number;\n data: Record<string, PColumnValue>;\n};\n\nexport type PColumnDataPartitionedResourceValue = {\n partitionKeyLength: number;\n};\n\nexport type PColumnDataSuperPartitionedResourceValue = {\n superPartitionKeyLength: number;\n partitionKeyLength: number;\n};\n\nexport function parseDataInfoResource(\n data: PlTreeNodeAccessor,\n): DataInfo<ResourceInfo> {\n if (!data.getIsReadyOrError()) throw new Error('Data not ready.');\n\n const resourceData = data.getDataAsJson();\n if (resourceData === undefined)\n throw new Error('unexpected data info structure, no resource data');\n\n if (resourceTypesEqual(data.resourceType, PColumnDataJson)) {\n const dataContent = resourceData as PColumnDataJsonResourceValue;\n\n return {\n type: 'Json',\n keyLength: dataContent.keyLength,\n data: dataContent.data,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts = Object.fromEntries(\n data\n .listInputFields()\n .map((field) => [field, data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo]),\n );\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonSuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<string, ResourceInfo> = {};\n for (const superKey of data.listInputFields()) {\n const superPart = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superPart.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const key of keys) {\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PColumnValue[],\n ...JSON.parse(key) as PColumnValue[]]);\n parts[partKey] = superPart.traverse({ field: key, errorIfFieldNotSet: true }).resourceInfo;\n }\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinaryPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<BinaryChunk<ResourceInfo>>>\n > = {};\n\n // parsing the structure\n for (const field of data.listInputFields()) {\n if (field.endsWith('.index')) {\n const partKey = field.slice(0, field.length - 6);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.index = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const partKey = field.slice(0, field.length - 7);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.values = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n\n // structure validation\n for (const [key, part] of Object.entries(parts)) {\n if (part.index === undefined) throw new Error(`no index for part ${key}`);\n if (part.values === undefined) throw new Error(`no values for part ${key}`);\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts: parts as Record<string, BinaryChunk<ResourceInfo>>,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinarySuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<BinaryChunk<ResourceInfo>>>\n > = {};\n for (const superKey of data.listInputFields()) {\n const superData = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superData.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const field of keys) {\n if (field.endsWith('.index')) {\n const key = field.slice(0, field.length - 6);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PColumnValue[],\n ...JSON.parse(key) as PColumnValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].index = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const key = field.slice(0, field.length - 7);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PColumnValue[],\n ...JSON.parse(key) as PColumnValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].values = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts: parts as Record<string, BinaryChunk<ResourceInfo>>,\n };\n }\n\n throw new Error(`unsupported resource type: ${resourceTypeToString(data.resourceType)}`);\n}\n\nexport function makeDataInfoFromPColumnValues(\n spec: PColumnSpec,\n data: PColumnValues,\n): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength)\n throw new Error(`inline column key length ${key.length} differs from axes count ${keyLength}`);\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: 'Json',\n keyLength,\n data: jsonData,\n };\n}\n\nexport function deriveLegacyPObjectId(spec: PObjectSpec, data: PlTreeNodeAccessor): PObjectId {\n const hash = createHash('sha256');\n hash.update(canonicalize(spec)!);\n hash.update(String(!isNullResourceId(data.originalId) ? data.originalId : data.id));\n return hash.digest().toString('hex') as PObjectId;\n}\n\nexport function deriveGlobalPObjectId(blockId: string, exportName: string): PObjectId {\n return canonicalize({ __isRef: true, blockId, name: exportName } satisfies PlRef)! as PObjectId;\n}\n\nexport function deriveLocalPObjectId(resolvePath: string[], outputName: string): PObjectId {\n return canonicalize({ resolvePath, name: outputName })! as PObjectId;\n}\n","import { type PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type { PObject, PObjectSpec, ValueOrError } from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport assert from 'node:assert';\nimport type { Writable } from 'utility-types';\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from './data';\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n}\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = '',\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as 'spec' | 'data';\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case 'spec':\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors,\n })\n ?.getDataAsJson();\n break;\n case 'data':\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n });\n break;\n default:\n // other value types planned\n break;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = '',\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error('resource is not ready');\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw data.error;\n collection[outputName] = {\n id: resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value,\n };\n }\n return collection;\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError } from '@platforma-sdk/model';\nimport {\n executePSpecPredicate,\n mapValueInVOE,\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { outputRef } from '../model/args';\nimport type {\n Block,\n ProjectStructure } from '../model/project_model';\nimport {\n ProjectStructureKey,\n projectFieldName,\n} from '../model/project_model';\nimport { allBlocks, stagingGraph } from '../model/project_model_util';\nimport type { Optional } from 'utility-types';\nimport { deriveGlobalPObjectId } from './data';\nimport type {\n RawPObjectCollection,\n RawPObjectEntry } from './p_object_collection';\nimport {\n parseRawPObjectCollection,\n} from './p_object_collection';\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, 'blockId' | 'name'>;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>,\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n if (block.staging === undefined) this.ctx.markUnstable(`staging_not_rendered:${blockId}`);\n else if (!block.staging.locked) this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string,\n ): ValueOrError<PObject<PlTreeNodeAccessor>, Error> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n const result = block.prod?.results?.get(exportName);\n const data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result.spec!,\n data: value,\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string,\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value,\n },\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker,\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, 'id'>\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, 'id'>\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data,\n },\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n exportsProcessed.add(exportName);\n }\n } else markUnstable(`staging_not_rendered:${blockId}`); // because staging will be inevitably rendered soon\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + ' / ' + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec,\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds('upstream', rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'prodCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'prodUiCtx'),\n stableIfNotFound: true,\n }),\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'stagingCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'stagingUiCtx'),\n }),\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, Error> | undefined,\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { cachedDecode, notEmpty } from '@milaboratories/ts-helpers';\nimport type { Optional } from 'utility-types';\nimport type {\n Block,\n ProjectStructure } from '../model/project_model';\nimport {\n ProjectStructureKey,\n projectFieldName,\n} from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { ResultPool } from '../pool/result_pool';\n\nexport type BlockContextMaterialized = {\n readonly blockId: string;\n readonly args: string;\n readonly uiState?: string;\n};\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly uiState: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n};\n\nexport type BlockContextAny = Optional<BlockContextFull, 'prod' | 'staging' | 'getResultsPool'>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) =>\n cachedDecode(notEmpty(\n cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'currentArgs'),\n errorIfFieldNotSet: true,\n })\n .getData(),\n ));\n const activeArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'prodArgs'),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const uiState = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'uiState'),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n return {\n blockId,\n args,\n activeArgs,\n uiState,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n },\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'prodOutput'),\n stableIfNotFound: true,\n ignoreError: true,\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'stagingOutput'),\n ignoreError: true,\n })\n ?.persist();\n if (result === undefined) cCtx.markUnstable('staging_not_rendered');\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId),\n };\n}\n","import type { Cfg } from '@platforma-sdk/model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function* traverseCfg(cfg: Cfg, guide?: (cfg: Cfg) => boolean): Generator<Cfg> {\n yield cfg;\n if (guide !== undefined && !guide(cfg)) return;\n switch (cfg.type) {\n case 'GetFromCtx':\n case 'Immediate':\n return;\n case 'Isolate':\n yield * traverseCfg(cfg.cfg);\n return;\n case 'MakeObject':\n for (const [, child] of Object.entries(cfg.template)) yield * traverseCfg(child);\n return;\n case 'MakeArray':\n for (const child of cfg.template) yield * traverseCfg(child);\n return;\n case 'GetJsonField':\n case 'GetResourceField':\n yield * traverseCfg(cfg.source);\n yield * traverseCfg(cfg.field);\n return;\n case 'MapRecordValues':\n case 'MapArrayValues':\n case 'MapResourceFields':\n yield * traverseCfg(cfg.source);\n yield * traverseCfg(cfg.mapping);\n return;\n case 'Flatten':\n case 'GetResourceValueAsJson':\n case 'GetBlobContent':\n case 'ExtractArchiveAndGetURL':\n case 'GetBlobContentAsString':\n case 'GetBlobContentAsJson':\n case 'GetDownloadedBlobContent':\n case 'GetOnDemandBlobContent':\n case 'GetImportProgress':\n case 'GetLastLogs':\n case 'GetProgressLog':\n case 'GetProgressLogWithInfo':\n case 'GetLogHandle':\n yield * traverseCfg(cfg.source);\n return;\n case 'IsEmpty':\n yield * traverseCfg(cfg.arg);\n return;\n case 'Not':\n yield * traverseCfg(cfg.operand);\n return;\n case 'And':\n case 'Or':\n yield * traverseCfg(cfg.operand1);\n yield * traverseCfg(cfg.operand2);\n return;\n default:\n assertNever(cfg);\n }\n}\n","import type { Cfg } from '@platforma-sdk/model';\nimport { traverseCfg } from './traverse';\n\nexport function mapRecord<T1, T2, Key extends string>(\n obj: Record<Key, T1>,\n mapper: (value: T1) => T2,\n): Record<Key, T2> {\n const result = {} as Record<Key, T2>;\n for (const [key, value] of Object.entries(obj)) result[key as Key] = mapper(value as T1);\n return result;\n}\n\nexport function ifNotUndef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\nfunction isActiveCfg(cfg: Cfg): boolean {\n switch (cfg.type) {\n case 'GetImportProgress':\n return true;\n default:\n return false;\n }\n}\n\nexport function hasActiveCfgComponents(cfg: Cfg): boolean {\n for (const nested of traverseCfg(cfg)) if (isActiveCfg(nested)) return true;\n return false;\n}\n","import type {\n ArchiveFormat,\n Cfg,\n CfgMapArrayValues,\n CfgMapRecordValues,\n CfgMapResourceFields,\n RangeBytes,\n} from '@platforma-sdk/model';\nimport type { ArgumentRequests, Operation, OperationAction, Subroutine } from './operation';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { mapRecord } from './util';\nimport { computableFromCfgUnsafe } from './executor';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport type { ComputableCtx } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\n\nfunction res(result: unknown): OperationAction {\n return {\n type: 'ReturnResult',\n result: result,\n };\n}\n\nexport function resOp(result: unknown): Operation {\n return () => res(result);\n}\n\n//\n// Subroutines\n//\n\nconst SRMakeObject: Subroutine = (args) => {\n const result: Record<string | symbol, unknown> = {};\n for (const [k, v] of Object.entries(args)) result[k] = v;\n return resOp(result);\n};\n\nconst SRFlatten: Subroutine = (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n const result: unknown[] = [];\n for (const nested of source) {\n if (nested instanceof Array) result.push(...(nested as unknown[]));\n else result.push(nested);\n }\n return resOp(result);\n};\n\nconst SRGetResourceField: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return ({ cCtx }) => {\n return res(cCtx.accessor(source).node().traverse(field)?.persist());\n };\n};\n\nfunction mapArrayToRecord<T, R>(elements: T[], cb: (e: T) => R): Record<string, R> {\n const result: Record<string, R> = {};\n const length = elements.length;\n for (let i = 0; i < length; i++) result[String(i)] = cb(elements[i]);\n return result;\n}\n\nfunction SRMapArrayValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapArrayValues, 'itVar' | 'mapping'>,\n): Subroutine {\n return (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(source.length),\n args: mapArrayToRecord(source, (e) => renderCfg({ ...ctx, [ops.itVar]: e }, ops.mapping)),\n });\n };\n}\n\nfunction SRCollectArrayFromArgs(length: number): Subroutine {\n return (args) => {\n const result: unknown[] = [];\n for (let i = 0; i < length; i++) result.push(args[String(i)]);\n return resOp(result);\n };\n}\n\nfunction SRMapRecordValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapRecordValues, 'itVar' | 'mapping'>,\n): Subroutine {\n return (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n if (source === undefined) return resOp(undefined);\n const nextArgs: ArgumentRequests = {};\n for (const [k, v] of Object.entries(source)) {\n const newCtx = { ...ctx, [ops.itVar]: v };\n nextArgs[k] = renderCfg(newCtx, ops.mapping);\n }\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues2,\n args: nextArgs,\n });\n };\n}\n\nconst SRMapRecordValues2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRIsEmpty: Subroutine = (args) => {\n const arg = args.arg as unknown[] | string | undefined;\n if (arg === undefined) return resOp(undefined);\n return resOp(arg.length === 0);\n};\n\nconst SRNot: Subroutine = (args) => {\n const operand = args.operand as boolean | undefined;\n if (operand === undefined) return resOp(undefined);\n return resOp(!operand);\n};\n\nconst SRAnd: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 && operand2);\n};\n\nconst SROr: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 || operand2);\n};\n\nconst SRResourceValueAsJson: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n return ({ cCtx }) => res(cCtx.accessor(source).node()?.getDataAsJson());\n};\n\nconst SRGetJsonField: Subroutine = (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return resOp(source[field]);\n};\n\nfunction SRMapResourceFields1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapResourceFields, 'itVar' | 'mapping'>,\n): Subroutine {\n return (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx }) => {\n const node = cCtx.accessor(source).node();\n\n const nextArgs: ArgumentRequests = {};\n for (const fieldName of node.listInputFields()) {\n const res = node.traverse(fieldName);\n if (res === undefined) nextArgs[fieldName] = resOp(undefined);\n else {\n const newCtx = { ...ctx, [ops.itVar]: res.persist() };\n nextArgs[fieldName] = renderCfg(newCtx, ops.mapping);\n }\n }\n\n return {\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields2,\n args: nextArgs,\n };\n };\n };\n}\n\nconst SRMapResourceFields2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRGetBlobContent: (range?: RangeBytes) => Subroutine = (range) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (ctx) => {\n return drivers.blobDriver.getDownloadedBlob(ctx.accessor(source).node().resourceInfo);\n },\n {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return await drivers.blobDriver.getContent(value.handle, range);\n },\n },\n ),\n };\n };\n};\n\nconst SRGetBlobContentAsString: (range?: RangeBytes) => Subroutine = (range) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx, drivers }) => {\n // getting target resource id and type\n const resourceInfo = cCtx.accessor(source).node().resourceInfo;\n\n return {\n type: 'ScheduleComputable',\n computable: Computable.make((ctx) => drivers.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle, range);\n return content.toString();\n },\n }),\n };\n };\n};\n\nconst SRGetBlobContentAsJson: (range?: RangeBytes) => Subroutine = (range) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (c) => drivers.blobDriver.getDownloadedBlob(c.accessor(source).node().resourceInfo, c),\n {\n postprocessValue: async (value) => {\n if (value == undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle, range);\n if (content == undefined) return undefined;\n return JSON.parse(Buffer.from(content).toString()) as unknown;\n },\n },\n ),\n };\n };\n};\n\nconst SRGetDownloadedBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return (ctx) => {\n return {\n type: 'ScheduleComputable',\n computable: ctx.drivers.blobDriver.getDownloadedBlob(source),\n };\n };\n};\n\nconst SRGetOnDemandBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobDriver.getOnDemandBlob(source),\n };\n };\n};\n\nconst SRExtractArchiveAndGetURL: (format: ArchiveFormat) => Subroutine = (format) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobToURLDriver.extractArchiveAndGetURL(source, format),\n };\n };\n};\n\nconst SRGetImportProgress: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.uploadDriver.getProgressId(source),\n };\n };\n};\n\nconst SRGetLastLogs: (lines: number) => Subroutine = (lines) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLastLogs(source, lines),\n };\n };\n};\n\nconst SRGetProgressLog: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLog(source, patternToSearch),\n };\n };\n};\n\nconst SRGetProgressLogWithInfo: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLogWithInfo(source, patternToSearch),\n };\n };\n};\n\nconst SRGetLogHandle: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLogHandle(source),\n };\n };\n};\n\n/** Renders configuration into executor's Operation */\nexport function renderCfg(ctx: Record<string, unknown>, cfg: Cfg): Operation {\n switch (cfg.type) {\n case 'GetFromCtx':\n {\n const ctxValue = ctx[cfg.variable];\n if (typeof ctxValue === 'function') {\n return (e) => res((ctxValue as (cCtx: ComputableCtx) => OperationAction)(e.cCtx));\n } else {\n return resOp(ctxValue);\n }\n }\n\n case 'Isolate':\n return ({ drivers }) => ({\n type: 'ScheduleComputable',\n computable: computableFromCfgUnsafe(drivers, ctx, cfg.cfg),\n });\n\n case 'Immediate':\n return resOp(cfg.value);\n\n case 'GetJsonField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetJsonField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field),\n },\n });\n\n case 'MapArrayValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapArrayValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'MapRecordValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'MakeObject':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMakeObject,\n args: mapRecord(cfg.template, (c) => renderCfg(ctx, c)),\n });\n\n case 'MakeArray':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(cfg.template.length),\n args: mapArrayToRecord(cfg.template, (e) => renderCfg(ctx, e)),\n });\n\n case 'Flatten':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRFlatten,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'IsEmpty':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRIsEmpty,\n args: {\n arg: renderCfg(ctx, cfg.arg),\n },\n });\n\n case 'Not':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRNot,\n args: {\n operand: renderCfg(ctx, cfg.operand),\n },\n });\n\n case 'And':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRAnd,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2),\n },\n });\n\n case 'Or':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SROr,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2),\n },\n });\n\n case 'MapResourceFields':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetResourceField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetResourceField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field),\n },\n });\n\n case 'GetResourceValueAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRResourceValueAsJson,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContent(cfg.range),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetBlobContentAsString':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsString(cfg.range),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetBlobContentAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsJson(cfg.range),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetDownloadedBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetDownloadedBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetOnDemandBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetOnDemandBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'ExtractArchiveAndGetURL':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRExtractArchiveAndGetURL(cfg.format),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetImportProgress':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetImportProgress,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetLastLogs':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLastLogs(cfg.lines),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetProgressLog':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLog(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetProgressLogWithInfo':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLogWithInfo(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n case 'GetLogHandle':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLogHandle,\n args: {\n source: renderCfg(ctx, cfg.source),\n },\n });\n\n default:\n return assertNever(cfg);\n }\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type { PlResourceEntry, StdCtx } from '@platforma-sdk/model';\nimport type { BlockContextAny } from './block_ctx';\n\ntype SC = StdCtx<unknown, unknown>;\ntype SCAO = Pick<SC, '$blockId' | '$ui' | '$args'>;\nexport type MatStdCtxArgsOnly = {\n [Var in keyof SCAO]: SCAO[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SCAO[Var];\n};\nexport type MatStdCtx = {\n [Var in keyof SC]: SC[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SC[Var];\n};\n\nexport const NonKeyCtxFields = ['$prod', '$staging'];\n\nexport function toCfgContext(ctx: BlockContextAny): MatStdCtx {\n return {\n $blockId: ctx.blockId,\n $args: (cCtx: ComputableCtx) => JSON.parse(ctx.args(cCtx)) as unknown,\n $ui: (cCtx: ComputableCtx) => {\n const uiState = ctx.uiState(cCtx);\n return uiState !== undefined ? JSON.parse(uiState) as unknown : undefined;\n },\n $prod: ctx.prod,\n $staging: ctx.staging,\n };\n}\n","import type {\n ArgumentKey,\n ArgumentValues,\n ExecutionEnvironment,\n Operation,\n Subroutine,\n} from './operation';\nimport Denque from 'denque';\nimport { assertNever, notEmpty } from '@milaboratories/ts-helpers';\nimport type { ComputableCtx, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { Cfg } from '@platforma-sdk/model';\nimport { renderCfg, resOp } from './renderer';\nimport canonicalize from 'canonicalize';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerDriverKit } from '../middle_layer/driver_kit';\nimport { NonKeyCtxFields, toCfgContext } from '../middle_layer/block_ctx_unsafe';\n\n/** Addresses pending subroutines inside the stack */\ntype SubroutineKey = symbol;\n\n/** Represents destination of the result of an operation. I.e. when sequence of\n * subroutine invocations, and computables terminates with result, this object\n * determines to which argument of which pending subroutine it should be delivered.\n * See special value for delivery of the final \"return\" result. */\ntype Destination = {\n op: SubroutineKey;\n arg: ArgumentKey;\n};\n\n/** Special address of operation, see below. */\nconst ReturnOpKey: unique symbol = Symbol();\n/** The same, but for the argument part of destination, see below. */\nconst ReturnArgKey = 'return';\n\n/** Special destination, telling the executor that corresponding result should\n * be exposed as a final result, and execution terminate at this point. */\nconst ReturnDestination = { op: ReturnOpKey, arg: ReturnArgKey } as Destination;\n\nfunction isReturnDestination(destination: Destination): boolean {\n return destination.op == ReturnOpKey && destination.arg == ReturnArgKey;\n}\n\n/** Queued operation, used inside the executor */\ntype QueuedOperation = {\n operation: Operation;\n destination: Destination;\n};\n\n/** Queued computation, returned by the first round of config execution. Such\n * computables should be returned in the intermediate representation of the\n * enclosing computable, and after they are resolved and passed to the\n * postprocessing routine, should be injected into the execution stack to\n * finalize the computation. */\ntype ScheduledComputable = {\n destination: Destination;\n computable: Computable<unknown>;\n};\n\n/** This is what ScheduledComputable transforms from intermediate\n * representation to post-processing. */\ntype MaterializedComputable = {\n destination: Destination;\n computable: unknown;\n};\n\n/** Main entry inside the execution stack. */\ntype PendingSubroutine = {\n subroutine: Subroutine;\n destination: Destination;\n argCounter: number;\n args: ArgumentValues;\n};\n\n/** Execution stack. The closest concept that this object along with enclosed\n * {@link PendingSubroutine}s represent is a Continuation.\n * https://en.wikipedia.org/wiki/Continuation */\ntype ExecutionStack = {\n result?: unknown;\n pendingSubroutines: Map<SubroutineKey, PendingSubroutine>;\n};\n\n/** Returns initial stack value. */\nfunction zeroStack(): ExecutionStack {\n return { pendingSubroutines: new Map<SubroutineKey, PendingSubroutine>() };\n}\n\n/** Implements main executor mechanism.\n * @param env to be passed to while executing operations\n * @param stack execution stack to continue execution from\n * @param operations operations to initiate the execution process\n * @param allowComputables if false, scheduling of async computables will result in error\n * */\nfunction execute(\n env: ExecutionEnvironment,\n stack: ExecutionStack,\n operations: QueuedOperation[],\n allowComputables: boolean,\n): ScheduledComputable[] {\n const operationQueue = new Denque<QueuedOperation>(operations);\n\n /** Returns false if final result is set as result of this operation,\n * true if we should continue processing. */\n const deliverResult = (destination: Destination, result: unknown): boolean => {\n if (isReturnDestination(destination)) {\n stack.result = result;\n return false;\n }\n\n const pending = notEmpty(stack.pendingSubroutines.get(destination.op));\n if (destination.arg in pending.args) throw new Error('argument already set');\n pending.args[destination.arg] = result;\n pending.argCounter--;\n if (pending.argCounter === 0) {\n stack.pendingSubroutines.delete(destination.op);\n operationQueue.push({\n destination: pending.destination,\n operation: pending.subroutine(pending.args),\n });\n }\n\n return true;\n };\n\n // computables, scheduled during computation, are aggregated in this array,\n // and returned from the function in the end\n const computables: ScheduledComputable[] = [];\n\n // each loop = execution of a single queued operation\n mainLoop: while (operationQueue.length > 0) {\n const op = operationQueue.shift()!;\n const action = op.operation(env);\n switch (action.type) {\n case 'ReturnResult':\n if (!deliverResult(op.destination, action.result)) break mainLoop; // this terminates execution\n break; // switch\n\n case 'ScheduleSubroutine':\n {\n const newOpKey = Symbol();\n\n const argRequests = Object.entries(action.args);\n const initialArgCounter = argRequests.length;\n\n if (initialArgCounter === 0)\n // if no pending arguments\n operationQueue.push({\n destination: op.destination,\n operation: action.subroutine({}),\n });\n else {\n for (const [arg, operation] of argRequests)\n operationQueue.push({\n destination: { op: newOpKey, arg },\n operation,\n });\n\n stack.pendingSubroutines.set(newOpKey, {\n argCounter: initialArgCounter,\n args: {},\n subroutine: action.subroutine,\n destination: op.destination,\n });\n }\n }\n break;\n\n case 'ScheduleComputable':\n if (!allowComputables)\n throw new Error('asynchronous operations are forbidden in this context');\n computables.push({\n destination: op.destination,\n computable: action.computable,\n });\n break;\n\n default:\n assertNever(action);\n }\n }\n\n return computables;\n}\n\n//\n// Computable\n//\n\n/** Main method to render configurations */\nexport function computableFromCfg(\n drivers: MiddleLayerDriverKit,\n bCtx: BlockContextAny,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n return computableFromCfgUnsafe(drivers, toCfgContext(bCtx), cfg, ops);\n}\n\nexport function computableFromCfgUnsafe(\n drivers: MiddleLayerDriverKit,\n ctx: Record<string, unknown>,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n const key\n = `${ctx.blockId}#`\n + canonicalize({\n ctx: Object.fromEntries(\n Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1),\n ),\n cfg: cfg,\n })!;\n return Computable.makeRaw(\n (c) => {\n const env: ExecutionEnvironment = { drivers, cCtx: c };\n const stack = zeroStack();\n const computables = execute(\n env,\n stack,\n [\n {\n destination: ReturnDestination,\n operation: renderCfg(ctx, cfg),\n },\n ],\n true,\n );\n return {\n ir: computables,\n postprocessValue(value: MaterializedComputable[]): unknown {\n const resolvedOps: QueuedOperation[] = [];\n for (const mc of value)\n resolvedOps.push({ destination: mc.destination, operation: resOp(mc.computable) });\n const postEnv: ExecutionEnvironment = {\n drivers,\n get cCtx(): ComputableCtx {\n throw new Error('asynchronous operations are forbidden in this context');\n },\n };\n\n // Post process can be called several times, that's why it must be a side-effect-free function.\n // But `execute` modifies a stack, so we have to defensively copy it here.\n const copyOfPendingSubrotines = new Map<SubroutineKey, PendingSubroutine>();\n for (const [key, value] of stack.pendingSubroutines)\n copyOfPendingSubrotines.set(key, { ...value, args: { ...value.args } });\n const copiedStack: ExecutionStack = {\n result: stack.result,\n pendingSubroutines: copyOfPendingSubrotines,\n };\n execute(postEnv, copiedStack, resolvedOps, false);\n if (!('result' in copiedStack))\n throw new Error('illegal cfg rendering stack state, no result');\n return copiedStack.result;\n },\n };\n },\n { ...ops, key },\n );\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport {\n checkBlockFlag,\n} from '@platforma-sdk/model';\nimport type {\n ArchiveFormat,\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n DataInfo,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError,\n RangeBytes,\n BlockCodeKnownFeatureFlags,\n\n JsRenderInternal } from '@platforma-sdk/model';\nimport {\n isDataInfo,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE,\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport type { Optional } from 'utility-types';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport type { Block } from '../model/project_model';\nimport { parseFinalPObjectCollection } from '../pool/p_object_collection';\nimport type { ResultPool } from '../pool/result_pool';\nimport type { JsExecutionContext } from './context';\nimport type { VmFunctionImplementation } from 'quickjs-emscripten';\nimport { Scope, type QuickJSHandle } from 'quickjs-emscripten';\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString('base64') : undefined;\n}\n\nexport class ComputableContextHelper\nimplements JsRenderInternal.GlobalCfgRenderCtxMethods<string, string> {\n public readonly computablesToResolve: Record<string, Computable<unknown>> = {};\n\n private computableCtx: ComputableCtx | undefined;\n private readonly accessors = new Map<string, PlTreeNodeAccessor | undefined>();\n\n private readonly meta: Map<string, Block>;\n\n constructor(\n private readonly parent: JsExecutionContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n private readonly featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableCtx: ComputableCtx,\n ) {\n this.computableCtx = computableCtx;\n this.meta = blockCtx.blockMeta(computableCtx);\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\n }\n\n //\n // Methods for injected ctx object\n //\n\n getAccessorHandleByName(name: string): string | undefined {\n if (this.computableCtx === undefined)\n throw new Error('Accessors can\\'t be used in this context');\n const wellKnownAccessor = (name: string, ctxKey: 'staging' | 'prod'): string | undefined => {\n if (!this.accessors.has(name)) {\n const lambda = this.blockCtx[ctxKey];\n if (lambda === undefined) throw new Error('Staging context not available');\n const entry = lambda(this.computableCtx!);\n if (!entry) this.accessors.set(name, undefined);\n else\n this.accessors.set(name, this.computableCtx!.accessor(entry).node({ ignoreError: true }));\n }\n return this.accessors.get(name) ? name : undefined;\n };\n if (name === 'staging') return wellKnownAccessor('staging', 'staging');\n else if (name === 'main') return wellKnownAccessor('main', 'prod');\n return undefined;\n }\n\n //\n // Accessors\n //\n\n resolveWithCommon(\n handle: string,\n commonOptions: CommonFieldTraverseOpsFromSDK,\n ...steps: (FieldTraversalStepFromSDK | string)[]\n ): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).traverseWithCommon(commonOptions, ...steps));\n }\n\n getResourceType(handle: string): ResourceTypeFromSDK {\n return this.getAccessor(handle).resourceType;\n }\n\n getInputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getInputsLocked();\n }\n\n getOutputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getOutputsLocked();\n }\n\n getIsReadyOrError(handle: string): boolean {\n return this.getAccessor(handle).getIsReadyOrError();\n }\n\n getIsFinal(handle: string): boolean {\n return this.getAccessor(handle).getIsFinal();\n }\n\n getError(handle: string): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).getError());\n }\n\n listInputFields(handle: string): string[] {\n return this.getAccessor(handle).listInputFields();\n }\n\n listOutputFields(handle: string): string[] {\n return this.getAccessor(handle).listOutputFields();\n }\n\n listDynamicFields(handle: string): string[] {\n return this.getAccessor(handle).listDynamicFields();\n }\n\n getKeyValueBase64(handle: string, key: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getKeyValue(key));\n }\n\n getKeyValueAsString(handle: string, key: string): string | undefined {\n return this.getAccessor(handle).getKeyValueAsString(key);\n }\n\n getDataBase64(handle: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getData());\n }\n\n getDataAsString(handle: string): string | undefined {\n return this.getAccessor(handle).getDataAsString();\n }\n\n //\n // Accessor helpers\n //\n\n parsePObjectCollection(\n handle: string,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolveSteps: string[]\n ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix, resolveSteps);\n const result: Record<string, PObject<string>> = {};\n for (const [key, obj] of Object.entries(accResult)) {\n result[key] = mapPObjectData(obj, (d) => this.wrapAccessor(d));\n }\n return result;\n }\n\n //\n // Blobs\n //\n\n private registerComputable(hPrefix: string, computable: Computable<unknown>): string {\n const fHandle = `${hPrefix}_${randomUUID()}`;\n this.computablesToResolve[fHandle] = computable;\n return fHandle;\n }\n\n public getBlobContentAsString(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsString',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle, range)).toString(\n 'utf-8',\n );\n },\n }),\n );\n }\n\n public getBlobContentAsBase64(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsBase64',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle, range)).toString(\n 'base64',\n );\n },\n }),\n );\n }\n\n public getDownloadedBlobContentHandle(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getDownloadedBlobContentHandle',\n this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo),\n );\n }\n\n public getOnDemandBlobContentHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getOnDemandBlobContentHandle',\n this.env.driverKit.blobDriver.getOnDemandBlob(resource),\n );\n }\n\n //\n // Blobs to URLs\n //\n\n public extractArchiveAndGetURL(handle: string, format: ArchiveFormat): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'extractArchiveAndGetURL',\n this.env.driverKit.blobToURLDriver.extractArchiveAndGetURL(resource, format),\n );\n }\n\n //\n // Import progress\n //\n\n getImportProgress(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getImportProgress',\n this.env.driverKit.uploadDriver.getProgressId(resource),\n );\n }\n\n //\n // Logs\n //\n\n getLastLogs(handle: string, nLines: number): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLastLogs',\n this.env.driverKit.logDriver.getLastLogs(resource, nLines),\n );\n }\n\n getProgressLog(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLog',\n this.env.driverKit.logDriver.getProgressLog(resource, patternToSearch),\n );\n }\n\n getProgressLogWithInfo(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLogWithInfo',\n this.env.driverKit.logDriver.getProgressLogWithInfo(resource, patternToSearch),\n );\n }\n\n getLogHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLogHandle',\n this.env.driverKit.logDriver.getLogHandle(resource),\n );\n }\n\n //\n // Blocks\n //\n\n public getBlockLabel(blockId: string): string {\n const b = this.meta.get(blockId);\n if (b === undefined) throw new Error(`Block ${blockId} not found.`);\n return b.label;\n }\n\n //\n // Result Pool\n //\n\n private _resultPool: ResultPool | undefined = undefined;\n private get resultPool(): ResultPool {\n if (this._resultPool === undefined) {\n if (this.computableCtx === undefined)\n throw new Error(\n 'can\\'t use result pool in this context (most porbably called from the future mapper)',\n );\n this._resultPool = notEmpty(\n this.blockCtx.getResultsPool,\n 'getResultsPool',\n )(this.computableCtx);\n }\n return this._resultPool;\n }\n\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.resultPool.calculateOptions(predicate);\n }\n\n public getDataFromResultPool(): ResultCollection<PObject<string>> {\n const collection = this.resultPool.getData();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: mapPObjectData(e.obj, (d) => this.wrapAccessor(d)),\n })),\n };\n }\n\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<string, Error>>, 'id'>\n > {\n const collection = this.resultPool.getDataWithErrors();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: {\n id: e.obj.id,\n spec: e.obj.spec,\n data: mapValueInVOE(e.obj.data, (d) => this.wrapAccessor(d)),\n },\n })),\n };\n }\n\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n const specs = this.resultPool.getSpecs();\n if (specs.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`specs_from_pool_incomplete:${specs.instabilityMarker}`);\n return specs;\n }\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n return this.resultPool.getSpecByRef(blockId, exportName);\n }\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<string> | undefined {\n return mapPObjectData(this.resultPool.getDataByRef(blockId, exportName), (acc) =>\n this.wrapAccessor(acc),\n );\n }\n\n //\n // PFrames / PTables\n //\n\n public createPFrame(def: PFrameDef<string | PColumnValues | DataInfo<string>>): PFrameHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n 'can\\'t instantiate PFrames from this context (most porbably called from the future mapper)',\n );\n return this.env.driverKit.pFrameDriver.createPFrame(\n def.map((c) => mapPObjectData(c, (d) => this.transformInputPData(d))),\n this.computableCtx,\n );\n }\n\n public createPTable(def: PTableDef<PColumn<string | PColumnValues | DataInfo<string>>>): PTableHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n 'can\\'t instantiate PTable from this context (most porbably called from the future mapper)',\n );\n return this.env.driverKit.pFrameDriver.createPTable(\n mapPTableDef(def, (c) =>\n mapPObjectData(c, (d) => this.transformInputPData(d)),\n ),\n this.computableCtx,\n );\n }\n\n /**\n * Transforms input data for PFrame/PTable creation\n * - Converts string handles to accessors\n * - Maps accessors in DataInfo objects\n * - Passes through other values\n */\n private transformInputPData(d: string | PColumnValues | DataInfo<string>): PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor> {\n if (typeof d === 'string') {\n return this.getAccessor(d);\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (a) => this.getAccessor(a));\n } else {\n return d;\n }\n }\n\n //\n // Computable\n //\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.computableCtx?.unstableMarker;\n }\n\n //\n // Logging\n //\n\n public logInfo(message: string): void {\n this.env.blockEventDispatcher.logInfo(this.blockCtx.blockId, message);\n }\n\n public logWarn(message: string): void {\n this.env.blockEventDispatcher.logWarn(this.blockCtx.blockId, message);\n }\n\n public logError(message: string): void {\n this.env.blockEventDispatcher.logError(this.blockCtx.blockId, message);\n }\n\n //\n // Helpers\n //\n\n private getAccessor(handle: string): PlTreeNodeAccessor {\n const accessor = this.accessors.get(handle);\n if (accessor === undefined) throw new Error('No such accessor');\n return accessor;\n }\n\n private wrapAccessor(accessor: PlTreeNodeAccessor): string;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined {\n if (accessor === undefined) return undefined;\n else {\n const nextHandle = randomUUID();\n this.accessors.set(nextHandle, accessor);\n return nextHandle;\n }\n }\n\n public injectCtx(configCtx: QuickJSHandle): void {\n const parent = this.parent;\n const vm = parent.vm;\n\n Scope.withScope((localScope) => {\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>,\n ): void => {\n const withCachedError: VmFunctionImplementation<QuickJSHandle> = (...args) => {\n // QuickJS strips all fields from errors apart from 'name' and 'message'.\n // That's why here we need to store them, and rethrow them when we exit\n // from QuickJS code.\n try {\n return (fn as any)(...args);\n } catch (e: unknown) {\n const newErr = parent.errorRepo.setAndRecreateForQuickJS(e);\n\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw vm.newError(newErr);\n }\n };\n\n vm.newFunction(name, withCachedError).consume((fnh) => vm.setProp(configCtx, name, fnh));\n vm.newFunction(name, fn).consume((fnh) => vm.setProp(configCtx, name + '__internal__', fnh));\n };\n\n if (checkBlockFlag(this.featureFlags, 'supportsLazyState')) {\n // injecting lazy state functions\n exportCtxFunction('args', () => {\n if (this.computableCtx === undefined)\n throw new Error(`Add dummy call to ctx.args outside the future lambda. Can't be directly used in this context.`);\n return vm.newString(this.blockCtx.args(this.computableCtx));\n });\n exportCtxFunction('uiState', () => {\n if (this.computableCtx === undefined)\n throw new Error(`Add dummy call to ctx.uiState outside the future lambda. Can't be directly used in this context.`);\n return vm.newString(this.blockCtx.uiState(this.computableCtx) ?? '{}');\n });\n exportCtxFunction('activeArgs', () => {\n if (this.computableCtx === undefined)\n throw new Error(`Add dummy call to ctx.activeArgs outside the future lambda. Can't be directly used in this context.`);\n const res = this.blockCtx.activeArgs(this.computableCtx);\n return res === undefined ? vm.undefined : vm.newString(res);\n });\n } else {\n const args = this.blockCtx.args(this.computableCtx!);\n const activeArgs = this.blockCtx.activeArgs(this.computableCtx!);\n const uiState = this.blockCtx.uiState(this.computableCtx!);\n vm.setProp(configCtx, 'args', localScope.manage(vm.newString(args)));\n vm.setProp(configCtx, 'uiState', localScope.manage(vm.newString(uiState ?? '{}')));\n if (activeArgs !== undefined)\n vm.setProp(configCtx, 'activeArgs', localScope.manage(vm.newString(activeArgs)));\n }\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction('getAccessorHandleByName', (name) => {\n return parent.exportSingleValue(\n this.getAccessorHandleByName(vm.getString(name)),\n undefined,\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction('resolveWithCommon', (handle, commonOptions, ...steps) => {\n return parent.exportSingleValue(\n this.resolveWithCommon(\n vm.getString(handle),\n parent.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => parent.importObjectViaJson(step) as FieldTraversalStepFromSDK | string,\n ),\n ),\n undefined,\n );\n });\n\n exportCtxFunction('getResourceType', (handle) => {\n return parent.exportObjectViaJson(this.getResourceType(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getInputsLocked', (handle) => {\n return parent.exportSingleValue(this.getInputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getOutputsLocked', (handle) => {\n return parent.exportSingleValue(this.getOutputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsReadyOrError', (handle) => {\n return parent.exportSingleValue(this.getIsReadyOrError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsFinal', (handle) => {\n return parent.exportSingleValue(this.getIsFinal(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getError', (handle) => {\n return parent.exportSingleValue(this.getError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listInputFields', (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listOutputFields', (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listDynamicFields', (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getKeyValueBase64', (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueBase64(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction('getKeyValueAsString', (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueAsString(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction('getDataBase64', (handle) => {\n return parent.exportSingleValue(this.getDataBase64(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getDataAsString', (handle) => {\n return parent.exportSingleValue(this.getDataAsString(vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction(\n 'parsePObjectCollection',\n (handle, errorOnUnknownField, prefix, ...resolveSteps) => {\n return parent.exportObjectUniversal(\n this.parsePObjectCollection(\n vm.getString(handle),\n vm.dump(errorOnUnknownField) as boolean,\n vm.getString(prefix),\n ...resolveSteps.map((stepHandle) => vm.getString(stepHandle)),\n ),\n undefined,\n );\n },\n );\n\n //\n // Blobs\n //\n\n exportCtxFunction('getBlobContentAsBase64', (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsBase64(vm.getString(handle), parent.importObjectUniversal(range) as RangeBytes | undefined),\n undefined,\n );\n });\n\n exportCtxFunction('getBlobContentAsString', (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsString(vm.getString(handle), parent.importObjectUniversal(range) as RangeBytes | undefined),\n undefined,\n );\n });\n\n exportCtxFunction('getDownloadedBlobContentHandle', (handle) => {\n return parent.exportSingleValue(\n this.getDownloadedBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n exportCtxFunction('getOnDemandBlobContentHandle', (handle) => {\n return parent.exportSingleValue(\n this.getOnDemandBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n //\n // Blobs to URLs\n //\n\n exportCtxFunction('extractArchiveAndGetURL', (handle, format) => {\n return parent.exportSingleValue(\n this.extractArchiveAndGetURL(vm.getString(handle), vm.getString(format) as ArchiveFormat),\n undefined);\n });\n\n //\n // ImportProgress\n //\n\n exportCtxFunction('getImportProgress', (handle) => {\n return parent.exportSingleValue(this.getImportProgress(vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction('getLastLogs', (handle, nLines) => {\n return parent.exportSingleValue(\n this.getLastLogs(vm.getString(handle), vm.getNumber(nLines)),\n undefined,\n );\n });\n\n exportCtxFunction('getProgressLog', (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLog(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction('getProgressLogWithInfo', (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLogWithInfo(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction('getLogHandle', (handle) => {\n return parent.exportSingleValue(this.getLogHandle(vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction('getBlockLabel', (blockId) => {\n return parent.exportSingleValue(this.getBlockLabel(vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction('getDataFromResultPool', () => {\n return parent.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction('getDataWithErrorsFromResultPool', () => {\n return parent.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction('getSpecsFromResultPool', () => {\n return parent.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction('calculateOptions', (predicate) => {\n return parent.exportObjectUniversal(\n this.calculateOptions(parent.importObjectViaJson(predicate) as PSpecPredicate),\n undefined,\n );\n });\n\n exportCtxFunction('getSpecFromResultPoolByRef', (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getSpecFromResultPoolByRef(\n vm.getString(blockId),\n vm.getString(exportName),\n ),\n undefined,\n );\n });\n\n exportCtxFunction('getDataFromResultPoolByRef', (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getDataFromResultPoolByRef(\n vm.getString(blockId),\n vm.getString(exportName),\n ),\n undefined,\n );\n });\n\n //\n // PFrames / PTables\n //\n\n exportCtxFunction('createPFrame', (def) => {\n return parent.exportSingleValue(\n this.createPFrame(parent.importObjectViaJson(def) as PFrameDef<string | PColumnValues>),\n undefined,\n );\n });\n\n exportCtxFunction('createPTable', (def) => {\n return parent.exportSingleValue(\n this.createPTable(\n parent.importObjectViaJson(def) as PTableDef<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n //\n // Computable\n //\n\n exportCtxFunction('getCurrentUnstableMarker', () => {\n return parent.exportSingleValue(this.getCurrentUnstableMarker(), undefined);\n });\n\n //\n // Logging\n //\n\n exportCtxFunction('logInfo', (message) => {\n this.logInfo(vm.getString(message));\n });\n\n exportCtxFunction('logWarn', (message) => {\n this.logWarn(vm.getString(message));\n });\n\n exportCtxFunction('logError', (message) => {\n this.logError(vm.getString(message));\n });\n });\n }\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport type {\n BlockCodeKnownFeatureFlags } from '@platforma-sdk/model';\nimport {\n JsRenderInternal,\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport type { QuickJSContext, QuickJSHandle } from 'quickjs-emscripten';\nimport { Scope, errors } from 'quickjs-emscripten';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport { stringifyWithResourceId } from '@milaboratories/pl-client';\nimport { PlQuickJSError } from '@milaboratories/pl-errors';\nimport { ComputableContextHelper } from './computable_context';\n\nexport type DeadlineSettings = {\n currentExecutionTarget: string;\n deadline: number;\n};\n\n/**\n * Communicates a deadline to the quickjs runtime, that if passed, will interrupt the execution.\n * Undefined can be used to reset the deadline.\n * */\nexport type DeadlineSetter = (settings: DeadlineSettings | undefined) => void;\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\n/**\n * Contains references to objects needed to execute lambda within computable,\n * providing access to:\n * - block context\n * - computable context\n * - middle layer environment\n * */\nexport type ComputableEnv = {\n readonly blockCtx: BlockContextAny;\n readonly mlEnv: MiddleLayerEnvironment;\n computableCtx: ComputableCtx;\n};\n\nexport class JsExecutionContext {\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly errorRepo = new ErrorRepository();\n\n public readonly computableHelper: ComputableContextHelper | undefined;\n\n constructor(\n public readonly scope: Scope,\n public readonly vm: QuickJSContext,\n private readonly deadlineSetter: DeadlineSetter,\n featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableEnv?: ComputableEnv,\n ) {\n this.callbackRegistry = this.scope.manage(this.vm.newObject());\n\n this.fnJSONStringify = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'stringify')),\n );\n if (vm.typeof(this.fnJSONStringify) !== 'function')\n throw new Error(`JSON.stringify() not found.`);\n\n this.fnJSONParse = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'parse')),\n );\n if (vm.typeof(this.fnJSONParse) !== 'function') throw new Error(`JSON.parse() not found.`);\n\n if (computableEnv !== undefined)\n this.computableHelper = new ComputableContextHelper(this, computableEnv.blockCtx, computableEnv.mlEnv, featureFlags, computableEnv.computableCtx);\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n notEmpty(this.computableHelper, 'Computable context helper is not initialized').resetComputableCtx();\n }\n\n private static cleanErrorContext(error: unknown): void {\n if (typeof error === 'object' && error !== null && 'context' in error) delete error['context'];\n }\n\n // private static cleanError(error: unknown): unknown {\n // if (error instanceof errors.QuickJSUnwrapError) {\n // const { cause, context: _, name, message, stack, ...rest } = error;\n // const clean = new errors.QuickJSUnwrapError(cause);\n // Object.assign(clean, { ...rest, name, message, stack });\n // return clean;\n // }\n // return error;\n // }\n\n public evaluateBundle(code: string) {\n try {\n this.deadlineSetter({ currentExecutionTarget: 'evaluateBundle', deadline: Date.now() + 10000 });\n this.vm.unwrapResult(this.vm.evalCode(code, 'bundle.js', { type: 'global' })).dispose();\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n } finally {\n this.deadlineSetter(undefined);\n }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n try {\n this.deadlineSetter({ currentExecutionTarget: cbName, deadline: Date.now() + 10000 });\n return Scope.withScope((localScope) => {\n const targetCallback = localScope.manage(this.vm.getProp(this.callbackRegistry, cbName));\n\n if (this.vm.typeof(targetCallback) !== 'function')\n throw new Error(`No such callback: ${cbName}`);\n\n return this.scope.manage(\n this.vm.unwrapResult(\n this.vm.callFunction(\n targetCallback,\n this.vm.undefined,\n ...args.map((arg) => this.exportObjectUniversal(arg, localScope)),\n ),\n ),\n );\n });\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n const original = this.errorRepo.getOriginal(err);\n throw original;\n } finally {\n this.deadlineSetter(undefined);\n }\n }\n\n //\n // QuickJS Helpers\n //\n\n public exportSingleValue(\n obj: boolean | number | string | null | ArrayBuffer | undefined,\n scope: Scope | undefined,\n ): QuickJSHandle {\n const result = this.tryExportSingleValue(obj, scope);\n if (result === undefined) {\n throw new Error(`Can't export value: ${obj === undefined ? 'undefined' : JSON.stringify(obj)}`);\n }\n return result;\n }\n\n public tryExportSingleValue(obj: unknown, scope: Scope | undefined): QuickJSHandle | undefined {\n let handle: QuickJSHandle;\n let manage = false;\n switch (typeof obj) {\n case 'string':\n handle = this.vm.newString(obj);\n manage = true;\n break;\n case 'number':\n handle = this.vm.newNumber(obj);\n manage = true;\n break;\n case 'undefined':\n handle = this.vm.undefined;\n break;\n case 'boolean':\n handle = obj ? this.vm.true : this.vm.false;\n break;\n default:\n if (obj === null) {\n handle = this.vm.null;\n break;\n }\n if (isArrayBufferOrView(obj)) {\n handle = this.vm.newArrayBuffer(obj);\n manage = true;\n break;\n }\n return undefined;\n }\n return manage && scope != undefined ? scope.manage(handle) : handle;\n }\n\n public exportObjectUniversal(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const simpleHandle = this.tryExportSingleValue(obj, scope);\n if (simpleHandle !== undefined) return simpleHandle;\n return this.exportObjectViaJson(obj, scope);\n }\n\n public exportObjectViaJson(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const result = this.vm\n .newString(JSON.stringify(obj))\n .consume((json) =>\n this.vm.unwrapResult(this.vm.callFunction(this.fnJSONParse, this.vm.undefined, json)),\n );\n return scope !== undefined ? scope.manage(result) : result;\n }\n\n public importObjectUniversal(handle: QuickJSHandle | undefined): unknown {\n if (handle === undefined) return undefined;\n switch (this.vm.typeof(handle)) {\n case 'undefined':\n return undefined;\n case 'boolean':\n case 'number':\n case 'string':\n return this.vm.dump(handle);\n default:\n return this.importObjectViaJson(handle);\n }\n }\n\n public importObjectViaJson(handle: QuickJSHandle): unknown {\n const text = this.vm\n .unwrapResult(this.vm.callFunction(this.fnJSONStringify, this.vm.undefined, handle))\n .consume((strHandle) => this.vm.getString(strHandle));\n if (text === 'undefined')\n // special case with futures\n return undefined;\n return JSON.parse(text);\n }\n\n private injectCtx() {\n Scope.withScope((localScope) => {\n const configCtx = localScope.manage(this.vm.newObject());\n\n //\n // Core props\n //\n\n this.vm.setProp(configCtx, 'callbackRegistry', this.callbackRegistry);\n this.vm.setProp(\n configCtx,\n 'featureFlags',\n this.exportObjectUniversal(JsRenderInternal.GlobalCfgRenderCtxFeatureFlags, localScope),\n );\n\n //\n // Injecting computable context helper methods if we are running in computable context\n //\n\n if (this.computableHelper !== undefined)\n this.computableHelper.injectCtx(configCtx);\n\n //\n // Creating global variable inside the vm\n //\n\n this.vm.setProp(this.vm.global, 'cfgRenderCtx', configCtx);\n });\n }\n}\n\n/** Holds errors that happened in the host code (like in middle-layer's drivers)\n * and then throws it where the error from quick JS is needed.\n * QuickJS couldn't throw custom errors, so we store them here, and rethrow them when we exit QuickJS side. */\nexport class ErrorRepository {\n private readonly errorIdToError = new Map<string, unknown>();\n\n /** Sets the error to the repository and returns a mimicrated error that also has uuid key of the original error. */\n public setAndRecreateForQuickJS(error: unknown): {\n name: string;\n message: string;\n } {\n const errorId = randomUUID();\n this.errorIdToError.set(errorId, error);\n\n if (error instanceof Error) {\n return {\n name: `${error.name}/uuid:${errorId}`,\n message: error.message,\n };\n }\n\n return {\n name: `UnknownErrorQuickJS/uuid:${errorId}`,\n message: `${error as any}`,\n };\n }\n\n /** Returns the original error that was stored by parsing uuid of mimicrated error. */\n public getOriginal(quickJSError: unknown): unknown {\n if (!(quickJSError instanceof errors.QuickJSUnwrapError)) {\n console.warn('ErrorRepo: quickJSError is not a QuickJSUnwrapError', stringifyWithResourceId(quickJSError));\n return quickJSError;\n }\n\n const cause = quickJSError.cause;\n if (!(typeof cause === 'object' && cause !== null && ('name' in cause) && typeof cause.name === 'string')) {\n console.warn('ErrorRepo: quickJSError.cause is not an Error (can be stack limit exceeded)', stringifyWithResourceId(quickJSError));\n return quickJSError;\n }\n\n const causeName = cause.name;\n const errorId = causeName.slice(causeName.indexOf('/uuid:') + '/uuid:'.length);\n if (!errorId) {\n throw new Error(`ErrorRepo: quickJSError.cause.name does not contain errorId: ${causeName}, ${stringifyWithResourceId(quickJSError)}`);\n }\n\n const error = this.errorIdToError.get(errorId);\n if (error === undefined) {\n throw new Error(`ErrorRepo: errorId not found: ${errorId}, ${stringifyWithResourceId(quickJSError)}`);\n }\n\n return new PlQuickJSError(quickJSError, error as Error);\n }\n}\n","import type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport type { BlockCodeWithInfo, ConfigRenderLambda } from '@platforma-sdk/model';\nimport type { ComputableRenderingOps } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { Scope } from 'quickjs-emscripten';\nimport type { DeadlineSettings } from './context';\nimport { JsExecutionContext } from './context';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport { getDebugFlags } from '../debug';\n\nfunction logOutputStatus(handle: string, renderedResult: unknown, stable: boolean, recalculationCounter: number, unstableMarker?: string) {\n if (getDebugFlags().logOutputStatus && (getDebugFlags().logOutputStatus === 'any' || !stable)) {\n if (stable)\n console.log(`Stable output ${handle} calculated ${renderedResult !== undefined ? 'defined' : 'undefined'}; (#${recalculationCounter})`);\n else\n console.log(`Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== undefined ? 'defined' : 'undefined'} (#${recalculationCounter})`);\n }\n}\n\n/**\n * Creates a Computable that executes a render function (`fh`) from a block's code in a QuickJS virtual machine.\n * This function handles both synchronous and asynchronous execution patterns of the sandboxed JS code.\n *\n * The overall data flow is as follows:\n * 1. A QuickJS VM is initialized.\n * 2. A `JsExecutionContext` is created to bridge the host (TypeScript) and guest (QuickJS) environments. It injects a\n * context object (`cfgRenderCtx`) into the VM, providing helper methods for the sandboxed code to interact with the\n * platform (e.g., to request data).\n * 3. The block's Javascript bundle is evaluated in the VM.\n * 4. The specified render function (`fh.handle`) is executed.\n *\n * Two execution paths are possible depending on the behavior of the render function:\n *\n * ### Synchronous Path\n * If the render function computes its result without requesting any external data requiring asynchronous calculations,\n * it executes synchronously.\n * - The `computablesToResolve` map in `JsExecutionContext` remains empty.\n * - The function returns an object with an `ir` field holding the result (`{ ir: importedResult }`).\n * Since `postprocessValue` is not specified, `ir` is treated as the final resolved value of the Computable.\n * - The QuickJS VM is disposed of immediately as it's no longer needed.\n *\n * ### Asynchronous Path (with `postprocessValue`)\n * If the render function needs external data requiring asynchronous calculations (e.g., fetching a file), it calls\n * one of the injected helper methods. These methods don't return data directly. Instead, they:\n * a. Create a new `Computable` for the data request (e.g., to fetch a blob).\n * b. Register this new `Computable` in the `computablesToResolve` map.\n * c. Return a handle (string) to the sandboxed code.\n *\n * In this case:\n * - The initial execution of the render function returns a scaffold of the final result, which depends on the pending\n * computables.\n * - The `computablesToResolve` map is passed as the `ir` (initial result) to `Computable.makeRaw`.\n * - The `postprocessValue` function is provided to handle the results once the computables are resolved.\n * - The QuickJS VM is kept alive (`keepVmAlive = true`) because its state is needed in `postprocessValue`.\n * - Once the `computable` framework resolves all dependencies, it calls `postprocessValue` with the resolved data.\n * - `postprocessValue` feeds the resolved data back into the VM, allowing the sandboxed code to compute the final\n * result.\n * - The VM is eventually disposed of when the host Computable is destroyed.\n *\n * @param env The middle layer environment.\n * @param ctx The block context.\n * @param fh The config render lambda to execute.\n * @param codeWithInfo The block's code and feature flags.\n * @param configKey A key for the configuration, used for cache busting.\n * @param ops Options for the computable.\n * @returns A `Computable` that will resolve to the result of the lambda execution.\n */\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n const { code, featureFlags } = codeWithInfo;\n // adding configKey to reload all outputs on block-pack update\n const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;\n ops = { ...ops, key };\n if (ops.mode === undefined && fh.retentive === true) ops.mode = 'StableOnlyRetentive';\n return Computable.makeRaw((cCtx) => {\n if (getDebugFlags().logOutputRecalculations)\n console.log(`Block lambda recalculation : ${key} (${cCtx.changeSourceMarker}; ${cCtx.bodyInvocations} invocations)`);\n\n const scope = new Scope();\n let keepVmAlive = false;\n cCtx.addOnDestroy(() => {\n // If keepVmAlive is false, the scope will be disposed by the finally block,\n // no need to dispose it here.\n if (keepVmAlive) scope.dispose();\n });\n\n try {\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 1024 * 8);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm,\n (s) => { deadlineSettings = s; },\n featureFlags,\n { computableCtx: cCtx, blockCtx: ctx, mlEnv: env });\n\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh.handle);\n\n rCtx.resetComputableCtx();\n\n const toBeResolved = rCtx.computableHelper!.computablesToResolve;\n\n if (Object.keys(toBeResolved).length === 0) {\n const importedResult = rCtx.importObjectUniversal(result);\n logOutputStatus(fh.handle, importedResult, cCtx.unstableMarker === undefined, -1, cCtx.unstableMarker);\n return { ir: importedResult };\n }\n\n let recalculationCounter = 0;\n if (getDebugFlags().logOutputStatus)\n console.log(`Output ${fh.handle} scaffold calculated (not all computables resolved yet).`);\n keepVmAlive = true;\n\n return {\n ir: toBeResolved,\n postprocessValue: (resolved: Record<string, unknown>, { unstableMarker, stable }) => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved)) rCtx.runCallback(handle, value);\n\n // rendering result\n const renderedResult = rCtx.importObjectUniversal(result);\n\n // logging\n recalculationCounter++;\n logOutputStatus(fh.handle, renderedResult, stable, recalculationCounter, unstableMarker);\n\n return renderedResult;\n },\n };\n } catch (e) {\n keepVmAlive = false;\n throw e;\n } finally {\n if (!keepVmAlive) scope.dispose();\n }\n }, ops);\n}\n\nexport function executeSingleLambda(\n quickJs: QuickJSWASMModule,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n ...args: unknown[]\n): unknown {\n const { code, featureFlags } = codeWithInfo;\n const scope = new Scope();\n try {\n const runtime = scope.manage(quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 1024 * 8);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm,\n (s) => { deadlineSettings = s; },\n featureFlags,\n );\n\n // Initializing the model\n rCtx.evaluateBundle(code.content);\n\n // Running the lambda\n return rCtx.importObjectUniversal(rCtx.runCallback(fh.handle, ...args));\n } finally {\n scope.dispose();\n }\n}\n","import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from '@platforma-sdk/model';\nimport { isConfigLambda } from '@platforma-sdk/model';\nimport type { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { computableFromCfg } from '../cfg_render/executor';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { computableFromRF } from '../js_render';\nimport type { BlockContextAny } from './block_ctx';\nimport { hasActiveCfgComponents } from '../cfg_render/util';\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n codeWithInfo: BlockCodeWithInfo | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (codeWithInfo === undefined) throw new Error('No code bundle.');\n return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n","import type { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { projectFieldName } from '../model/project_model';\nimport type { ResourceId } from '@milaboratories/pl-client';\nimport { Pl } from '@milaboratories/pl-client';\nimport { ifNotUndef } from '../cfg_render/util';\nimport type { BlockPackInfo } from '../model/block_pack';\nimport type { BlockConfig } from '@platforma-sdk/model';\nimport { extractConfig } from '@platforma-sdk/model';\n\nexport type BlockPackInfoAndId = {\n readonly bpResourceId: ResourceId;\n /** To be added to computable keys, to force reload on config change */\n readonly bpId: string;\n /** Full block-pack info */\n readonly info: BlockPackInfo;\n /** Config extracted from the info */\n readonly cfg: BlockConfig;\n};\n\n/** Returns block pack info along with string representation of block-pack resource id */\nexport function getBlockPackInfo(\n prj: PlTreeNodeAccessor,\n blockId: string,\n): BlockPackInfoAndId | undefined {\n return ifNotUndef(\n prj.traverse(\n {\n field: projectFieldName(blockId, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true,\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true },\n ),\n (bpAcc) => {\n const info = bpAcc.getDataAsJson<BlockPackInfo>()!;\n const cfg = extractConfig(info.config);\n return { bpResourceId: bpAcc.resourceInfo.id, bpId: bpAcc.resourceInfo.id.toString(), info, cfg };\n },\n );\n}\n","import type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type {\n ProjectRenderingState,\n ProjectStructure } from '../model/project_model';\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectStructureAuthorKey,\n ProjectStructureKey,\n} from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { allBlocks, productionGraph } from '../model/project_model_util';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport type {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n ProjectMeta,\n ProjectOverview,\n} from '@milaboratories/pl-model-middle-layer';\nimport { constructBlockContextArgsOnly } from './block_ctx';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { extractCodeWithInfo, type BlockSection } from '@platforma-sdk/model';\nimport { computableFromCfgOrRF } from './render';\nimport type { NavigationStates } from './navigation_states';\nimport { getBlockPackInfo } from './util';\nimport { resourceIdToString, type ResourceId } from '@milaboratories/pl-client';\nimport * as R from 'remeda';\n\ntype BlockInfo = {\n argsRid: ResourceId;\n currentArguments: unknown;\n prod?: ProdState;\n};\n\ntype _CalculationStatus = 'Running' | 'Done';\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: Record<string, unknown>;\n};\n\nfunction argsEquals(a: Record<string, unknown> | undefined, b: Record<string, unknown> | undefined): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n const clean = R.omitBy<Record<string, unknown>>((_, key) => key.startsWith('__'));\n return R.isDeepEqual(clean(a), clean(b));\n}\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey),\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, 'currentArgs'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true,\n });\n const currentArguments = cInputs.getDataAsJson() as Record<string, unknown>;\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, 'prodArgs'),\n assertFieldType: 'Dynamic',\n stableIfNotFound: true,\n });\n if (rInputs !== undefined) {\n const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;\n const result = prj.getField({\n field: projectFieldName(id, 'prodOutput'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true,\n });\n const ctx = prj.getField({\n field: projectFieldName(id, 'prodUiCtx'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true,\n });\n prod = {\n arguments: prodArgs,\n stale: !argsEquals(currentArguments, prodArgs),\n outputError:\n result.error !== undefined\n || ctx.error !== undefined\n || result.value?.getError() !== undefined\n || ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError())\n || (result.error !== undefined && result.error.getIsReadyOrError()))\n && ((ctx.value !== undefined && ctx.value.getIsReadyOrError())\n || (ctx.error !== undefined && ctx.error.getIsReadyOrError())),\n };\n }\n\n infos.set(id, { currentArguments, prod, argsRid: cInputs.resourceInfo.id });\n }\n\n const currentGraph = productionGraph(structure, (id) => {\n const bpInfo = getBlockPackInfo(prj, id)!;\n const bInfo = infos.get(id)!;\n const args = bInfo.currentArguments;\n return {\n args,\n enrichmentTargets: env.projectHelper.getEnrichmentTargets(() => bpInfo.cfg, () => args, { argsRid: bInfo.argsRid, blockPackRid: bpInfo.bpResourceId }),\n };\n });\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = 'NotCalculated';\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = 'Limbo';\n else calculationStatus = info.prod.finished ? 'Done' : 'Running';\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const { sections, title, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime }\n = ifNotUndef(bp, ({ bpId, cfg }) => {\n if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {\n return {\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n const codeWithInfo = extractCodeWithInfo(cfg);\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.sections,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (e) => {\n env.logger.error('Error in block model sections');\n env.logger.error(e);\n return [];\n },\n }) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n title,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (e) => {\n env.logger.error('Error in block model title');\n env.logger.error(e);\n return 'Invalid title';\n },\n }) as ComputableStableDefined<string>,\n ),\n inputsValid: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (e) => {\n // I'm not sure that we should write an error here, because it just means \"Invalid args\"\n env.logger.error('Error in block model argsValid');\n env.logger.error(e);\n return false;\n },\n }) as ComputableStableDefined<boolean>,\n sdkVersion: codeWithInfo?.sdkVersion,\n featureFlags: codeWithInfo?.featureFlags ?? {},\n isIncompatibleWithRuntime: false,\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, 'blockSettings'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true,\n })\n .getDataAsJson() as BlockSettings;\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings }),\n );\n\n return {\n projectResourceId: resourceIdToString(prjEntry.rid),\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === 'Limbo',\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots('upstream', id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots('downstream', id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n navigationState: navigationStates.getState(id),\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks,\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun\n = (stale || b.outputErrors)\n && Boolean(b.inputsValid)\n && !b.missingReference\n && b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion,\n };\n delete bb['updates'];\n return bb;\n }),\n };\n },\n },\n ).withStableType();\n}\n","import type { PlTreeEntry, PlTreeEntryAccessor } from '@milaboratories/pl-tree';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport { Pl, resourceTypesEqual } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData } from '../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../model';\nimport type { UrlResult } from '@milaboratories/pl-drivers';\nimport { projectFieldName } from '../model/project_model';\nimport { BlockPackFrontendField } from '../mutator/block-pack/block_pack';\nimport { getBlockPackInfo } from './util';\nimport type { FrontendData } from '../model/frontend';\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment,\n): undefined | string | ComputableStableDefined<UrlResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getUrl(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`,\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendUrlComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === 'string') return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.url;\n },\n },\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, 'blockPack'),\n assertFieldType: 'Dynamic',\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: 'Input' },\n )\n ?.persist();\n return {\n url: frontendUrlComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion,\n };\n },\n { mode: 'StableOnlyLive' },\n ) as ComputableStableDefined<FrontendData>;\n}\n","import type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type {\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors,\n} from '@milaboratories/computable';\nimport {\n Computable,\n} from '@milaboratories/computable';\nimport { constructBlockContext, constructBlockContextArgsOnly } from './block_ctx';\nimport { blockArgsAuthorKey } from '../model/project_model';\nimport { ifNotUndef } from '../cfg_render/util';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { getBlockPackInfo } from './util';\nimport type { AuthorMarker, BlockStateInternal } from '@milaboratories/pl-model-middle-layer';\nimport { computableFromCfgOrRF } from './render';\nimport { resourceIdToString } from '@milaboratories/pl-client';\nimport { deepFreeze } from '@milaboratories/ts-helpers';\nimport { extractCodeWithInfo } from '@platforma-sdk/model';\nimport { getDebugFlags } from '../debug';\n\nexport type BlockArgsAndUiState = Omit<BlockStateInternal, 'outputs' | 'navigationState'>;\n\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string\n): Computable<BlockArgsAndUiState>;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx: ComputableCtx\n): BlockArgsAndUiState;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx?: ComputableCtx,\n): BlockArgsAndUiState | Computable<BlockArgsAndUiState> {\n if (cCtx === undefined)\n return Computable.make((c) => blockArgsAndUiState(projectEntry, blockId, c), {\n key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}`,\n });\n\n const prj = cCtx.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(projectEntry, blockId);\n const uiState = ctx.uiState(cCtx);\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),\n // @TODO add deserialization caching\n args: deepFreeze(JSON.parse(ctx.args(cCtx))),\n // @TODO add deserialization caching\n ui: uiState !== undefined ? deepFreeze(JSON.parse(uiState)) : undefined,\n };\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n blockId: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n const key = 'outputs#' + resourceIdToString(projectEntry.rid) + '#' + blockId;\n return Computable.make(\n (c) => {\n if (getDebugFlags().logOutputRecalculations) {\n console.log(`blockOutput recalculation : ${key} (${c.changeSourceMarker}; ${c.bodyInvocations} invocations)`);\n }\n\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(projectEntry, blockId);\n\n return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId }) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {\n const computableOutput = computableFromCfgOrRF(env, ctx, cellCfg, extractCodeWithInfo(cfg), bpId);\n outputs[cellId] = Computable.wrapError(computableOutput, 1);\n }\n return outputs;\n });\n },\n { key },\n ).withStableType();\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport type { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable } from '@milaboratories/computable';\nimport type { ProjectStructure } from '../model/project_model';\nimport { ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { constructBlockContext } from './block_ctx';\nimport { computableFromCfgOrRF, isActive } from './render';\nimport { getBlockPackInfo } from './util';\nimport { extractCodeWithInfo } from '@platforma-sdk/model';\n\n/** Returns derived general project state form the project resource */\nexport function activeConfigs(\n prjEntry: PlTreeEntry,\n env: MiddleLayerEnvironment,\n): Computable<unknown[]> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const ret: Computable<unknown>[] = [];\n for (const { id } of allBlocks(structure)) {\n const bp = getBlockPackInfo(prj, id);\n if (bp === undefined) continue;\n\n const activeOutputConfigs = Object.entries(bp.cfg.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => isActive(cfg))\n .map((cfg) => cfg);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj.persist(), id);\n\n for (const cfg of activeOutputConfigs)\n ret.push(\n Computable.wrapError(computableFromCfgOrRF(env, blockCtx, cfg, extractCodeWithInfo(bp.cfg), bp.bpId)),\n );\n }\n\n return ret;\n });\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport { ChangeSource, Computable } from '@milaboratories/computable';\nimport type { NavigationState } from '@platforma-sdk/model';\nimport { DefaultNavigationState } from '@platforma-sdk/model';\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged('navigation state changed');\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` },\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged('block deleted');\n }\n }\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport type { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { Computable } from '@milaboratories/computable';\nimport type { ProjectStructure } from '../model/project_model';\nimport { ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\n\nexport type ProjectOverviewLight = {\n readonly listOfBlocks: string[];\n};\n\n/** Returns derived general project state form the project resource */\nexport function projectOverviewLight(\n prjEntry: PlTreeEntry,\n): Computable<ProjectOverviewLight> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n\n return {\n listOfBlocks: [...allBlocks(structure)].map((b) => b.id),\n };\n });\n}\n","/** Uses KV for uiState compared to V2 */\nexport const SchemaVersionV1 = '1';\n\nexport const BlockFrontendStateKeyPrefixV1 = 'BlockFrontendState/';\nexport const BlockFrontendStateKeyPatternV1 = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKeyV1(blockId: string): string {\n return `${BlockFrontendStateKeyPrefixV1}${blockId}`;\n}\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKeyV1(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPatternV1);\n if (match === null) return undefined;\n return match.groups!['blockid'];\n}\n","import type { PlClient, PlTransaction, ResourceId } from '@milaboratories/pl-client';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey } from '../model/project_model';\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from '../model/project_model_v1';\nimport { field } from '@milaboratories/pl-client';\nimport { cachedDeserialize } from '@milaboratories/ts-helpers';\nimport { allBlocks } from '../model/project_model_util';\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx('ProjectMigration', async (tx) => {\n const schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n } else {\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, 'uiState'));\n tx.createField(uiStateF, 'Dynamic', uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n","import type { MiddleLayerEnvironment } from './middle_layer';\nimport type {\n FieldData,\n OptionalAnyResourceId,\n ResourceId,\n} from '@milaboratories/pl-client';\nimport {\n ensureResourceIdNotNull,\n field,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n resourceIdToString,\n} from '@milaboratories/pl-client';\nimport type { ComputableStableDefined, ComputableValueOrErrors } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport type { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { withProject, withProjectAuthored } from '../mutator/project';\nimport type { ExtendedResourceData } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState, treeDumpStats } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport type { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport type { FrontendData } from '../model/frontend';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName } from '../model/project_model';\nimport { cachedDeserialize, notEmpty } from '@milaboratories/ts-helpers';\nimport type { BlockPackInfo } from '../model/block_pack';\nimport type {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal,\n BlockSettings,\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\nimport { extractConfig } from '@platforma-sdk/model';\nimport fs from 'node:fs/promises';\nimport canonicalize from 'canonicalize';\nimport type { ProjectOverviewLight } from './project_overview_light';\nimport { projectOverviewLight } from './project_overview_light';\nimport { applyProjectMigrations } from '../mutator/migration';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\n};\n\nfunction stringifyForDump(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === 'bigint')\n return resourceIdToString(value as OptionalAnyResourceId);\n else if (\n ArrayBuffer.isView(value)\n || value instanceof Int8Array\n || value instanceof Uint8Array\n || value instanceof Uint8ClampedArray\n || value instanceof Int16Array\n || value instanceof Uint16Array\n || value instanceof Int32Array\n || value instanceof Uint32Array\n || value instanceof Float32Array\n || value instanceof Float64Array\n || value instanceof BigInt64Array\n || value instanceof BigUint64Array\n )\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString('base64');\n else if (Buffer.isBuffer(value))\n return value.toString('base64');\n\n return value;\n });\n}\n\n/** Data access object, to manipulate and read single opened (!) project data. */\nexport class Project {\n /** Underlying pl resource id */\n public readonly rid: ResourceId;\n\n /** Data for the left panel, contain basic information about block status. */\n public readonly overview: ComputableStableDefined<ProjectOverview>;\n private readonly overviewLight: Computable<ProjectOverviewLight>;\n\n private readonly navigationStates = new NavigationStates();\n // null is set for deleted blocks\n private readonly blockComputables = new Map<string, BlockStateComputables | null>();\n\n private readonly blockFrontends = new Map<string, ComputableStableDefined<FrontendData>>();\n private readonly activeConfigs: Computable<unknown[]>;\n private readonly refreshLoopResult: Promise<void>;\n\n private readonly abortController = new AbortController();\n private destroyed = false;\n\n constructor(\n private readonly env: MiddleLayerEnvironment,\n rid: ResourceId,\n private readonly projectTree: SynchronizedTreeState,\n ) {\n this.overview = projectOverview(\n projectTree.entry(),\n this.navigationStates,\n env,\n ).withPreCalculatedValueTree();\n this.overviewLight = projectOverviewLight(projectTree.entry())\n .withPreCalculatedValueTree();\n this.rid = rid;\n this.refreshLoopResult = this.refreshLoop();\n this.activeConfigs = activeConfigs(projectTree.entry(), env);\n }\n\n private async refreshLoop(): Promise<void> {\n while (!this.destroyed) {\n try {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (prj) => {\n prj.doRefresh(this.env.ops.stagingRenderingRate);\n });\n await this.activeConfigs.getValue();\n await setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);\n\n // Block computables houskeeping\n const overviewLight = await this.overviewLight.getValue();\n const existingBlocks = new Set(overviewLight.listOfBlocks);\n // Doing cleanup for deleted blocks\n for (const blockId of this.blockComputables.keys()) {\n if (!existingBlocks.has(blockId)) {\n const computable = this.blockComputables.get(blockId);\n if (computable !== undefined && computable !== null) computable.fullState.resetState();\n this.blockComputables.set(blockId, null);\n }\n }\n } catch (e: unknown) {\n if (isNotFoundError(e)) {\n console.warn(\n 'project refresh routine terminated, because project was externally deleted',\n );\n break;\n } else if (!isTimeoutOrCancelError(e))\n throw new Error('Unexpected exception', { cause: e });\n }\n }\n }\n\n /**\n * Adds new block to the project.\n *\n * @param blockLabel block label / title visible to the user\n * @param blockPackSpec object describing the \"block type\", read more in the type docs\n * @param before id of the block to insert new block before\n * @param blockId internal id to be assigned for the block, this arg can be omitted\n * then, randomly generated UUID will be assigned automatically\n *\n * @return returns newly created block id\n * */\n public async addBlock(\n blockLabel: string,\n blockPackSpec: BlockPackSpecAny,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n blockId: string = randomUUID(),\n ): Promise<string> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n const blockCfg = extractConfig(blockCfgContainer); // full content of this var should never be persisted\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.addBlock(\n {\n id: blockId,\n label: blockLabel,\n renderingMode: blockCfg.renderingMode,\n },\n {\n args: canonicalize(blockCfg.initialArgs)!,\n uiState: canonicalize(blockCfg.initialUiState)!,\n blockPack: preparedBp,\n },\n before,\n ),\n );\n await this.projectTree.refreshState();\n\n return blockId;\n }\n\n /**\n * Duplicates an existing block by copying all its fields and state.\n * This method works at the mutator level for efficient block copying.\n *\n * @param originalBlockId id of the block to duplicate\n * @param before id of the block to insert new block before\n * @param author author marker for the duplication operation\n * @param newBlockId internal id to be assigned for the duplicated block,\n * if omitted, a randomly generated UUID will be assigned\n *\n * @return returns newly created block id\n * */\n public async duplicateBlock(\n originalBlockId: string,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n newBlockId: string = randomUUID(),\n ): Promise<string> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.duplicateBlock(originalBlockId, newBlockId, before),\n );\n await this.projectTree.refreshState();\n\n return newBlockId;\n }\n\n /**\n * Update block to new block pack, optionally resetting args and ui state to\n * initial values\n * */\n public async updateBlockPack(\n blockId: string,\n blockPackSpec: BlockPackSpecAny,\n resetArgs: boolean = false,\n author?: AuthorMarker,\n ): Promise<void> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfg = extractConfig(await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec));\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? { args: blockCfg.initialArgs, uiState: blockCfg.initialUiState } : undefined,\n ),\n );\n await this.projectTree.refreshState();\n }\n\n /** Deletes a block with all associated data. */\n public async deleteBlock(blockId: string, author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId));\n this.navigationStates.deleteBlock(blockId);\n await this.projectTree.refreshState();\n }\n\n /**\n * Updates block order according to the given array of block ids.\n *\n * Provided array must contain exactly the same set of ids current project cosists of,\n * an error will be thrown instead.\n */\n public async reorderBlocks(blocks: string[], author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n const currentStructure = mut.structure;\n if (currentStructure.groups.length !== 1)\n throw new Error('Unexpected project structure, non-sinular block group');\n const currentGroup = currentStructure.groups[0];\n if (currentGroup.blocks.length !== blocks.length)\n throw new Error(`Lengh mismatch: ${currentGroup.blocks.length} !== ${blocks.length}`);\n if (new Set<string>(blocks).size !== blocks.length) throw new Error(`Repeated block ids`);\n const newStructure: ProjectStructure = {\n groups: [\n {\n id: currentGroup.id,\n label: currentGroup.label,\n blocks: blocks.map((blockId) => {\n const block = currentGroup.blocks.find((b) => b.id === blockId);\n if (block === undefined) throw new Error(`Can't find block: ${blockId}`);\n return block;\n }),\n },\n ],\n };\n mut.updateStructure(newStructure);\n });\n await this.projectTree.refreshState();\n }\n\n /**\n * Renders production part of the block starting all connected heavy computations.\n * Upstream blocks of the specified block will be started automatically if in\n * stale state.\n * */\n public async runBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true));\n await this.projectTree.refreshState();\n }\n\n /**\n * Stops the block if it is running by destroying its production state. All\n * its downstreams will also be destroyed or moved to limbo if already\n * calculated.\n * */\n public async stopBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.stopProduction(blockId));\n await this.projectTree.refreshState();\n }\n\n // /** Update block label. */\n // public async setBlockLabel(blockId: string, label: string, author?: AuthorMarker) {\n // await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n // mut.setBlockLabel(blockId, label);\n // });\n // await this.projectTree.refreshState();\n // }\n\n /**\n * Sets block args, and changes whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgs(blockId: string, args: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, args }]),\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets ui block state associated with the block.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setUiState(blockId: string, uiState: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, uiState }]),\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\n // eslint-disable-next-line @typescript-eslint/require-await\n public async setNavigationState(blockId: string, state: NavigationState): Promise<void> {\n this.navigationStates.setState(blockId, state);\n }\n\n /**\n * Sets block args and ui state, and changes the whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgsAndUiState(\n blockId: string,\n args: unknown,\n uiState: unknown,\n author?: AuthorMarker,\n ) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n mut.setStates([{ blockId, args, uiState }]);\n });\n await this.projectTree.refreshState();\n }\n\n /** Update block settings */\n public async setBlockSettings(blockId: string, newValue: BlockSettings) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, undefined, (mut) => {\n mut.setBlockSettings(blockId, newValue);\n });\n await this.projectTree.refreshState();\n }\n\n /** Resets arguments and ui state of the block to initial state */\n public async resetBlockArgsAndUiState(blockId: string, author?: AuthorMarker): Promise<void> {\n await this.env.pl.withWriteTx('BlockInputsReset', async (tx) => {\n // reading default arg values from block pack\n const bpHolderRid = ensureResourceIdNotNull(\n (await tx.getField(field(this.rid, projectFieldName(blockId, 'blockPack')))).value,\n );\n const bpRid = ensureResourceIdNotNull(\n (await tx.getField(field(bpHolderRid, Pl.HolderRefField))).value,\n );\n const bpData = await tx.getResourceData(bpRid, false);\n const config = extractConfig(cachedDeserialize<BlockPackInfo>(notEmpty(bpData.data)).config);\n await withProjectAuthored(this.env.projectHelper, tx, this.rid, author, (prj) => {\n prj.setStates([{ blockId, args: config.initialArgs, uiState: config.initialUiState }]);\n });\n await tx.commit();\n });\n await this.projectTree.refreshState();\n }\n\n private getBlockComputables(blockId: string): BlockStateComputables {\n const cached = this.blockComputables.get(blockId);\n if (cached === null) throw new Error(`Block ${blockId} is deleted`);\n if (cached === undefined) {\n // state consists of inputs (args + ui state) and outputs\n const outputs = blockOutputs(this.projectTree.entry(), blockId, this.env);\n const fullState = Computable.make(\n (ctx) => {\n return {\n argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId),\n overview: this.overview,\n };\n },\n {\n postprocessValue: (v) => {\n const sdkVersion = v.overview?.blocks?.find((b) => b.id == blockId)?.sdkVersion;\n const toString = sdkVersion && shouldStillUseStringErrors(sdkVersion);\n const newOutputs = toString && v.outputs !== undefined\n ? convertErrorsToStrings(v.outputs)\n : v.outputs;\n\n return {\n ...v.argsAndUiState,\n outputs: newOutputs,\n navigationState: v.navigationState,\n } as BlockStateInternal;\n },\n },\n );\n\n const computables: BlockStateComputables = {\n fullState: fullState.withPreCalculatedValueTree(),\n };\n\n this.blockComputables.set(blockId, computables);\n\n return computables;\n }\n return cached;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch full block state,\n * including outputs, arguments, ui state.\n * */\n public getBlockState(blockId: string): Computable<BlockStateInternal> {\n return this.getBlockComputables(blockId).fullState;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch path of the\n * folder containing frontend code.\n * */\n public getBlockFrontend(blockId: string): ComputableStableDefined<FrontendData> {\n const cached = this.blockFrontends.get(blockId);\n if (cached === undefined) {\n const fd = frontendData(\n this.projectTree.entry(),\n blockId,\n this.env,\n ).withPreCalculatedValueTree();\n this.blockFrontends.set(blockId, fd);\n return fd;\n }\n return cached;\n }\n\n /** Called by middle layer on close */\n public async destroy(): Promise<void> {\n // terminating the project service loop\n this.destroyed = true;\n this.abortController.abort();\n await this.refreshLoopResult;\n\n // terminating the synchronized project tree\n await this.projectTree.terminate();\n\n // the following will deregister all external resource holders, like\n // downloaded files, running uploads and alike\n this.overview.resetState();\n this.blockFrontends.forEach((c) => c.resetState());\n this.blockComputables.forEach((c) => {\n if (c !== null) c.fullState.resetState();\n });\n this.activeConfigs.resetState();\n }\n\n /** @deprecated */\n public async destroyAndAwaitTermination(): Promise<void> {\n await this.destroy();\n }\n\n public static async init(env: MiddleLayerEnvironment, rid: ResourceId): Promise<Project> {\n // Applying migrations to the project resource, if needed\n await applyProjectMigrations(env.pl, rid);\n\n // Doing a no-op mutation to apply all migration and schema fixes\n await withProject(env.projectHelper, env.pl, rid, (_) => {});\n\n // Loading project tree\n const projectTree = await SynchronizedTreeState.init(\n env.pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: projectTreePruning,\n },\n env.logger,\n );\n\n if (env.ops.debugOps.dumpInitialTreeState) {\n const state = projectTree.dumpState();\n state.sort((a, b) => (b.data?.byteLength ?? 0) - (a.data?.byteLength ?? 0));\n const stats = treeDumpStats(state);\n await fs.writeFile(`${resourceIdToString(rid)}.json`, stringifyForDump(state));\n await fs.writeFile(`${resourceIdToString(rid)}.stats.json`, stringifyForDump(stats));\n }\n\n return new Project(env, rid, projectTree);\n }\n}\n\nfunction projectTreePruning(r: ExtendedResourceData): FieldData[] {\n // console.log(\n // JSON.stringify(\n // { ...r, kv: [], data: undefined } satisfies ExtendedResourceData,\n // (_, v) => {\n // if (typeof v === 'bigint') return v.toString();\n // return v;\n // }\n // )\n // );\n if (r.type.name.startsWith('StreamWorkdir/'))\n return [];\n switch (r.type.name) {\n case 'BlockPackCustom':\n return r.fields.filter((f) => f.name !== 'template');\n case 'UserProject':\n return r.fields.filter((f) => !f.name.startsWith('__serviceTemplate'));\n case 'Blob':\n return [];\n default:\n return r.fields;\n }\n}\n\n/** Returns true if sdk version of the block is old and we need to convert\n * ErrorLike errors to strings like it was.\n * We need it for keeping old blocks and new UI compatibility. */\nfunction shouldStillUseStringErrors(sdkVersion: string): boolean {\n return !isVersionGreater(sdkVersion, '1.26.0');\n}\n\n/** Checks if sdk version is greater that a target version. */\nfunction isVersionGreater(sdkVersion: string, targetVersion: string): boolean {\n const version = sdkVersion.split('.').map(Number);\n const target = targetVersion.split('.').map(Number);\n\n return (\n version[0] > target[0]\n || (version[0] === target[0] && version[1] > target[1])\n || (version[0] === target[0] && version[1] === target[1] && version[2] > target[2])\n );\n};\n\n/** Converts ErrorLike errors to strings in the outputs like it was in old ML versions. */\nfunction convertErrorsToStrings(\n outputs: Record<string, ComputableValueOrErrors<unknown>>,\n): Record<string, ComputableValueOrErrors<unknown>> {\n const result: Record<string, ComputableValueOrErrors<unknown>> = {};\n for (const [key, val] of Object.entries(outputs)) {\n if (val.ok) {\n result[key] = val;\n continue;\n }\n\n result[key] = {\n ok: false,\n errors: val.errors.map((e) => {\n if (typeof e === 'string') {\n return e;\n } else if (e.type == 'PlError' && e.fullMessage !== undefined) {\n return e.fullMessage;\n }\n return e.message;\n }),\n moreErrors: val.moreErrors,\n };\n }\n\n return result;\n}\n","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 pFrameConcurrency: 1,\n pTableConcurrency: 1,\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\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","'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","import type { PollPoolOps } from '@milaboratories/computable';\nimport { PollComputablePool } from '@milaboratories/computable';\nimport type {\n BlockPackFromRegistryV2,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n blockPackIdToString,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { Dispatcher } from 'undici';\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from './registry';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport semver from 'semver';\nimport canonicalize from 'canonicalize';\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500,\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = '__no_updates__';\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {},\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case 'dev-v1':\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'dev-v2':\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'from-registry-v2':\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case 'dev-v1': {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'dev-v2': {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'from-registry-v2': {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === 'patch') return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`,\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case 'major':\n vMainSuggestion = vSuggestions.find((v) => v.type !== 'major')?.update;\n break;\n case 'minor':\n vMainSuggestion = vSuggestions.find((v) => v.type === 'patch')?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } },\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion },\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n","import { isDisposable, isAsyncDisposable } from '@milaboratories/ts-helpers';\n\n/**\n * Function associated with particular entry from the RefCountResourcePool.\n *\n * Calling the function will release the reference acquired when object was\n * retieved from the pool.\n */\nexport type UnrefFn = () => void;\n\nexport interface PollResource<R> {\n /** Resource itself */\n readonly resource: R;\n\n /** Resource key, calculated using provided */\n readonly key: string;\n\n /** Callback to be called when requested resource can be disposed. */\n readonly unref: UnrefFn;\n}\n\nexport abstract class RefCountResourcePool<P, R> {\n private readonly resources = new Map<string, RefCountEnvelop<R>>();\n private readonly disposeQueue = Promise.resolve();\n protected abstract createNewResource(params: P): R;\n protected abstract calculateParamsKey(params: P): string;\n\n private check(key: string) {\n const envelop = this.resources.get(key);\n if (envelop === undefined) throw new Error('Unexpected state.');\n if (envelop.refCount === 0) {\n this.resources.delete(key);\n const resource = envelop.resource;\n\n if (isDisposable(resource)) {\n const _ = this.disposeQueue.then(() => resource[Symbol.dispose]());\n } else if (isAsyncDisposable(resource)) {\n const _ = this.disposeQueue.then(() => resource[Symbol.asyncDispose]());\n }\n }\n }\n\n public acquire(params: P): PollResource<R> {\n const key = this.calculateParamsKey(params);\n let envelop = this.resources.get(key);\n if (envelop === undefined) {\n envelop = { refCount: 0, resource: this.createNewResource(params) };\n this.resources.set(key, envelop);\n }\n\n // adding ref count\n envelop.refCount++;\n\n let unrefereced = false;\n return {\n resource: envelop.resource,\n key,\n unref: () => {\n if (unrefereced) return; // unref is idempotent, calling it many times have no effect\n // subtracting ref count\n envelop.refCount--;\n unrefereced = true;\n this.check(key);\n },\n };\n }\n\n public getByKey(key: string): R {\n const envelop = this.resources.get(key);\n if (envelop === undefined) throw new Error(`resource not found, key = ${key}`);\n return envelop.resource;\n }\n\n public tryGetByKey(key: string): R | undefined {\n return this.resources.get(key)?.resource;\n }\n}\n\ntype RefCountEnvelop<R> = {\n refCount: number;\n readonly resource: R;\n};\n","import type { DownloadDriver } from '@milaboratories/pl-drivers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { isPlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type { ComputableCtx, ComputableStableDefined } from '@milaboratories/computable';\nimport type {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n FindColumnsRequest,\n FindColumnsResponse,\n LocalBlobHandleAndSize,\n PColumnIdAndSpec,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n PTableColumnSpec,\n PTableHandle,\n PTableShape,\n PTableVector,\n TableRange,\n UniqueValuesRequest,\n UniqueValuesResponse,\n PFrameDriver as SdkPFrameDriver,\n PColumn,\n PFrameDef,\n JoinEntry,\n PTableDef,\n ValueType,\n PTableRecordSingleValueFilterV2,\n PTableRecordFilter,\n PColumnValues,\n DataInfo,\n PColumnValue,\n} from '@platforma-sdk/model';\nimport {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n mapDataInfo,\n isDataInfo,\n ensureError,\n PFrameDriverError,\n isAbortError,\n isPFrameDriverError,\n} from '@platforma-sdk/model';\nimport { LRUCache } from 'lru-cache';\nimport type { PollResource } from './ref_count_pool';\nimport { RefCountResourcePool } from './ref_count_pool';\nimport { allBlobs, makeDataInfoFromPColumnValues, mapBlobs, parseDataInfoResource } from './data';\nimport { createHash } from 'node:crypto';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { assertNever, emptyDir, ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport { PFrame } from '@milaboratories/pframes-rs-node';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { getDebugFlags } from '../debug';\n\ntype PColumnDataUniversal = PlTreeNodeAccessor | DataInfo<PlTreeNodeAccessor> | PColumnValues;\n\nfunction blobKey(res: ResourceInfo): string {\n return String(res.id);\n}\n\ntype InternalPFrameData = PFrameDef<DataInfo<ResourceInfo>>;\n\nconst valueTypes: ValueType[] = ['Int', 'Long', 'Float', 'Double', 'String', 'Bytes'] as const;\n\nfunction migrateFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === 'bySingleColumn') {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: 'bySingleColumnV2',\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n console.warn(\n `type overriten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filtersV2;\n}\n\nfunction migratePTableFilters<T>(\n def: Omit<PTableDef<T>, 'partitionFilters'> | PTableDef<T>,\n): PTableDef<T> {\n if (!('partitionFilters' in def)) {\n // For old blocks assume all axes filters to be partition filters\n return {\n ...def,\n partitionFilters: migrateFilters(def.filters.filter((f) => f.column.type === 'axis')),\n filters: migrateFilters(def.filters.filter((f) => f.column.type === 'column')),\n };\n }\n return {\n ...def,\n partitionFilters: migrateFilters(def.partitionFilters),\n filters: migrateFilters(def.filters),\n };\n}\n\nconst bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toString() : v);\n\nclass PTableCache {\n private readonly perFrame = new Map<PFrameHandle, LRUCache<PTableHandle, PollResource<PTableHolder>>>();\n private readonly global: LRUCache<PTableHandle, PollResource<PTableHolder>>;\n private readonly disposeListeners = new Map<PTableHandle, () => void>();\n\n constructor(\n private readonly logger: MiLogger,\n private readonly ops: PFrameDriverOps,\n ) {\n this.global = new LRUCache<PTableHandle, PollResource<PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === 'evict') {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n const disposeListener = this.disposeListeners.get(key)!;\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener('abort', disposeListener);\n\n resource.unref();\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(`calculateTableData cache - removed PTable ${key}`);\n }\n },\n });\n }\n\n public cache(resource: PollResource<PTableHolder>, size: number): void {\n const key = resource.key as PTableHandle;\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(`calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size });\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PollResource<PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === 'evict') {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n };\n this.disposeListeners.set(key, disposeListener);\n resource.resource.disposeSignal.addEventListener('abort', disposeListener);\n }\n}\n\nclass PFrameHolder implements PFrameInternal.PFrameDataSource, AsyncDisposable {\n public readonly pFramePromise: Promise<PFrameInternal.PFrameV9>;\n private readonly abortController = new AbortController();\n private readonly blobIdToResource = new Map<string, ResourceInfo>();\n private readonly blobHandleComputables = new Map<\n string,\n ComputableStableDefined<LocalBlobHandleAndSize>\n >();\n\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly spillPath: string,\n columns: InternalPFrameData,\n ) {\n const logFunc: PFrameInternal.Logger = (level, message) => this.logger[level](message);\n\n for (const column of columns) {\n for (const blob of allBlobs(column.data)) {\n this.blobIdToResource.set(blobKey(blob), blob);\n }\n }\n const distinctСolumns = [\n ...new Map(columns.map((column) => ({\n ...column,\n data: mapBlobs(column.data, blobKey),\n })).map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ];\n\n try {\n const pFrame = new PFrame(this.spillPath, logFunc);\n pFrame.setDataSource(this);\n const promises: Promise<void>[] = [];\n for (const column of distinctСolumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.dispose();\n throw new PFrameDriverError(\n `PFrame creation failed asynchronously, columns: ${JSON.stringify(distinctСolumns)}, error: ${ensureError(err)}`,\n );\n });\n } catch (err: unknown) {\n throw new PFrameDriverError(\n `PFrame creation failed synchronously, columns: ${JSON.stringify(distinctСolumns)}, error: ${ensureError(err)}`,\n );\n }\n }\n\n private getOrCreateComputableForBlob(blobId: string) {\n let computable = this.blobHandleComputables.get(blobId);\n if (computable !== undefined) return computable;\n\n const blobResource = this.blobIdToResource.get(blobId);\n if (blobResource === undefined) throw new PFrameDriverError(`Blob with id ${blobId} not found.`);\n\n // precalculation of value tree will trigger the download proecess right away\n computable = this.blobDriver.getDownloadedBlob(blobResource).withPreCalculatedValueTree();\n\n this.blobHandleComputables.set(blobId, computable);\n\n return computable;\n }\n\n public readonly preloadBlob = async (blobIds: string[]): Promise<void> => {\n const computables = blobIds.map((blobId) => this.getOrCreateComputableForBlob(blobId));\n for (const computable of computables) {\n try {\n await computable.awaitStableFullValue(this.disposeSignal);\n } catch (err: unknown) {\n if (isAbortError(err)) {\n break; // silence abort errors\n }\n throw err;\n }\n }\n };\n\n public readonly resolveBlobContent = async (blobId: string): Promise<Uint8Array> => {\n const computable = this.getOrCreateComputableForBlob(blobId);\n const path = this.blobDriver.getLocalPath((await computable.awaitStableValue(this.disposeSignal)).handle);\n return await fsp.readFile(path);\n };\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n for (const computable of this.blobHandleComputables.values()) computable.resetState();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.dispose();\n await this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => { /* mute error */ });\n }\n}\n\nclass PTableHolder implements AsyncDisposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV6>,\n public readonly predecessor?: PollResource<PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([pFrameDisposeSignal, this.abortController.signal]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.abortController.abort();\n await this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => { /* mute error */ });\n this.predecessor?.unref();\n }\n}\n\ntype FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport type PFrameDriverOps = {\n // Concurrency limits for `getUniqueValues` and `calculateTableData` requests\n pFrameConcurrency: number;\n // Concurrency limits for `getShape` and `getData` requests\n pTableConcurrency: number;\n // Maximum number of `calculateTableData` results cached for each PFrame\n pFrameCacheMaxCount: number;\n // Maximum size of `calculateTableData` results cached for PFrames overall.\n // The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n // Also each table has predeccessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n pFramesCacheMaxSize: number;\n};\n\n/**\n * Extends public and safe SDK's driver API with methods used internally in the middle\n * layer and in tests.\n */\nexport interface InternalPFrameDriver extends SdkPFrameDriver {\n /**\n * Dump active PFrames allocations in pprof format.\n * The result of this function should be saved as `profile.pb.gz`.\n * Use {@link https://pprof.me/} or {@link https://www.speedscope.app/}\n * to view the allocation flamechart.\n * @warning This method will always reject on Windows!\n */\n pprofDump(): Promise<Uint8Array>;\n\n /** Create a new PFrame */\n createPFrame(\n def: PFrameDef<PColumnDataUniversal>,\n ctx: ComputableCtx,\n ): PFrameHandle;\n\n /** Create a new PTable */\n createPTable(\n def: PTableDef<PColumn<PColumnDataUniversal>>,\n ctx: ComputableCtx,\n ): PTableHandle;\n\n /** Calculates data for the table and returns complete data representation of it */\n calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal\n ): Promise<CalculateTableDataResponse>;\n\n /** Calculate set of unique values for a specific axis for the filtered set of records */\n getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal\n ): Promise<UniqueValuesResponse>;\n\n /** Unified table shape */\n getShape(\n handle: PTableHandle,\n signal?: AbortSignal,\n ): Promise<PTableShape>;\n\n /**\n * Retrieve the data from the table. To retrieve only data required, it can be\n * sliced both horizontally ({@link columnIndices}) and vertically\n * ({@link range}).\n *\n * @param columnIndices unified indices of columns to be retrieved\n * @param range optionally limit the range of records to retrieve\n * */\n getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]>;\n}\n\nexport class PFrameDriver implements InternalPFrameDriver {\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>;\n private readonly pTables: RefCountResourcePool<FullPTableDef, PTableHolder>;\n private readonly pTableCache: PTableCache;\n private readonly frameConcurrencyLimiter: ConcurrencyLimitingExecutor;\n private readonly tableConcurrencyLimiter: ConcurrencyLimitingExecutor;\n\n public async pprofDump(): Promise<Uint8Array> {\n return await PFrame.pprofDump();\n }\n\n public static async init(\n blobDriver: DownloadDriver,\n logger: MiLogger,\n spillPath: string,\n ops: PFrameDriverOps,\n ): Promise<PFrameDriver> {\n const resolvedSpillPath = path.resolve(spillPath);\n await emptyDir(resolvedSpillPath);\n return new PFrameDriver(blobDriver, logger, resolvedSpillPath, ops);\n }\n\n private constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly spillPath: string,\n ops: PFrameDriverOps,\n ) {\n const concurrencyLimiter = new ConcurrencyLimitingExecutor(ops.pFrameConcurrency);\n this.frameConcurrencyLimiter = concurrencyLimiter;\n this.tableConcurrencyLimiter = new ConcurrencyLimitingExecutor(ops.pTableConcurrency);\n\n this.pTableCache = new PTableCache(this.logger, ops);\n\n this.pFrames = new (class extends RefCountResourcePool<InternalPFrameData, PFrameHolder> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n public acquire(params: InternalPFrameData): PollResource<PFrameHolder> {\n return super.acquire(params);\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) throw new PFrameDriverError(`PFrame not found, handle = ${key}`);\n return resource;\n }\n\n protected createNewResource(params: InternalPFrameData): PFrameHolder {\n if (getDebugFlags().logPFrameRequests)\n logger.info(\n `PFrame creation (pFrameHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n return new PFrameHolder(this.blobDriver, this.logger, this.spillPath, params);\n }\n\n protected calculateParamsKey(params: InternalPFrameData): string {\n try {\n return stableKeyFromPFrameData(params);\n } catch (err: unknown) {\n if (isPFrameDriverError(err)) throw err;\n throw new PFrameDriverError(`PFrame handle calculation failed, request: ${JSON.stringify(params, bigintReplacer)}, error: ${ensureError(err)}`);\n }\n }\n })(this.blobDriver, this.logger, this.spillPath);\n\n this.pTables = new (class extends RefCountResourcePool<\n FullPTableDef,\n PTableHolder\n > {\n constructor(\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>,\n ) {\n super();\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) throw new PFrameDriverError(`PTable not found, handle = ${key}`);\n return resource;\n }\n\n protected createNewResource(params: FullPTableDef): PTableHolder {\n if (getDebugFlags().logPFrameRequests) {\n logger.info(\n `PTable creation (pTableHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const handle = params.pFrameHandle;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\n\n // 3. Sort\n if (params.def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n sorting: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(params.def.sorting));\n return new PTableHolder(handle, disposeSignal, sortedTable, predecessor);\n }\n\n // 2. Filter\n if (params.def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n filters: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(params.def.filters));\n return new PTableHolder(handle, disposeSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) => pFrame.createTable({\n src: joinEntryToInternal(params.def.src),\n filters: params.def.partitionFilters,\n }));\n return new PTableHolder(handle, disposeSignal, table);\n }\n\n protected calculateParamsKey(params: FullPTableDef): string {\n try {\n return stableKeyFromFullPTableDef(params);\n } catch (err: unknown) {\n throw new PFrameDriverError(`PTable handle calculation failed, request: ${JSON.stringify(params)}, error: ${ensureError(err)}`);\n }\n }\n })(this.pFrames);\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(\n def: PFrameDef<PColumnDataUniversal>,\n ctx: ComputableCtx,\n ): PFrameHandle {\n const internalData = def\n .filter((c) => valueTypes.find((t) => t === c.spec.valueType))\n .map((c) =>\n mapPObjectData(c, (d) =>\n isPlTreeNodeAccessor(d)\n ? parseDataInfoResource(d)\n : isDataInfo(d)\n ? mapDataInfo(d, (a) => a.resourceInfo)\n : makeDataInfoFromPColumnValues(c.spec, d),\n ),\n );\n const res = this.pFrames.acquire(internalData);\n ctx.addOnDestroy(res.unref);\n return res.key as PFrameHandle;\n }\n\n public createPTable(\n rawDef: PTableDef<PColumn<PColumnDataUniversal>>,\n ctx: ComputableCtx,\n ): PTableHandle {\n const def = migratePTableFilters(rawDef);\n const pFrameHandle = this.createPFrame(extractAllColumns(def.src), ctx);\n const defIds = mapPTableDef(def, (c) => c.id);\n const res = this.pTables.acquire({ def: defIds, pFrameHandle });\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Create PTable call (pFrameHandle = ${pFrameHandle}; pTableHandle = ${JSON.stringify(res)}): ${JSON.stringify(\n mapPTableDef(def, (c) => c.spec),\n bigintReplacer,\n )}`,\n );\n ctx.addOnDestroy(res.unref); // in addition to pframe unref added in createPFrame above\n return res.key as PTableHandle;\n }\n\n //\n // PFrame istance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [{\n axesSpec: [\n ...new Map(request.compatibleWith.map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ],\n qualifications: [],\n }]\n : [],\n };\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n const responce = await pFrame.findColumns(iRequest);\n return {\n hits: responce.hits\n .filter((h) => // only exactly matching columns\n h.mappingVariants.length === 0\n || h.mappingVariants.some((v) =>\n v.qualifications.forHit.length === 0\n && v.qualifications.forQueries.every((q) => q.length === 0)))\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(handle: PFrameHandle, columnId: PObjectId): Promise<PColumnSpec> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.getColumnSpec(columnId);\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.listColumns();\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<CalculateTableDataResponse> {\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const table = this.pTables.acquire({\n pFrameHandle: handle,\n def: migratePTableFilters(request),\n });\n const { resource: { pTablePromise, disposeSignal } } = table;\n const pTable = await pTablePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.frameConcurrencyLimiter.run(async () => {\n try {\n const spec = pTable.getSpec();\n const data = await pTable.getData([...spec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const size = await pTable.getFootprint({\n withPredecessors: true,\n signal: combinedSignal,\n });\n this.pTableCache.cache(table, size);\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n } catch (err: unknown) {\n table.unref();\n throw err;\n }\n });\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal,\n ): Promise<UniqueValuesResponse> {\n if (getDebugFlags().logPFrameRequests) {\n this.logger.info(\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrame.getUniqueValues({\n ...request,\n filters: migrateFilters(request.filters),\n }, {\n signal: combinedSignal,\n });\n });\n }\n\n //\n // PTable istance methods\n //\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const { pTablePromise } = this.pTables.getByKey(handle);\n const pTable = await pTablePromise;\n return pTable.getSpec();\n }\n\n public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {\n const { pTablePromise, disposeSignal } = this.pTables.getByKey(handle);\n const pTable = await pTablePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.tableConcurrencyLimiter.run(async () => {\n return await pTable.getShape({\n signal: combinedSignal,\n });\n });\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]> {\n const { pTablePromise, disposeSignal } = this.pTables.getByKey(handle);\n const pTable = await pTablePromise;\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n\n return await this.tableConcurrencyLimiter.run(async () => {\n return await pTable.getData(columnIndices, {\n range,\n signal: combinedSignal,\n });\n });\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV3 {\n switch (entry.type) {\n case 'column':\n return {\n type: 'column',\n columnId: entry.column,\n };\n case 'slicedColumn':\n return {\n type: 'slicedColumn',\n columnId: entry.column,\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case 'inlineColumn':\n return {\n type: 'inlineColumn',\n newId: entry.column.id,\n spec: entry.column.spec,\n dataInfo: {\n type: 'Json',\n keyLength: entry.column.spec.axesSpec.length,\n data: entry.column.data.reduce((acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n }, {} as Record<string, PColumnValue>),\n },\n };\n case 'inner':\n case 'full':\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case 'outer':\n return {\n type: 'outer',\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction stableKeyFromFullPTableDef(data: FullPTableDef): string {\n const hash = createHash('sha256');\n hash.update(canonicalize(data)!);\n return hash.digest().toString('hex');\n}\n\nfunction stableKeyFromPFrameData(data: PColumn<DataInfo<ResourceInfo>>[]): string {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case 'Json':\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case 'JsonPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: blobKey(info),\n })),\n };\n break;\n case 'BinaryPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [blobKey(info.index), blobKey(info.values)] as const,\n })),\n };\n break;\n default:\n throw new PFrameDriverError(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);\n }\n result.payload.sort((lhs, rhs) => lhs.key.localeCompare(rhs.key));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => lhs.id.localeCompare(rhs.id));\n\n const hash = createHash('sha256');\n hash.update(canonicalize(orderedData)!);\n return hash.digest().toString('hex');\n}\n","import type { PlClient } from '@milaboratories/pl-client';\nimport type {\n InternalLsDriver } from '@milaboratories/pl-drivers';\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from '@milaboratories/pl-drivers';\nimport type * as Sdk from '@milaboratories/pl-model-common';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { InternalPFrameDriver } from '../pool';\nimport { PFrameDriver } from '../pool';\nimport type {\n DriverKitOps,\n DriverKitOpsConstructor,\n} from './ops';\nimport {\n DefaultDriverKitOpsPaths,\n DefaultDriverKitOpsSettings,\n} from './ops';\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit {\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const pFrameDriver = await PFrameDriver.init(\n blobDriver,\n ops.logger,\n ops.pframesSpillPath,\n ops.pFrameDriverOps,\n );\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n return {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n };\n}\n","import { extractCodeWithInfo, type BlockConfig, type PlRef } from '@platforma-sdk/model';\nimport { LRUCache } from 'lru-cache';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { executeSingleLambda } from '../js_render';\nimport type { ResourceId } from '@milaboratories/pl-client';\n\ntype EnrichmentTargetsRequest = {\n blockConfig: () => BlockConfig;\n args: () => unknown;\n};\n\ntype EnrichmentTargetsValue = {\n value: PlRef[] | undefined;\n};\n\nexport class ProjectHelper {\n private readonly enrichmentTargetsCache = new LRUCache<string, EnrichmentTargetsValue, EnrichmentTargetsRequest>({\n max: 256,\n memoMethod: (_key, _value, { context }) => {\n return { value: this.calculateEnrichmentTargets(context) };\n },\n });\n\n constructor(private readonly quickJs: QuickJSWASMModule) {}\n\n private calculateEnrichmentTargets(req: EnrichmentTargetsRequest): PlRef[] | undefined {\n const blockConfig = req.blockConfig();\n if (blockConfig.enrichmentTargets === undefined) return undefined;\n const args = req.args();\n const result = executeSingleLambda(this.quickJs, blockConfig.enrichmentTargets, extractCodeWithInfo(blockConfig)!, args) as PlRef[];\n return result;\n }\n\n public getEnrichmentTargets(blockConfig: () => BlockConfig, args: () => unknown, key?: { argsRid: ResourceId; blockPackRid: ResourceId }): PlRef[] | undefined {\n const req = { blockConfig, args };\n if (key === undefined)\n return this.calculateEnrichmentTargets(req);\n const cacheKey = `${key.argsRid}:${key.blockPackRid}`;\n return this.enrichmentTargetsCache.memo(cacheKey, { context: req }).value;\n }\n}\n","import type {\n PlClient,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n field,\n isNullResourceId,\n toGlobalResourceId,\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProjectAuthored } from '../mutator/project';\nimport type { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { BlockEventDispatcher } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport type {\n MiddleLayerOps,\n MiddleLayerOpsConstructor,\n} from './ops';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectListEntry } from '../model';\nimport type { AuthorMarker, ProjectMeta } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { getQuickJS } from 'quickjs-emscripten';\nimport type { MiddleLayerDriverKit } from './driver_kit';\nimport { initDriverKit } from './driver_kit';\nimport type { DriverKit, SupportedRequirement } from '@platforma-sdk/model';\nimport { RuntimeCapabilities } from '@platforma-sdk/model';\nimport type { DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport type { Dispatcher } from 'undici';\nimport { RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\nimport { ProjectHelper } from '../model/project_helper';\n\nexport interface MiddleLayerEnvironment {\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(requirement: SupportedRequirement, value: number | boolean = true): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {\n prj.setMeta(meta);\n });\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx('MLRemoveProject', async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx('Project id to resource id', async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error('Unexpected project list structure.');\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === 'string') return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them. */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.retryHttpDispatcher.destroy();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement('requiresModelAPIVersion', 1);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher: retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n","import type { ValueOrError } from '@milaboratories/ts-helpers';\nimport { setTimeout } from 'node:timers/promises';\nimport { request } from 'undici';\nimport type { Dispatcher } from 'undici';\nimport type { CheckNetworkOpts } from './network_check';\nimport { UnauthenticatedPlClient, type PlClientConfig } from '@milaboratories/pl-client';\n\n/** A report about one concrete ping to the service. */\nexport interface NetworkReport<T> {\n elapsedMs: number;\n response: ValueOrError<T>;\n}\n\nexport type HttpNetworkReport = NetworkReport<{\n statusCode: number;\n beginningOfBody: string;\n}>;\n\nexport async function backendPings(ops: CheckNetworkOpts, plConfig: PlClientConfig): Promise<NetworkReport<string>[]> {\n return await recordPings(ops.pingCheckDurationMs, ops.maxPingsPerSecond, async () => {\n const uaClient = new UnauthenticatedPlClient(plConfig);\n const response = await uaClient.ping();\n return JSON.stringify(response).slice(0, ops.bodyLimit) + '...';\n });\n}\n\nexport async function blockRegistryOverviewPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () =>\n await requestUrl(new URL(ops.blockOverviewPath, ops.blockRegistryUrl), ops, httpClient),\n );\n}\n\nexport async function blockGARegistryOverviewPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockOverviewPath, ops.blockGARegistryUrl), ops, httpClient),\n );\n}\n\nexport async function blockRegistryUiPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockRegistryUrl), ops, httpClient),\n );\n}\n\nexport async function blockGARegistryUiPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockGARegistryUrl), ops, httpClient),\n );\n}\n\nexport async function autoUpdateCdnPings(ops: CheckNetworkOpts, httpClient: Dispatcher): Promise<HttpNetworkReport[]> {\n return await recordPings(\n ops.autoUpdateCdnDurationMs,\n ops.maxAutoUpdateCdnChecksPerSecond,\n async () => await requestUrl(ops.autoUpdateCdnUrl, ops, httpClient),\n );\n}\n\n/** Executes a body several times per second up to the given duration,\n * and returns results and elapsed time for every result. */\nexport async function recordPings<T>(\n pingCheckDurationMs: number,\n maxPingsPerSecond: number,\n body: () => Promise<T>,\n): Promise<NetworkReport<T>[]> {\n const startPings = Date.now();\n const reports: NetworkReport<T>[] = [];\n\n while (elapsed(startPings) < pingCheckDurationMs) {\n const startPing = Date.now();\n let response: ValueOrError<T>;\n try {\n response = { ok: true, value: await body() };\n } catch (e) {\n response = { ok: false, error: e };\n }\n const elapsedPing = elapsed(startPing);\n\n reports.push({\n elapsedMs: elapsedPing,\n response,\n });\n\n const sleepBetweenPings = 1000 / maxPingsPerSecond - elapsedPing;\n\n if (sleepBetweenPings > 0) {\n await setTimeout(sleepBetweenPings);\n }\n }\n\n return reports;\n}\n\nexport async function requestUrl(url: string | URL, ops: CheckNetworkOpts, httpClient: Dispatcher) {\n const { body: rawBody, statusCode } = await request(url, {\n dispatcher: httpClient,\n headersTimeout: ops.httpTimeoutMs,\n bodyTimeout: ops.httpTimeoutMs,\n });\n const body = await rawBody.text();\n\n return {\n statusCode: statusCode,\n beginningOfBody: body.slice(0, ops.bodyLimit) + '...',\n };\n}\n\nexport function elapsed(startMs: number): number {\n return Date.now() - startMs;\n}\n\nexport function reportToString<T>(report: NetworkReport<T>[]): {\n ok: boolean;\n details: string;\n} {\n const successes = report.filter((r) => r.response.ok);\n const errorsLen = report.length - successes.length;\n const { mean: mean, median: median } = elapsedStat(report);\n\n const details = `\n total: ${report.length};\n successes: ${successes.length};\n errors: ${errorsLen};\n mean in ms: ${mean};\n median in ms: ${median};\n `;\n\n return {\n ok: errorsLen === 0,\n details,\n };\n}\n\nfunction elapsedStat(reports: { elapsedMs: number }[]) {\n const checks = reports.map((p) => p.elapsedMs).sort();\n const mean = checks.reduce((sum, p) => sum + p) / checks.length;\n\n let median = undefined;\n if (checks.length > 0) {\n const mid = Math.floor(checks.length / 2);\n median = checks.length % 2 ? checks[mid] : (checks[mid - 1] + checks[mid]) / 2;\n }\n\n return { mean, median };\n}\n","import type { FieldId, FieldRef, PlClient, ResourceData } from '@milaboratories/pl-client';\nimport { type PlTransaction, ContinuePolling, field, isNotNullResourceId, isNullResourceId, Pl, poll, toGlobalFieldId } from '@milaboratories/pl-client';\nimport { createRenderTemplate } from '../mutator/template/render_template';\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\nimport type { TemplateSpecAny } from '../model/template_spec';\nimport { loadTemplate, prepareTemplateSpec } from '../mutator/template/template_loading';\nimport type { ClientDownload, LsDriver } from '@milaboratories/pl-drivers';\nimport { ImportFileHandleUploadData, isSignMatch, isUpload, uploadBlob, type ClientUpload, type LsEntryWithAdditionalInfo } from '@milaboratories/pl-drivers';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { notEmpty, type MiLogger } from '@milaboratories/ts-helpers';\nimport type { ResourceInfo } from '@milaboratories/pl-tree';\nimport { text } from 'node:stream/consumers';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { StorageEntry } from '@milaboratories/pl-model-common';\n\nexport interface TemplateReport {\n status: 'ok' | 'warn' | 'failed';\n message: string;\n}\n\n/** Uploads `hello-world` template and checks the output is correct. */\nexport async function uploadTemplate(logger: MiLogger, pl: PlClient, name: string): Promise<TemplateReport> {\n try {\n const gotGreeting = await runUploadTemplate(logger, pl, name);\n if (gotGreeting !== `Hello, ${name}`) {\n return { status: 'failed', message: `Template uploading failed: expected: ${name}, got: ${gotGreeting}` };\n }\n\n return { status: 'ok', message: `Template uploading succeeded: ${gotGreeting}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `Template uploading failed: error occurred: ${e}` };\n }\n}\n\nexport async function runUploadTemplate(\n logger: MiLogger,\n pl: PlClient,\n name: string,\n): Promise<string> {\n const outputs = await runTemplate(\n pl,\n SdkTemplates['check_network.upload_template'],\n true,\n (tx) => ({\n name: tx.createValue(Pl.JsonObject, JSON.stringify(name)),\n }),\n ['greeting'],\n );\n\n try {\n return JSON.parse(notEmpty((await getFieldValue(pl, outputs.greeting)).data?.toString()));\n } finally {\n if (outputs != undefined) {\n await deleteFields(pl, Object.values(outputs));\n }\n }\n}\n\n/** Uploads a file to the backend and checks the output is a Blob resource. */\nexport async function uploadFile(\n logger: MiLogger,\n signer: Signer,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n pl: PlClient,\n filePath: string,\n): Promise<TemplateReport> {\n try {\n const gotBlob = await runUploadFile(logger, signer, lsDriver, uploadClient, pl, filePath);\n\n if (gotBlob.type.name !== 'Blob') {\n return { status: 'failed', message: `File uploading failed: ${gotBlob.type.name}` };\n }\n\n return { status: 'ok', message: `File uploading succeeded: ${gotBlob.type.name}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `File uploading failed: error occurred: ${e}` };\n }\n}\n\nexport async function runUploadFile(\n logger: MiLogger,\n signer: Signer,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n pl: PlClient,\n filePath: string,\n): Promise<ResourceInfo> {\n const handle = await lsDriver.getLocalFileHandle(filePath);\n const result = await runTemplate(\n pl,\n SdkTemplates['check_network.upload_blob'],\n true,\n (tx) => ({\n file: tx.createValue(Pl.JsonObject, JSON.stringify(handle)),\n }),\n ['progress', 'file'],\n );\n\n try {\n const progress = await getFieldValue(pl, result.progress);\n\n if (isUpload(progress)) {\n const uploadData = ImportFileHandleUploadData.parse(JSON.parse(notEmpty(progress.data?.toString())));\n const isUploadSignMatch = isSignMatch(signer, uploadData.localPath, uploadData.pathSignature);\n\n if (isUploadSignMatch) {\n await uploadBlob(\n logger,\n uploadClient,\n progress,\n uploadData,\n () => false,\n {\n nPartsWithThisUploadSpeed: 10,\n nPartsToIncreaseUpload: 10,\n currentSpeed: 10,\n maxSpeed: 10,\n },\n );\n }\n }\n\n return await getFieldValue(pl, result.file);\n } finally {\n await deleteFields(pl, Object.values(result));\n }\n}\n\n/** Uploads a file to the backend and then tries to download it back. */\nexport async function downloadFile(\n logger: MiLogger,\n pl: PlClient,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n downloadClient: ClientDownload,\n filePath: string,\n fileContent: string,\n): Promise<TemplateReport> {\n try {\n const gotFileContent = await runDownloadFile(logger, pl, lsDriver, uploadClient, downloadClient, filePath);\n\n if (gotFileContent !== fileContent) {\n return { status: 'failed', message: `File downloading failed: expected: ${fileContent}, got: ${gotFileContent}` };\n }\n return { status: 'ok', message: `File downloading succeeded: ${gotFileContent}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `File downloading failed: error occurred: ${e}` };\n }\n}\n\nexport async function runDownloadFile(\n logger: MiLogger,\n pl: PlClient,\n lsDriver: LsDriver,\n uploadClient: ClientUpload,\n downloadClient: ClientDownload,\n filePath: string,\n) {\n const handle = await lsDriver.getLocalFileHandle(filePath);\n\n const outputs = await runTemplate(\n pl,\n SdkTemplates['check_network.download_blob'],\n true,\n (tx) => ({ file: tx.createValue(Pl.JsonObject, JSON.stringify(handle)) }),\n ['progress', 'file'],\n );\n\n try {\n const progress = await getFieldValue(pl, outputs.progress);\n\n await uploadBlob(\n logger,\n uploadClient,\n progress,\n ImportFileHandleUploadData.parse(JSON.parse(notEmpty(progress.data?.toString()))),\n () => false,\n {\n nPartsWithThisUploadSpeed: 1,\n nPartsToIncreaseUpload: 1,\n currentSpeed: 1,\n maxSpeed: 1,\n },\n );\n\n const fileInfo = await getFieldValue(pl, outputs.file);\n\n return await downloadClient.withBlobContent(\n fileInfo,\n {},\n {},\n async (content) => await text(content),\n );\n } finally {\n await deleteFields(pl, Object.values(outputs));\n }\n}\n\n/** Runs Go's hello-world binary. */\nexport async function softwareCheck(pl: PlClient): Promise<TemplateReport> {\n try {\n const gotGreeting = await runSoftware(pl);\n\n if (gotGreeting !== 'Hello from go binary\\n') {\n return { status: 'failed', message: `Software check failed: got: ${gotGreeting}` };\n }\n return { status: 'ok', message: `Software check succeeded: ${gotGreeting}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `Software check failed: error occurred: ${e}` };\n }\n}\n\nexport async function runSoftware(pl: PlClient): Promise<string> {\n const result = await runTemplate(\n pl,\n SdkTemplates['check_network.run_hello_world'],\n true,\n (_: PlTransaction) => ({}),\n ['greeting'],\n );\n\n try {\n return notEmpty((await getFieldValue(pl, result.greeting)).data?.toString());\n } finally {\n await deleteFields(pl, Object.values(result));\n }\n}\n\n/** Runs Python hello-world. */\nexport async function pythonSoftware(pl: PlClient, name: string): Promise<TemplateReport> {\n try {\n const gotGreeting = await runPythonSoftware(pl, name);\n\n if (gotGreeting !== `Hello, ${name}!\\n`) {\n return { status: 'failed', message: `Python software check failed: got: ${gotGreeting}` };\n }\n return { status: 'ok', message: `Python software check succeeded: ${gotGreeting}` };\n } catch (e: unknown) {\n return { status: 'failed', message: `Python software check failed: error occurred: ${e}` };\n }\n}\n\nexport async function runPythonSoftware(pl: PlClient, name: string): Promise<string> {\n const result = await runTemplate(\n pl,\n SdkTemplates['check_network.run_hello_world_py'],\n true,\n (tx) => ({ name: tx.createValue(Pl.JsonObject, JSON.stringify(name)) }),\n ['greeting'],\n );\n\n try {\n return notEmpty((await getFieldValue(pl, result.greeting)).data?.toString());\n } finally {\n await deleteFields(pl, Object.values(result));\n }\n}\n\n/** Tries to download a file from every storage. */\nexport async function downloadFromEveryStorage(\n logger: MiLogger,\n pl: PlClient,\n lsDriver: LsDriver,\n ops: {\n minLsRequests: number;\n bytesLimit: number;\n minFileSize: number;\n maxFileSize: number;\n nFilesToCheck: number;\n },\n): Promise<Record<string, TemplateReport>> {\n try {\n const storages = await lsDriver.getStorageList();\n const results: Record<string, TemplateReport> = {};\n\n for (const storage of storages) {\n const result = await chooseFile(lsDriver, storage, ops.nFilesToCheck, ops.minFileSize, ops.maxFileSize, ops.minLsRequests);\n if (result.file === undefined) {\n results[storage.name] = {\n status: 'warn',\n message: `No file between ${ops.minFileSize} and ${ops.maxFileSize} bytes `\n + `found in storage ${storage.name}, checked ${result.nCheckedFiles} files, `\n + `did ${result.nLsRequests} ls requests`,\n };\n continue;\n }\n\n logger.info(`Downloading file ${JSON.stringify(result)} from storage ${storage.name}`);\n const outputs = await runTemplate(\n pl,\n SdkTemplates['check_network.create_workdir_from_storage'],\n true,\n (tx) => ({ file: tx.createValue(Pl.JsonObject, JSON.stringify((result.file as { handle: string }).handle)) }),\n ['workdirTypeName'],\n );\n\n try {\n const workdirTypeName = JSON.parse(Buffer.from((await getFieldValue(pl, outputs.workdirTypeName)).data!).toString()) as string;\n\n if (workdirTypeName?.startsWith('WorkingDirectory')) {\n results[storage.name] = {\n status: 'ok',\n message: `Workdir creation succeeded, size of file: ${result.file?.size}, `\n + `checked ${result.nCheckedFiles} files, did ${result.nLsRequests} ls requests`,\n };\n } else {\n results[storage.name] = {\n status: 'failed',\n message: `Workdir creation failed: ${workdirTypeName}, size of file: ${result.file?.size}, `\n + `checked ${result.nCheckedFiles} files, did ${result.nLsRequests} ls requests`,\n };\n }\n } finally {\n await deleteFields(pl, Object.values(outputs));\n }\n }\n\n return results;\n } catch (e: unknown) {\n return { unknown: { status: 'failed', message: `Download from every storage failed: error occurred: ${e}` } };\n }\n}\n\n/** Chooses a random file from the storage in a size range.\n * If we couldn't find a normal-sized file, we'll return a small file to check at least something.\n */\nexport async function chooseFile(\n lsDriver: LsDriver,\n storage: StorageEntry,\n limit: number,\n minSize: number,\n maxSize: number,\n minLsRequests: number,\n): Promise<{\n file: LsEntryWithAdditionalInfo | undefined;\n nLsRequests: number;\n nCheckedFiles: number;\n }> {\n const files = listFilesSequence(lsDriver, storage, '', 0);\n\n // return small file in case we don't have many normal-sized files.\n // While we'll download only a small range of bytes from the file,\n // we don't want to return a big file in case the underlying S3 doesn't support range requests.\n let smallFile: LsEntryWithAdditionalInfo | undefined;\n let nCheckedFiles = 0;\n let maxNLsRequests = 0;\n\n for await (const { file, nLsRequests } of files) {\n maxNLsRequests = Math.max(maxNLsRequests, nLsRequests);\n\n if (nCheckedFiles >= limit && maxNLsRequests > minLsRequests) {\n // we reached a limit on both the number of files and the number of ls requests.\n return { file: smallFile, nLsRequests: maxNLsRequests, nCheckedFiles };\n }\n nCheckedFiles++;\n if (minSize <= file.size && file.size <= maxSize) {\n return { file, nLsRequests: maxNLsRequests, nCheckedFiles };\n } else if (file.size < minSize) {\n smallFile = file;\n }\n }\n\n return { file: smallFile, nLsRequests: maxNLsRequests, nCheckedFiles };\n}\n\n/** Deep-first search for files in the storage. */\nexport async function* listFilesSequence(\n lsDriver: LsDriver,\n storage: StorageEntry,\n parent: string,\n nLsRequests: number,\n): AsyncGenerator<{ file: LsEntryWithAdditionalInfo; nLsRequests: number }, void, unknown> {\n nLsRequests++;\n const files = await lsDriver.listRemoteFilesWithAdditionalInfo(storage.handle, parent);\n\n for (const file of files.entries) {\n if (file.type === 'file' && file.fullPath.startsWith(parent)) {\n yield {\n file,\n nLsRequests,\n };\n } else if (file.type === 'dir') {\n for await (const nestedFile of listFilesSequence(lsDriver, storage, file.fullPath, nLsRequests)) {\n nLsRequests = Math.max(nestedFile.nLsRequests, nLsRequests);\n yield nestedFile;\n }\n }\n }\n}\n\n/** Creates a big temporary file with random content. */\nexport async function createBigTempFile(): Promise<{ filePath: string }> {\n const filePath = path.join(os.tmpdir(), `check-network-big-temp-${Date.now()}.bin`);\n const fileSize = 20 * 1024 * 1024; // 20 MiB\n\n const fileContent = randomBytes(fileSize);\n\n await fs.appendFile(filePath, fileContent);\n\n return { filePath };\n}\n\n/** Creates a temporarly file we could use for uploading and downloading. */\nexport async function createTempFile(): Promise<{ filePath: string; fileContent: string }> {\n const filePath = path.join(os.tmpdir(), `check-network-temp-${Date.now()}.txt`);\n\n const fileContent = 'Hello, world! ' + new Date().toISOString();\n await fs.writeFile(filePath, fileContent);\n\n return { filePath, fileContent };\n}\n\n/** Creates a template and RenderTemplate resources, gets all resources from outputs.\n * Throws a error if any of the outputs failed.\n */\nasync function runTemplate(\n client: PlClient,\n tpl: TemplateSpecAny,\n ephemeral: boolean,\n inputs: (tx: PlTransaction) => Pl.PlRecord,\n outputs: string[],\n): Promise<Record<string, FieldId>> {\n return await client.withWriteTx('TemplateRender', async (tx) => {\n const preparedTemplate = await prepareTemplateSpec(tpl);\n const tplResource = loadTemplate(tx, preparedTemplate);\n\n const outputFields: Record<string, FieldRef> = createRenderTemplate(\n tx, tplResource, ephemeral, inputs(tx), outputs,\n );\n\n const outputsIds: Record<string, FieldId> = {};\n\n for (const output of outputs) {\n const fieldRef = field(client.clientRoot, output);\n tx.createField(fieldRef, 'Dynamic', outputFields[output]);\n outputsIds[output] = await toGlobalFieldId(fieldRef);\n }\n\n await tx.commit();\n\n return outputsIds;\n });\n}\n\n/** Gets a resource from field's value or throws a error. */\nasync function getFieldValue(\n client: PlClient,\n fieldId: FieldId,\n): Promise<ResourceData> {\n // We could also do polling with pl-tree, but it seemed like an overkill,\n // that's why we have a simple polling here.\n\n return await poll(client, async (tx) => {\n const field = await tx.tx.getField(fieldId);\n if (isNotNullResourceId(field.error)) {\n const err = await tx.tx.getResourceData(field.error, true);\n throw new Error(`getFieldValue of \"${fieldId.fieldName}\" field failed: ${err.data}`);\n }\n\n if (isNullResourceId(field.value)) {\n throw new ContinuePolling();\n }\n\n return await tx.tx.getResourceData(field.value, true);\n });\n}\n\nasync function deleteFields(client: PlClient, fieldIds: FieldId[]) {\n await client.withWriteTx('DeleteFields', async (tx) => {\n for (const fieldId of fieldIds) {\n tx.resetField(fieldId);\n }\n await tx.commit();\n });\n}\n","/** A utility to check network problems and gather statistics.\n * It's useful when we cannot connect to the server of a company\n * because of security reasons,\n * but they can send us and their DevOps team this report.\n *\n * What we check:\n * - pings to backend\n * - block registry for block overview and ui.\n * - autoupdate CDN.\n * - upload workflow to backend (workflow part via our API).\n * - the desktop could do multipart upload.\n * - the desktop could download files from S3.\n * - backend could download software and run it.\n * - backend could run python software.\n * - try to get something from every storage to work storage.\n *\n * We don't check backend access to S3 storage, it is checked on the start of backend.\n */\n\nimport type { AuthInformation, PlClientConfig } from '@milaboratories/pl-client';\nimport { PlClient, UnauthenticatedPlClient, plAddressToConfig } from '@milaboratories/pl-client';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { ConsoleLoggerAdapter, HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport { channel } from 'node:diagnostics_channel';\nimport type { ClientDownload, ClientUpload } from '@milaboratories/pl-drivers';\nimport { LsDriver, createDownloadClient, createUploadBlobClient } from '@milaboratories/pl-drivers';\nimport type { HttpNetworkReport, NetworkReport } from './pings';\nimport { autoUpdateCdnPings, backendPings, blockGARegistryOverviewPings, blockGARegistryUiPings, blockRegistryOverviewPings, blockRegistryUiPings, reportToString } from './pings';\nimport type { Dispatcher } from 'undici';\nimport type { TemplateReport } from './template';\nimport { uploadTemplate, uploadFile, downloadFile, createTempFile, pythonSoftware, softwareCheck, createBigTempFile, downloadFromEveryStorage } from './template';\nimport { randomUUID } from 'node:crypto';\n\n/** All reports we need to collect. */\ninterface NetworkReports {\n plPings: NetworkReport<string>[];\n\n blockRegistryOverviewChecks: HttpNetworkReport[];\n blockGARegistryOverviewChecks: HttpNetworkReport[];\n blockRegistryUiChecks: HttpNetworkReport[];\n blockGARegistryUiChecks: HttpNetworkReport[];\n\n autoUpdateCdnChecks: HttpNetworkReport[];\n\n uploadTemplateCheck: TemplateReport;\n uploadFileCheck: TemplateReport;\n downloadFileCheck: TemplateReport;\n softwareCheck: TemplateReport;\n pythonSoftwareCheck: TemplateReport;\n storageToDownloadReport: Record<string, TemplateReport>;\n}\n\nexport interface CheckNetworkOpts {\n /** Platforma Backend pings options. */\n pingCheckDurationMs: number;\n pingTimeoutMs: number;\n maxPingsPerSecond: number;\n\n /** An options for CDN and block registry. */\n httpTimeoutMs: number;\n\n /** Block registry pings options. */\n blockRegistryDurationMs: number;\n maxRegistryChecksPerSecond: number;\n blockRegistryUrl: string;\n blockGARegistryUrl: string;\n blockOverviewPath: string;\n blockUiPath: string;\n\n /** CDN for auto-update pings options. */\n autoUpdateCdnDurationMs: number;\n maxAutoUpdateCdnChecksPerSecond: number;\n autoUpdateCdnUrl: string;\n\n /** Body limit for requests. */\n bodyLimit: number;\n\n /** Limit for the size of files to download from every storage. */\n everyStorageBytesLimit: number;\n /** Minimal size of files to create a directory from for every storage. */\n everyStorageMinFileSize: number;\n /** Maximal size of files to create a directory from for every storage. */\n everyStorageMaxFileSize: number;\n /** How many files to check from every storage. */\n everyStorageNFilesToCheck: number;\n /** Minimal number of ls requests for every storage. */\n everyStorageMinLsRequests: number;\n}\n\n/** Checks connectivity to Platforma Backend, to block registry\n * and to auto-update CDN,\n * and generates a string report. */\nexport async function checkNetwork(\n plCredentials: string,\n plUser: string | undefined,\n plPassword: string | undefined,\n optsOverrides: Partial<CheckNetworkOpts> = {},\n): Promise<string> {\n const undiciLogs: any[] = [];\n // Subscribe to all Undici diagnostic events\n undiciEvents.forEach((event) => {\n const diagnosticChannel = channel(event);\n diagnosticChannel.subscribe((message: any) => {\n const timestamp = new Date().toISOString();\n const data = { ...message };\n if (data?.response?.headers) {\n data.response = { ...data.response };\n data.response.headers = data.response.headers.slice();\n data.response.headers = data.response.headers.map((h: any) => h.toString());\n }\n\n // we try to upload big files, don't include the buffer in the report.\n if (data?.request?.body) {\n data.request = { ...data.request };\n data.request.body = `too big`;\n }\n\n undiciLogs.push(\n JSON.stringify({\n timestamp,\n event,\n data,\n }),\n );\n });\n });\n\n try {\n const {\n logger,\n plConfig,\n client,\n signer,\n downloadClient,\n uploadBlobClient,\n lsDriver,\n httpClient,\n ops,\n } = await initNetworkCheck(plCredentials, plUser, plPassword, optsOverrides);\n\n const { filePath: filePathToDownload, fileContent: fileContentToDownload } = await createTempFile();\n const { filePath: filePathToUpload } = await createBigTempFile();\n\n const report: NetworkReports = {\n plPings: await backendPings(ops, plConfig),\n blockRegistryOverviewChecks: await blockRegistryOverviewPings(ops, httpClient),\n blockGARegistryOverviewChecks: await blockGARegistryOverviewPings(ops, httpClient),\n blockRegistryUiChecks: await blockRegistryUiPings(ops, httpClient),\n blockGARegistryUiChecks: await blockGARegistryUiPings(ops, httpClient),\n\n autoUpdateCdnChecks: await autoUpdateCdnPings(ops, httpClient),\n\n uploadTemplateCheck: await uploadTemplate(logger, client, 'Jack'),\n uploadFileCheck: await uploadFile(logger, signer, lsDriver, uploadBlobClient, client, filePathToUpload),\n downloadFileCheck: await downloadFile(logger, client, lsDriver, uploadBlobClient, downloadClient, filePathToDownload, fileContentToDownload),\n softwareCheck: await softwareCheck(client),\n pythonSoftwareCheck: await pythonSoftware(client, 'Jack'),\n storageToDownloadReport: await downloadFromEveryStorage(\n logger,\n client,\n lsDriver,\n {\n minLsRequests: ops.everyStorageMinLsRequests,\n bytesLimit: ops.everyStorageBytesLimit,\n minFileSize: ops.everyStorageMinFileSize,\n maxFileSize: ops.everyStorageMaxFileSize,\n nFilesToCheck: ops.everyStorageNFilesToCheck,\n },\n ),\n };\n\n return reportsToString(report, plCredentials, ops, undiciLogs);\n } catch (e) {\n return `Unhandled error while checking the network: ${e}`;\n }\n}\n\nexport async function initNetworkCheck(\n plCredentials: string,\n plUser: string | undefined,\n plPassword: string | undefined,\n optsOverrides: Partial<CheckNetworkOpts> = {},\n): Promise<{\n logger: MiLogger;\n plConfig: PlClientConfig;\n signer: Signer;\n client: PlClient;\n downloadClient: ClientDownload;\n uploadBlobClient: ClientUpload;\n lsDriver: LsDriver;\n httpClient: Dispatcher;\n ops: CheckNetworkOpts;\n terminate: () => Promise<void>;\n }> {\n const ops: CheckNetworkOpts = {\n pingCheckDurationMs: 10000,\n pingTimeoutMs: 3000,\n maxPingsPerSecond: 50,\n\n httpTimeoutMs: 3000,\n\n blockRegistryDurationMs: 3000,\n maxRegistryChecksPerSecond: 1,\n\n blockRegistryUrl: 'https://blocks.pl-open.science',\n blockGARegistryUrl: 'https://blocks-ga.pl-open.science',\n blockOverviewPath: 'v2/overview.json',\n blockUiPath: 'v2/milaboratories/samples-and-data/1.7.0/ui.tgz',\n\n autoUpdateCdnDurationMs: 5000,\n maxAutoUpdateCdnChecksPerSecond: 1,\n autoUpdateCdnUrl:\n 'https://cdn.platforma.bio/software/platforma-desktop-v2/windows/amd64/latest.yml',\n\n bodyLimit: 300,\n\n everyStorageBytesLimit: 1024,\n everyStorageMinFileSize: 1024,\n everyStorageMaxFileSize: 200 * 1024 * 1024, // 200 MB\n everyStorageNFilesToCheck: 300,\n everyStorageMinLsRequests: 50,\n ...optsOverrides,\n };\n\n const plConfig = plAddressToConfig(plCredentials, {\n defaultRequestTimeout: ops.pingTimeoutMs,\n });\n\n // exposing alternative root for fields not to interfere with\n // projects of the user.\n plConfig.alternativeRoot = `check_network_${randomUUID()}`;\n\n const uaClient = new UnauthenticatedPlClient(plConfig);\n\n let auth: AuthInformation = {};\n if (plUser && plPassword) {\n auth = await uaClient.login(plUser, plPassword);\n }\n\n const client = await PlClient.init(plCredentials, { authInformation: auth });\n\n const httpClient = uaClient.ll.httpDispatcher;\n const logger = new ConsoleLoggerAdapter();\n\n // FIXME: do we need to get an actual secret?\n const signer = new HmacSha256Signer('localSecret');\n\n // We could initialize middle-layer here, but for now it seems like an overkill.\n // Here's the code to do it:\n //\n // const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'platforma-network-check-'));\n // const ml = await MiddleLayer.init(client, tmpDir, {\n // logger,\n // localSecret: '',\n // localProjections: [],\n // openFileDialogCallback: () => Promise.resolve([]),\n // preferredUpdateChannel: 'stable',\n // });\n\n const downloadClient = createDownloadClient(logger, client, []);\n const uploadBlobClient = createUploadBlobClient(client, logger);\n\n const lsDriver = await LsDriver.init(\n logger,\n client,\n signer,\n [],\n () => Promise.resolve([]),\n [],\n );\n\n const terminate = async () => {\n downloadClient.close();\n uploadBlobClient.close();\n await httpClient.close();\n await client.close();\n };\n\n return {\n logger,\n plConfig,\n client,\n signer,\n downloadClient,\n uploadBlobClient,\n lsDriver,\n httpClient,\n ops,\n terminate,\n };\n}\n\nfunction reportsToString(\n report: NetworkReports,\n plEndpoint: string,\n opts: CheckNetworkOpts,\n undiciLogs: any[],\n): string {\n const successPings = report.plPings.filter((p) => p.response.ok);\n const failedPings = report.plPings.filter((p) => !p.response.ok);\n const successPingsBodies = [\n ...new Set(successPings.map((p) => JSON.stringify((p.response as any).value))),\n ];\n\n const summary = (ok: boolean) => ok ? 'OK' : 'FAILED';\n const templateSummary = (report: TemplateReport) => report.status === 'ok' ? 'OK' : report.status === 'warn' ? 'WARN' : 'FAILED';\n\n const pings = reportToString(report.plPings);\n const blockRegistryOverview = reportToString(report.blockRegistryOverviewChecks);\n const blockGARegistryOverview = reportToString(report.blockGARegistryOverviewChecks);\n const blockRegistryUi = reportToString(report.blockRegistryUiChecks);\n const blockGARegistryUi = reportToString(report.blockGARegistryUiChecks);\n const autoUpdateCdn = reportToString(report.autoUpdateCdnChecks);\n\n const storagesSummary = Object.entries(report.storageToDownloadReport)\n .map(([storage, report]) => `${templateSummary(report)} ${storage} storage check`).join('\\n');\n\n return `\n${summary(pings.ok)} pings to Platforma Backend\n${summary(blockRegistryOverview.ok)} block registry overview\n${summary(blockGARegistryOverview.ok)} block ga registry overview\n${summary(blockRegistryUi.ok)} block registry ui\n${summary(blockGARegistryUi.ok)} block ga registry ui\n${summary(autoUpdateCdn.ok)} auto-update CDN\n${templateSummary(report.uploadTemplateCheck)} upload template\n${templateSummary(report.uploadFileCheck)} upload file\n${templateSummary(report.downloadFileCheck)} download file\n${templateSummary(report.softwareCheck)} software check\n${templateSummary(report.pythonSoftwareCheck)} python software check\n${storagesSummary}\n\ndetails:\npl endpoint: ${plEndpoint};\noptions: ${JSON.stringify(opts, null, 2)}.\n\nUpload template response: ${report.uploadTemplateCheck.message}\n\nUpload file response: ${report.uploadFileCheck.message}\n\nDownload file response: ${report.downloadFileCheck.message}\n\nSoftware check response: ${report.softwareCheck.message}\nPython software check response: ${report.pythonSoftwareCheck.message}\nStorage to download responses: ${JSON.stringify(report.storageToDownloadReport, null, 2)}\n\nPlatforma pings: ${pings.details}\n\nBlock registry overview responses: ${blockRegistryOverview.details}\n\nBlock ga registry overview responses: ${blockGARegistryOverview.details}\n\nBlock registry ui responses: ${blockRegistryUi.details}\n\nBlock ga registry ui responses: ${blockGARegistryUi.details}\n\nAuto-update CDN responses: ${autoUpdateCdn.details}\n\ndumps:\nBlock registry overview dumps:\n${JSON.stringify(report.blockRegistryOverviewChecks, null, 2)}\n\nBlock ga registry overview dumps:\n${JSON.stringify(report.blockGARegistryOverviewChecks, null, 2)}\n\nBlock registry ui dumps:\n${JSON.stringify(report.blockRegistryUiChecks, null, 2)}\n\nBlock ga registry ui dumps:\n${JSON.stringify(report.blockGARegistryUiChecks, null, 2)}\n\nAuto-update CDN dumps:\n${JSON.stringify(report.autoUpdateCdnChecks, null, 2)}\n\nPlatforma pings error dumps:\n${JSON.stringify(failedPings, null, 2)}\n\nPlatforma pings success dump examples:\n${JSON.stringify(successPingsBodies, null, 2)}\n\nUndici logs:\n${undiciLogs.join('\\n')}\n`;\n}\n\n// List of Undici diagnostic channels\nconst undiciEvents: string[] = [\n 'undici:request:create', // When a new request is created\n 'undici:request:bodySent', // When the request body is sent\n 'undici:request:headers', // When request headers are sent\n 'undici:request:error', // When a request encounters an error\n 'undici:request:trailers', // When a response completes.\n\n 'undici:client:sendHeaders',\n 'undici:client:beforeConnect',\n 'undici:client:connected',\n 'undici:client:connectError',\n\n 'undici:socket:close', // When a socket is closed\n 'undici:socket:connect', // When a socket connects\n 'undici:socket:error', // When a socket encounters an error\n\n 'undici:pool:request', // When a request is added to the pool\n 'undici:pool:connect', // When a pool creates a new connection\n 'undici:pool:disconnect', // When a pool connection is closed\n 'undici:pool:destroy', // When a pool is destroyed\n 'undici:dispatcher:request', // When a dispatcher processes a request\n 'undici:dispatcher:connect', // When a dispatcher connects\n 'undici:dispatcher:disconnect', // When a dispatcher disconnects\n 'undici:dispatcher:retry', // When a dispatcher retries a request\n];\n"],"names":["tryStat","path","fsp","error","LegacyDevBlockPackMetaYaml","RegistryV1","LegacyDevBlockPackMetaJson","LegacyDevBlockPackTemplate","LegacyDevBlockPackConfig","LegacyDevBlockPackFrontendFolder","CanonicalBlockConfigRequest","CanonicalBlockUiRequestPackageJson","LegacyDevBlockPackFiles","isLegacyDevPackage","packageRoot","mustResolve","root","request","res","tryResolve","resolveDevPacket","ignoreErrors","workflow","config","uiPackageJson","getFileContent","fs","getFileStat","getDevV1PacketMtime","devPath","mtime","f","fullPath","stat","getDevV2PacketMtime","description","wfStats","modelStats","BlockPackRegistry","v2Provider","registries","http","regEntry","result","regSpec","httpOptions","overview","overviewEntry","organization","pkg","latestMeta","latestVersion","id","latestOverview","AnyChannel","StableChannel","e","entry","legacyYamlContent","YAML","actualDevPath","v2Description","tryLoadPackDescription","bpSubfolder","BlockPackMetaEmbedAbsoluteBytes","assertNever","blockPacks","regSpecs","registryId","blockId","channel","_a","reg","V2RegistryProvider","__publicField","url","fromCache","newRegistry","RegistryV2Reader","folderReaderByUrl","CentralBlockRegistry","V1CentralRegistry","V1CentralDevSnapshotRegistry","InitialBlockStructure","InitialProjectRenderingState","InitialBlockMeta","ProjectResourceType","SchemaVersionKey","SchemaVersionCurrent","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","BlockArgsAuthorKeyPrefix","blockArgsAuthorKey","ProjectStructureAuthorKey","ServiceTemplateCacheFieldPrefix","getServiceTemplateField","hash","FieldsToDuplicate","projectFieldName","fieldName","projectFieldPattern","parseProjectField","name","match","ProjectsField","ProjectsResourceType","ProjectsListTreePruningFunction","resource","resourceTypesEqual","createProjectList","pl","rid","openedProjects","env","tree","SynchronizedTreeState","Computable","ctx","node","oProjects","field","prj","meta","notEmpty","created","lastModified","p","EphRenderTemplate","RenderTemplate","createRenderTemplate","tx","tpl","ephemeral","inputs","outputNames","rId","tplField","inputsField","Pl","BContextEnd","BContext","BContextId","BContextMultiParentPrefix","HeavyBlockOutputNames","createRenderHeavyBlock","createBContextEnd","createBContextFromUpstreams","upstreamCtxs","randomUUID","i","createTemplateV3Tree","tplData","resourceCache","createResourceCached","renderer","hashToSource","key","createHash","rKey","TemplateRenderer","LibRenderer","sources","PlTemplateLibV1","getSourceCode","_creator","SoftwareInfoRenderer","PlTemplateSoftwareV1","sw","ref","PlTemplateV1","srt","entries","a","b","libId","lib","swId","tplId","tplRef","fld","depTplId","depTpl","overrideRef","PlTemplateOverrideV1","sourceHash","loadTemplateFromExplicitDirect","spec","templateInfo","parseTemplate","templateFormat","createTemplateV2Tree","loadTemplateFromPrepared","templateData","createResource","hasher","TengoTemplateGet","TengoTemplateGetRegistry","TengoTemplateGetTemplateURI","TengoTemplateGetTemplate","TengoTemplatePack","TengoTemplatePackConvert","TengoTemplatePackConvertTemplatePack","TengoTemplatePackConvertTemplate","prepareTemplateSpec","loadTemplateFromRegistry","getTemplate","registry","uri","templateFromRegistry","loadTemplate","FrontendFromUrlResourceType","FrontendFromFolderResourceType","createFrontend","WorkerManager","workerPath","worker","Worker","data","resolve","reject","msg","type","args","BlockPackCustomType","BlockPackTemplateField","BlockPackFrontendField","tSlash","str","bufferToString","buffer","bufferToJson","BlockPackPreparer","v2RegistryProvider","signer","LRUCache","value","devPaths","configContent","loadPackDescription","urlPrefix","configResponse","components","_stack","explicit","workerManager","__using","_","_error","_hasError","_promise","__callDispose","templateContent","frontendPath","workflowContent","source","templateUrl","templateResponse","getModel","getWorkflow","model","createCustomBlockPack","blockPackInfo","bp","createBlockPack","outputRef","requireEnrichments","isBlockOutputReference","obj","addAllReferencedBlocks","allowed","child","inferAllReferencedBlocks","allBlocks","structure","g","BlockGraph","nodes","direction","rootBlockIds","all","r","cb","unprocessed","queued","nextUnprocessed","info","v","stagingGraph","previous","current","productionGraph","infoProvider","resultMap","resultGraph","allAbove","references","potentialUpstreams","upstreams","pId","transitiveUpstream","enrichmentTargets","t","dep","setsEqual","intersects","graphDiff","onlyInA","onlyInB","different","fromA","fromB","preparedTemplateEnvelop","getPreparedExportTemplateEnvelope","preparedTemplate","SdkTemplates","exportContext","exportTpl","flags","getDebugFlags","cached","modIdCb","valueCb","initialized","lastModId","currentModId","BlockInfo","fields","cachedDeserialize","bin","NoNewBlocks","ProjectMutator","author","schema","struct","renderingState","blocksInLimbo","blockInfos","ctxExportTplHolder","projectHelper","blockInfo","initialBlockSettings","InitialBlockSettings","prod","bInfo","argsField","blockPackField","isResourceId","content","block","state","fid","status","fieldNames","deleted","_b","_c","requests","changedArgs","somethingChanged","req","blockChanged","stateKey","statePart","gzipped","canonicalJsonBytes","binary","isGzipped","canonicalJsonGzBytes","statePartRef","newValue","upstream","upstreamContexts","results","extractConfig","diff","setA","setB","x","originalBlockInfo","fieldNamesToDuplicate","fieldState","newStructure","newBlockInitializer","currentStagingGraph","currentActualProductionGraph","newStagingGraph","stagingDiff","newActualProductionGraph","prodDiff","before","newStruct","done","group","idx","originalBlockId","newBlockId","after","originalBlock","newBlock","newArgsAndUiState","blockIds","addUpstreams","blockIdsSet","prodGraph","rendered","render","renderedArray","activeProdGraph","queue","Denque","stopped","downstream","lags","lag","upstreamLag","stagingRenderingRate","elapsed","lagThreshold","_d","markerStr","fullResourceStateP","schemaP","lastModifiedP","metaP","structureP","renderingStateP","fullResourceState","blockInfoStates","projectField","isNullResourceId","blockFieldRequests","fName","isResource","isResourceRef","stagingRefreshTimestamp","UiError","blockPackRequests","response","isNotNullResourceId","refField","ensureResourceIdNotNull","bpInfo","ctxExportTplEnvelope","ctxExportTplCacheFieldName","ctxExportTplField","blocksInLimboSet","blockConfig","blockPack","blockInStruct","createProject","ts","withProject","txOrPl","withProjectAuthored","PlClient","mut","allBlobs","blob","index","values","mapValues","callback","mapBlobs","mapping","PColumnDataJsonPartitioned","resourceType","PColumnDataJsonSuperPartitioned","PColumnDataBinaryPartitioned","PColumnDataBinarySuperPartitioned","PColumnDataJson","parseDataInfoResource","resourceData","dataContent","parts","superKey","superPart","keys","partKey","part","superData","resourceTypeToString","makeDataInfoFromPColumnValues","keyLength","jsonData","val","deriveLegacyPObjectId","canonicalize","deriveGlobalPObjectId","exportName","deriveLocalPObjectId","resolvePath","outputName","parseRawPObjectCollection","errorOnUnknownField","ignoreFieldErrors","prefix","entryPattern","locked","parseFinalPObjectCollection","rawCollection","assert","collection","ResultPool","blocks","allSpecsAvailable","outer","_f","_e","mapValueInVOE","resultWithErrors","isComplete","instabilityMarker","markUnstable","marker","tryAddEntry","exportsProcessed","predicate","found","exportsChecked","addToFound","executePSpecPredicate","prjEntry","rootBlockId","targetBlocks","loadCtx","staging","calculated","ctxAccessor","constructBlockContextArgsOnly","projectEntry","cCtx","cachedDecode","constructBlockContext","traverseCfg","cfg","guide","mapRecord","mapper","ifNotUndef","isActiveCfg","hasActiveCfgComponents","nested","resOp","SRMakeObject","k","SRFlatten","SRGetResourceField","mapArrayToRecord","elements","length","SRMapArrayValues1","ops","SRCollectArrayFromArgs","renderCfg","SRMapRecordValues1","nextArgs","newCtx","SRMapRecordValues2","SRIsEmpty","arg","SRNot","operand","SRAnd","operand1","operand2","SROr","SRResourceValueAsJson","SRGetJsonField","SRMapResourceFields1","SRMapResourceFields2","SRGetBlobContent","range","drivers","SRGetBlobContentAsString","resourceInfo","SRGetBlobContentAsJson","c","SRGetDownloadedBlobContent","SRGetOnDemandBlobContent","SRExtractArchiveAndGetURL","format","SRGetImportProgress","SRGetLastLogs","lines","SRGetProgressLog","patternToSearch","SRGetProgressLogWithInfo","SRGetLogHandle","ctxValue","computableFromCfgUnsafe","NonKeyCtxFields","toCfgContext","uiState","ReturnOpKey","ReturnArgKey","ReturnDestination","isReturnDestination","destination","zeroStack","execute","stack","operations","allowComputables","operationQueue","deliverResult","pending","computables","mainLoop","op","action","newOpKey","argRequests","initialArgCounter","operation","computableFromCfg","bCtx","resolvedOps","mc","postEnv","copyOfPendingSubrotines","copiedStack","bytesToBase64","ComputableContextHelper","parent","blockCtx","featureFlags","computableCtx","wellKnownAccessor","ctxKey","lambda","handle","commonOptions","steps","resolveSteps","acc","accResult","mapPObjectData","d","hPrefix","computable","fHandle","nLines","specs","def","mapPTableDef","isDataInfo","mapDataInfo","message","accessor","nextHandle","configCtx","vm","Scope","localScope","exportCtxFunction","fn","withCachedError","newErr","fnh","checkBlockFlag","activeArgs","step","stepHandle","isArrayBufferOrView","JsExecutionContext","scope","deadlineSetter","computableEnv","ErrorRepository","json","code","err","cbName","targetCallback","manage","simpleHandle","text","strHandle","JsRenderInternal","errorId","quickJSError","errors","stringifyWithResourceId","cause","causeName","PlQuickJSError","logOutputStatus","renderedResult","stable","recalculationCounter","unstableMarker","computableFromRF","fh","codeWithInfo","configKey","keepVmAlive","runtime","deadlineSettings","rCtx","s","toBeResolved","importedResult","resolved","executeSingleLambda","quickJs","isActive","isConfigLambda","computableFromCfgOrRF","cfgOrFh","getBlockPackInfo","bpAcc","argsEquals","clean","R","projectOverview","navigationStates","infos","cInputs","currentArguments","rInputs","prodArgs","currentGraph","limbo","defaultLabel","renderingMode","gNode","calculationStatus","sections","title","inputsValid","sdkVersion","isIncompatibleWithRuntime","bpId","blockCtxArgsOnly","extractCodeWithInfo","settings","updates","resourceIdToString","cantRun","staleBlocks","stale","u","canRun","bb","kernel","frontendRes","frontendUrlComputable","frontendData","frontendEntry","blockArgsAndUiState","deepFreeze","blockOutputs","outputs","cellId","cellCfg","computableOutput","activeConfigs","ret","activeOutputConfigs","NavigationStates","ChangeSource","DefaultNavigationState","projectOverviewLight","SchemaVersionV1","BlockFrontendStateKeyPrefixV1","applyProjectMigrations","schemaVersion","migrateV1ToV2","allKV","kvMap","kv","kvKey","valueJson","uiStateR","uiStateF","stringifyForDump","object","Project","projectTree","setTimeout","overviewLight","existingBlocks","isNotFoundError","isTimeoutOrCancelError","blockLabel","blockPackSpec","preparedBp","blockCfgContainer","blockCfg","resetArgs","currentStructure","currentGroup","bpHolderRid","bpRid","bpData","newOutputs","shouldStillUseStringErrors","convertErrorsToStrings","fd","projectTreePruning","stats","treeDumpStats","isVersionGreater","targetVersion","version","target","DefaultDriverKitOpsSettings","ConsoleLoggerAdapter","DefaultDriverKitOpsPaths","workDir","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","SEMVER_SPEC_VERSION","MAX_LENGTH","MAX_SAFE_INTEGER","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","constants","debug_1","require$$0","debug","require$$1","exports","module","re","safeRe","src","safeSrc","LETTERDASHNUMBER","safeRegexReplacements","makeSafeRegex","token","max","createToken","isGlobal","safe","looseOption","emptyOpts","parseOptions_1","options","numeric","compareIdentifiers","anum","bnum","identifiers","require$$2","parseOptions","require$$3","require$$4","SemVer","m","num","other","release","identifier","identifierBase","base","prerelease","semver","parse_1","throwErrors","er","parse","valid_1","clean_1","inc_1","diff_1","version1","version2","v1","v2","comparison","v1Higher","highVersion","lowVersion","highHasPre","major_1","loose","minor_1","patch_1","prerelease_1","parsed","compare_1","compare","rcompare_1","compareLoose_1","compareBuild_1","versionA","versionB","compareBuild","sort_1","list","rsort_1","gt_1","lt_1","eq_1","neq_1","gte_1","lte_1","eq","neq","gt","gte","lt","lte","require$$5","cmp_1","coerce_1","coerceRtlRegex","next","major","minor","patch","build","firstKey","lrucache","SPACE_CHARACTERS","Range","Comparator","first","isNullSet","isAny","comps","memoKey","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","cache","hr","hyphenReplace","comparatorTrimReplace","tildeTrimReplace","caretTrimReplace","rangeList","comp","parseComparator","replaceGTE0","rangeMap","comparators","thisComparators","isSatisfiable","rangeComparators","thisComparator","rangeComparator","testSet","LRU","require$$6","remainingComparators","testComparator","otherComparator","replaceCarets","replaceTildes","replaceXRanges","replaceStars","isX","replaceTilde","M","pr","replaceCaret","z","replaceXRange","gtlt","xM","xm","xp","anyX","incPr","$0","from","fM","fm","fp","fpr","fb","to","tM","tm","tp","tpr","set","ANY","cmp","comparator","satisfies_1","toComparators_1","maxSatisfying_1","versions","maxSV","rangeObj","minSatisfying_1","min","minSV","minVersion_1","minver","setMin","compver","valid","satisfies","require$$7","outside_1","hilo","gtfn","ltefn","ltfn","ecomp","high","low","outside","gtr_1","ltr_1","intersects_1","r1","r2","simplify","prev","ranges","simplified","original","subset","sub","dom","sawNonNull","OUTER","simpleSub","simpleDom","isSub","simpleSubset","minimumVersionWithPreRelease","minimumVersion","eqSet","higherGT","lowerLT","gtltComp","higher","lower","hasDomLT","hasDomGT","needDomLTPre","needDomGTPre","subset_1","internalRe","inc","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","rcompare","require$$14","compareLoose","require$$15","require$$16","sort","require$$17","rsort","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","coerce","require$$26","require$$27","require$$28","require$$29","toComparators","require$$30","maxSatisfying","require$$31","minSatisfying","require$$32","minVersion","require$$33","validRange","require$$34","require$$35","gtr","require$$36","ltr","require$$37","require$$38","simplifyRange","require$$39","require$$40","DefaultBlockUpdateWatcherOps","NoUpdatesKey","BlockUpdateWatcher","PollComputablePool","registryProvider","logger","cSpec","versionLock","skipVersion","blockPackIdToString","vSuggestions","vMainSuggestion","suggestions","update","mainSuggestion","res1","res2","RefCountResourcePool","envelop","isDisposable","isAsyncDisposable","params","unrefereced","blobKey","valueTypes","migrateFilters","filters","filtersV1","filtersV2","filter","filtersV1Json","migratePTableFilters","bigintReplacer","PTableCache","reason","disposeListener","size","perFrame","_resource","PFrameHolder","blobDriver","spillPath","columns","blobIds","blobId","isAbortError","logFunc","level","column","distinctСolumns","item","pFrame","PFrame","promises","PFrameDriverError","ensureError","blobResource","PTableHolder","pFrameDisposeSignal","pTablePromise","predecessor","pTable","PFrameDriver","concurrencyLimiter","ConcurrencyLimitingExecutor","stableKeyFromPFrameData","isPFrameDriverError","pFrames","pFramePromise","disposeSignal","sortedTable","filteredTable","table","joinEntryToInternal","stableKeyFromFullPTableDef","resolvedSpillPath","emptyDir","internalData","isPlTreeNodeAccessor","rawDef","pFrameHandle","extractAllColumns","defIds","iRequest","h","q","columnId","signal","combinedSignal","columnIndices","row","col","orderedData","lhs","rhs","initDriverKit","workdir","frontendDownloadPath","_ops","HmacSha256Signer","downloadClient","createDownloadClient","logsClient","createLogsClient","uploadBlobClient","createUploadBlobClient","uploadProgressClient","createUploadProgressClient","DownloadDriver","blobToURLDriver","DownloadBlobToURLDriver","uploadDriver","UploadDriver","logsStreamDriver","LogsStreamDriver","logDriver","LogsDriver","lsDriver","LsDriver","pFrameDriver","frontendDownloadDriver","DownloadUrlDriver","ProjectHelper","_key","_value","context","cacheKey","MiddleLayer","driverKit","projectListResourceId","openedProjectsList","projectListTree","blockRegistryProvider","projectList","requirement","toGlobalResourceId","projects","projectsField","projectsFieldData","retryHttpDispatcher","RetryAgent","bpPreparer","getQuickJS","runtimeCapabilities","RuntimeCapabilities","BlockEventDispatcher","WatchableValue","projectListTC","backendPings","plConfig","recordPings","UnauthenticatedPlClient","blockRegistryOverviewPings","httpClient","requestUrl","blockGARegistryOverviewPings","blockRegistryUiPings","blockGARegistryUiPings","autoUpdateCdnPings","pingCheckDurationMs","maxPingsPerSecond","body","startPings","reports","startPing","elapsedPing","sleepBetweenPings","rawBody","statusCode","startMs","reportToString","report","successes","errorsLen","mean","median","elapsedStat","details","checks","sum","mid","uploadTemplate","gotGreeting","runUploadTemplate","runTemplate","getFieldValue","deleteFields","uploadFile","uploadClient","filePath","gotBlob","runUploadFile","progress","isUpload","uploadData","ImportFileHandleUploadData","isSignMatch","uploadBlob","downloadFile","fileContent","gotFileContent","runDownloadFile","fileInfo","softwareCheck","runSoftware","pythonSoftware","runPythonSoftware","downloadFromEveryStorage","storages","storage","chooseFile","workdirTypeName","limit","minSize","maxSize","minLsRequests","files","listFilesSequence","smallFile","nCheckedFiles","maxNLsRequests","file","nLsRequests","nestedFile","createBigTempFile","os","fileSize","randomBytes","createTempFile","client","tplResource","outputFields","outputsIds","output","fieldRef","toGlobalFieldId","fieldId","poll","ContinuePolling","fieldIds","checkNetwork","plCredentials","plUser","plPassword","optsOverrides","undiciLogs","undiciEvents","event","timestamp","initNetworkCheck","filePathToDownload","fileContentToDownload","filePathToUpload","reportsToString","plAddressToConfig","uaClient","auth","plEndpoint","opts","successPings","failedPings","successPingsBodies","summary","ok","templateSummary","pings","blockRegistryOverview","blockGARegistryOverview","blockRegistryUi","blockGARegistryUi","autoUpdateCdn","storagesSummary"],"mappings":"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","x_google_ignoreList":[45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89]}
|