@milaboratories/pl-middle-layer 1.10.12
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/block_registry/index.d.ts +4 -0
- package/dist/block_registry/index.d.ts.map +1 -0
- package/dist/block_registry/registry.d.ts +37 -0
- package/dist/block_registry/registry.d.ts.map +1 -0
- package/dist/block_registry/registry_spec.d.ts +12 -0
- package/dist/block_registry/registry_spec.d.ts.map +1 -0
- package/dist/block_registry/watcher.d.ts +15 -0
- package/dist/block_registry/watcher.d.ts.map +1 -0
- package/dist/block_registry/well_known_registries.d.ts +4 -0
- package/dist/block_registry/well_known_registries.d.ts.map +1 -0
- package/dist/cfg_render/executor.d.ts +8 -0
- package/dist/cfg_render/executor.d.ts.map +1 -0
- package/dist/cfg_render/operation.d.ts +29 -0
- package/dist/cfg_render/operation.d.ts.map +1 -0
- package/dist/cfg_render/renderer.d.ts +6 -0
- package/dist/cfg_render/renderer.d.ts.map +1 -0
- package/dist/cfg_render/traverse.d.ts +3 -0
- package/dist/cfg_render/traverse.d.ts.map +1 -0
- package/dist/cfg_render/util.d.ts +5 -0
- package/dist/cfg_render/util.d.ts.map +1 -0
- package/dist/dev/index.d.ts +21 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/util.d.ts +3 -0
- package/dist/dev/util.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3587 -0
- package/dist/index.mjs.map +1 -0
- package/dist/js_render/context.d.ts +68 -0
- package/dist/js_render/context.d.ts.map +1 -0
- package/dist/js_render/index.d.ts +6 -0
- package/dist/js_render/index.d.ts.map +1 -0
- package/dist/middle_layer/active_cfg.d.ts +6 -0
- package/dist/middle_layer/active_cfg.d.ts.map +1 -0
- package/dist/middle_layer/block.d.ts +9 -0
- package/dist/middle_layer/block.d.ts.map +1 -0
- package/dist/middle_layer/block_ctx.d.ts +20 -0
- package/dist/middle_layer/block_ctx.d.ts.map +1 -0
- package/dist/middle_layer/block_ctx_unsafe.d.ts +16 -0
- package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -0
- package/dist/middle_layer/driver_kit.d.ts +31 -0
- package/dist/middle_layer/driver_kit.d.ts.map +1 -0
- package/dist/middle_layer/frontend_path.d.ts +6 -0
- package/dist/middle_layer/frontend_path.d.ts.map +1 -0
- package/dist/middle_layer/index.d.ts +5 -0
- package/dist/middle_layer/index.d.ts.map +1 -0
- package/dist/middle_layer/middle_layer.d.ts +78 -0
- package/dist/middle_layer/middle_layer.d.ts.map +1 -0
- package/dist/middle_layer/navigation_states.d.ts +10 -0
- package/dist/middle_layer/navigation_states.d.ts.map +1 -0
- package/dist/middle_layer/ops.d.ts +64 -0
- package/dist/middle_layer/ops.d.ts.map +1 -0
- package/dist/middle_layer/project.d.ts +110 -0
- package/dist/middle_layer/project.d.ts.map +1 -0
- package/dist/middle_layer/project_list.d.ts +11 -0
- package/dist/middle_layer/project_list.d.ts.map +1 -0
- package/dist/middle_layer/project_overview.d.ts +8 -0
- package/dist/middle_layer/project_overview.d.ts.map +1 -0
- package/dist/middle_layer/render.d.ts +6 -0
- package/dist/middle_layer/render.d.ts.map +1 -0
- package/dist/middle_layer/types.d.ts +11 -0
- package/dist/middle_layer/types.d.ts.map +1 -0
- package/dist/middle_layer/util.d.ts +3 -0
- package/dist/middle_layer/util.d.ts.map +1 -0
- package/dist/model/args.d.ts +12 -0
- package/dist/model/args.d.ts.map +1 -0
- package/dist/model/block_pack.d.ts +8 -0
- package/dist/model/block_pack.d.ts.map +1 -0
- package/dist/model/block_pack_spec.d.ts +40 -0
- package/dist/model/block_pack_spec.d.ts.map +1 -0
- package/dist/model/frontend.d.ts +10 -0
- package/dist/model/frontend.d.ts.map +1 -0
- package/dist/model/index.d.ts +3 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/project_model.d.ts +67 -0
- package/dist/model/project_model.d.ts.map +1 -0
- package/dist/model/project_model_util.d.ts +29 -0
- package/dist/model/project_model_util.d.ts.map +1 -0
- package/dist/model/template_spec.d.ts +16 -0
- package/dist/model/template_spec.d.ts.map +1 -0
- package/dist/mutator/block-pack/block_pack.d.ts +17 -0
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
- package/dist/mutator/block-pack/frontend.d.ts +4 -0
- package/dist/mutator/block-pack/frontend.d.ts.map +1 -0
- package/dist/mutator/context_export.d.ts +9 -0
- package/dist/mutator/context_export.d.ts.map +1 -0
- package/dist/mutator/project.d.ts +121 -0
- package/dist/mutator/project.d.ts.map +1 -0
- package/dist/mutator/template/render_block.d.ts +32 -0
- package/dist/mutator/template/render_block.d.ts.map +1 -0
- package/dist/mutator/template/render_template.d.ts +12 -0
- package/dist/mutator/template/render_template.d.ts.map +1 -0
- package/dist/mutator/template/template_loading.d.ts +13 -0
- package/dist/mutator/template/template_loading.d.ts.map +1 -0
- package/dist/pool/data.d.ts +24 -0
- package/dist/pool/data.d.ts.map +1 -0
- package/dist/pool/driver.d.ts +22 -0
- package/dist/pool/driver.d.ts.map +1 -0
- package/dist/pool/index.d.ts +3 -0
- package/dist/pool/index.d.ts.map +1 -0
- package/dist/pool/p_object_collection.d.ts +29 -0
- package/dist/pool/p_object_collection.d.ts.map +1 -0
- package/dist/pool/ref_count_pool.d.ts +25 -0
- package/dist/pool/ref_count_pool.d.ts.map +1 -0
- package/dist/pool/result_pool.d.ts +25 -0
- package/dist/pool/result_pool.d.ts.map +1 -0
- package/dist/test/block_packs.d.ts +6 -0
- package/dist/test/block_packs.d.ts.map +1 -0
- package/dist/test/explicit_templates.d.ts +3 -0
- package/dist/test/explicit_templates.d.ts.map +1 -0
- package/dist/test/known_templates.d.ts +6 -0
- package/dist/test/known_templates.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/block_registry/index.ts +3 -0
- package/src/block_registry/registry.test.ts +35 -0
- package/src/block_registry/registry.ts +180 -0
- package/src/block_registry/registry_spec.ts +13 -0
- package/src/block_registry/watcher.ts +72 -0
- package/src/block_registry/well_known_registries.ts +13 -0
- package/src/cfg_render/executor.test.ts +120 -0
- package/src/cfg_render/executor.ts +253 -0
- package/src/cfg_render/operation.ts +38 -0
- package/src/cfg_render/renderer.ts +540 -0
- package/src/cfg_render/traverse.ts +58 -0
- package/src/cfg_render/util.ts +29 -0
- package/src/dev/index.ts +89 -0
- package/src/dev/util.ts +13 -0
- package/src/index.ts +21 -0
- package/src/js_render/context.ts +768 -0
- package/src/js_render/index.ts +41 -0
- package/src/middle_layer/active_cfg.ts +56 -0
- package/src/middle_layer/block.ts +70 -0
- package/src/middle_layer/block_ctx.ts +90 -0
- package/src/middle_layer/block_ctx_unsafe.ts +29 -0
- package/src/middle_layer/driver_kit.ts +107 -0
- package/src/middle_layer/frontend_path.ts +83 -0
- package/src/middle_layer/index.ts +4 -0
- package/src/middle_layer/middle_layer.test.ts +720 -0
- package/src/middle_layer/middle_layer.ts +235 -0
- package/src/middle_layer/navigation_states.ts +48 -0
- package/src/middle_layer/ops.ts +147 -0
- package/src/middle_layer/project.ts +380 -0
- package/src/middle_layer/project_list.ts +59 -0
- package/src/middle_layer/project_overview.ts +220 -0
- package/src/middle_layer/render.test.ts +129 -0
- package/src/middle_layer/render.ts +19 -0
- package/src/middle_layer/types.ts +16 -0
- package/src/middle_layer/util.ts +22 -0
- package/src/model/args.ts +62 -0
- package/src/model/block_pack.ts +8 -0
- package/src/model/block_pack_spec.ts +52 -0
- package/src/model/frontend.ts +10 -0
- package/src/model/index.ts +2 -0
- package/src/model/project_model.test.ts +26 -0
- package/src/model/project_model.ts +142 -0
- package/src/model/project_model_util.test.ts +88 -0
- package/src/model/project_model_util.ts +169 -0
- package/src/model/template_spec.ts +18 -0
- package/src/mutator/block-pack/block_pack.test.ts +53 -0
- package/src/mutator/block-pack/block_pack.ts +187 -0
- package/src/mutator/block-pack/frontend.ts +29 -0
- package/src/mutator/context_export.ts +25 -0
- package/src/mutator/project.test.ts +272 -0
- package/src/mutator/project.ts +1112 -0
- package/src/mutator/template/render_block.ts +91 -0
- package/src/mutator/template/render_template.ts +40 -0
- package/src/mutator/template/template_loading.ts +77 -0
- package/src/mutator/template/template_render.test.ts +272 -0
- package/src/pool/data.ts +239 -0
- package/src/pool/driver.ts +325 -0
- package/src/pool/index.ts +2 -0
- package/src/pool/p_object_collection.ts +122 -0
- package/src/pool/ref_count_pool.ts +76 -0
- package/src/pool/result_pool.ts +284 -0
- package/src/test/block_packs.ts +23 -0
- package/src/test/explicit_templates.ts +8 -0
- package/src/test/known_templates.ts +24 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/dev/util.ts","../src/dev/index.ts","../src/block_registry/registry.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/template_loading.ts","../src/model/block_pack_spec.ts","../src/mutator/block-pack/frontend.ts","../src/mutator/block-pack/block_pack.ts","../src/model/args.ts","../src/model/project_model_util.ts","../src/mutator/context_export.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/context.ts","../src/js_render/index.ts","../src/middle_layer/render.ts","../src/middle_layer/project_overview.ts","../src/middle_layer/util.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.ts","../src/middle_layer/ops.ts","../src/block_registry/watcher.ts","../src/pool/ref_count_pool.ts","../src/pool/driver.ts","../src/middle_layer/driver_kit.ts","../src/middle_layer/middle_layer.ts"],"sourcesContent":["import { 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 'path';\nimport { tryStat } from './util';\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 tryResolve(root: string, request: string): string | undefined {\n try {\n return require.resolve(request, {\n paths: [root]\n });\n } catch (err: any) {\n if (err.code !== 'MODULE_NOT_FOUND') throw err;\n }\n return undefined;\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 { Dispatcher, request } from 'undici';\nimport { RegistrySpec } from './registry_spec';\nimport { BlockPackSpecAny } from '../model';\nimport { BlockPackDescriptionAbsolute, RegistryV1 } 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';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\n\n/**\n * Information specified by the developer of the block.\n * */\nexport type BlockPackMeta = {\n title: string;\n description: string;\n [metaField: string]: unknown;\n};\n\n/**\n * Information about specific package with specific organization and package names.\n * Mainly contain information about latest version of the package.\n * */\nexport type BlockPackPackageOverview = {\n organization: string;\n /** @deprecated */\n package: string;\n name: string;\n latestVersion: string;\n latestMeta: BlockPackMeta;\n registryLabel: string;\n latestSpec: BlockPackSpecAny;\n otherVersions: string[];\n};\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (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: any) {\n if (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 let mtime = 0n;\n const wfStats = await fs.promises.stat(description.components.workflow.file, { bigint: true });\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 registrySpecs: RegistrySpec[],\n private readonly http?: Dispatcher\n ) {}\n\n private async getPackagesForRoot(regSpec: RegistrySpec): Promise<BlockPackPackageOverview[]> {\n const result: BlockPackPackageOverview[] = [];\n switch (regSpec.type) {\n case 'remote_v1':\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 result.push({\n organization,\n package: pkg,\n name: pkg,\n latestVersion,\n latestMeta: latestMeta as BlockPackMeta,\n registryLabel: regSpec.label,\n latestSpec: {\n type: 'from-registry-v1',\n registryUrl: regSpec.url,\n organization,\n package: pkg,\n version: latestVersion\n // `${regSpec.url}/${packageContentPrefix({ organization, package: pkg, version: latestVersion })}`\n },\n otherVersions: overviewEntry.allVersions\n });\n }\n return result;\n\n case 'folder_with_dev_packages':\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 result.push({\n organization: config.organization,\n package: config.package, // TODO delete\n name: config.package,\n latestVersion: 'DEV',\n latestMeta: config.meta as BlockPackMeta,\n registryLabel: regSpec.label,\n latestSpec: {\n type: 'dev-v1',\n folder: devPath,\n mtime\n },\n otherVersions: []\n });\n }\n\n const v2Description = await tryLoadPackDescription(devPath);\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n result.push({\n organization: v2Description.id.organization,\n package: v2Description.id.name, // TODO delete\n name: v2Description.id.name,\n latestVersion: `${v2Description.id.version}-DEV`,\n latestMeta: v2Description.meta,\n registryLabel: regSpec.label,\n latestSpec: {\n type: 'dev-v2',\n folder: devPath,\n mtime\n },\n otherVersions: []\n });\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async getPackagesOverview(): Promise<BlockPackPackageOverview[]> {\n const packages: BlockPackPackageOverview[] = [];\n for (const regSpecs of this.registrySpecs)\n packages.push(...(await this.getPackagesForRoot(regSpecs)));\n return packages;\n }\n}\n","import { RegistrySpec } from './registry_spec';\n\nexport const CentralRegistry: RegistrySpec = {\n type: 'remote_v1',\n label: 'Central Release Registry',\n url: 'https://block.registry.platforma.bio/releases'\n};\n\nexport const CentralDevSnapshotRegistry: RegistrySpec = {\n type: 'remote_v1',\n label: 'Central Dev Snapshot registry',\n url: 'https://block.registry.platforma.bio/dev'\n};\n","import { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta\n} from '@milaboratories/pl-model-middle-layer';\nimport { 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 /** Label shown to the user */\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 = '1';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockFrontendStateKeyPrefix = 'BlockFrontendState/';\nexport const BlockFrontendStateKeyPattern = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKey(blockId: string): string {\n return `${BlockFrontendStateKeyPrefix}${blockId}`;\n}\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\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKey(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPattern);\n if (match === null) return undefined;\n return match.groups!['blockid'];\n}\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 | '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 function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern =\n /^(?<blockId>.*)-(?<fieldName>blockPack|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 { PruningFunction, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { PlClient, ResourceId, ResourceType, resourceTypesEqual } from '@milaboratories/pl-client';\nimport { TreeAndComputableU } from './types';\nimport { Computable, WatchableValue } from '@milaboratories/computable';\nimport {\n ProjectCreatedTimestamp,\n ProjectLastModifiedTimestamp,\n ProjectListEntry,\n ProjectMetaKey\n} from '../model/project_model';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { 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(pl, rid, {\n ...env.ops.defaultTreeOptions,\n pruning: ProjectsListTreePruningFunction\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 { AnyRef, field, Pl, PlTransaction } from '@milaboratories/pl-client';\nimport { 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, AnyRef> {\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 {\n AnyRef,\n field,\n PlTransaction,\n ResourceRef,\n ResourceType,\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 { AnyRef, field, Pl, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport fs from 'node:fs';\nimport {\n ExplicitTemplate,\n TemplateFromRegistry,\n TemplateSpecAny,\n TemplateSpecPrepared\n} from '../../model/template_spec';\nimport { assertNever } from '@milaboratories/ts-helpers';\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 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\nfunction loadTemplateFromExplicit(tx: PlTransaction, spec: ExplicitTemplate): AnyRef {\n const templatePack = tx.createValue(TengoTemplatePack, spec.content);\n const templatePackConvert = tx.createStruct(TengoTemplatePackConvert);\n const templatePackField = field(templatePackConvert, TengoTemplatePackConvertTemplatePack);\n const template = field(templatePackConvert, TengoTemplatePackConvertTemplate);\n\n tx.setField(templatePackField, templatePack);\n\n return template;\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 loadTemplateFromExplicit(tx, spec);\n default:\n return assertNever(spec);\n }\n}\n","import { ExplicitTemplate } from './template_spec';\nimport { ResourceType } from '@milaboratories/pl-client';\nimport { BlockConfig } from '@platforma-sdk/model';\nimport { 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: BlockConfig;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n}\n\n/** Block-pack spec that can be materialized in pl. */\nexport type BlockPackSpecPrepared = BlockPackExplicit;\n\n/** All block-pack specs. */\nexport type BlockPackSpecAny = BlockPackSpecPrepared | BlockPackSpec;\n","import { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport {\n FrontendFromFolderData,\n FrontendFromFolderResourceType,\n FrontendFromUrlData,\n FrontendFromUrlResourceType,\n FrontendSpec\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 { AnyResourceRef, field, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport { assertNever, Signer } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport { Dispatcher, request } from 'undici';\nimport { createFrontend } from './frontend';\nimport { BlockConfig } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev';\nimport { getDevV2PacketMtime } from '../../block_registry';\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\nexport class BlockPackPreparer {\n constructor(\n private readonly signer: Signer,\n private readonly http?: Dispatcher\n ) {}\n\n public async getBlockConfig(spec: BlockPackSpecAny): Promise<BlockConfig> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'dev':\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 BlockConfig;\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 BlockConfig;\n }\n\n case 'from-registry-v1': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix(spec)}`;\n\n const configResponse = await request(`${urlPrefix}/config.json`, httpOptions);\n\n return (await configResponse.body.json()) as BlockConfig;\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev':\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 BlockConfig;\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 BlockConfig;\n const workflowContent = await fs.promises.readFile(description.components.workflow.file);\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 httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix(spec)}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await request(templateUrl, httpOptions);\n if (templateResponse.statusCode !== 200)\n throw new Error(\n `Block not found in registry (url = ${templateUrl} ; code = ${templateResponse.statusCode}): ` +\n JSON.stringify(spec)\n );\n const templateContent = new Uint8Array(await templateResponse.body.arrayBuffer());\n\n // config\n const configResponse = await request(`${urlPrefix}/config.json`, httpOptions);\n const config = (await configResponse.body.json()) as BlockConfig;\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 default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackExplicit): 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 'explicit':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n","import { assertNever } from '@milaboratories/ts-helpers';\nimport { Ref } from '@platforma-sdk/model';\n\nexport function outputRef(blockId: string, name: string): Ref {\n return { __isRef: true, blockId, name };\n}\n\nexport function isBlockOutputReference(obj: any): obj is Ref {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n obj.__isRef === true &&\n 'blockId' in obj &&\n 'name' in obj\n );\n}\n\nfunction addAllReferencedBlocks(result: BlockUpstreams, node: any, 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)) result.upstreams.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 /** Direct block dependencies */\n upstreams: 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: any, allowed?: Set<string>): BlockUpstreams {\n const result = { upstreams: new Set<string>(), missingReferences: false };\n addAllReferencedBlocks(result, args, allowed);\n return result;\n}\n","import { Block, ProjectStructure } from './project_model';\nimport { Optional, Writable } from 'utility-types';\nimport { inferAllReferencedBlocks } from './args';\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 /** Direct upstreams */\n readonly upstream: Set<string>;\n /** Direct downstreams */\n readonly downstream: Set<string>;\n}\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(direction: 'upstream' | 'downstream', ...rootBlockIds: string[]): 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: 'upstream' | 'downstream',\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: 'upstream' | 'downstream',\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 let 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>, 'upstream' | 'downstream'>;\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.upstream = new Set<string>();\n } else {\n current.upstream = new Set<string>([previous.id]);\n previous.downstream = new Set<string>([current.id]);\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport function productionGraph(\n structure: ProjectStructure,\n argsProvider: (blockId: string) => any | undefined\n): BlockGraph {\n const result = new Map<string, BlockGraphNode>();\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 possibleUpstreams = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const args = argsProvider(id);\n\n // skipping those blocks for which we don't have args\n if (args === undefined) continue;\n\n const upstreams = inferAllReferencedBlocks(args, possibleUpstreams);\n const node: BlockGraphNode = {\n id,\n missingReferences: upstreams.missingReferences,\n upstream: upstreams.upstreams,\n downstream: new Set<string>() // will be populated from downstream blocks\n };\n result.set(id, node);\n upstreams.upstreams.forEach((dep) => result.get(dep)!.downstream.add(id));\n possibleUpstreams.add(id);\n }\n\n return new BlockGraph(result);\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 let matched = 0;\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 { AnyRef, PlTransaction } from '@milaboratories/pl-client';\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\nimport { createRenderTemplate } from './template/render_template';\nimport { prepareTemplateSpec } from './template/template_loading';\nimport { TemplateSpecPrepared } from '../model/template_spec';\nimport { createHash } from 'crypto';\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 const preparedTemplate = await prepareTemplateSpec(SdkTemplates['pframes.export-pframe']);\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","import {\n AnyRef,\n AnyResourceRef,\n BasicResourceData,\n ensureResourceIdNotNull,\n field,\n isNotNullResourceId,\n isNullResourceId,\n isResource,\n isResourceRef,\n Pl,\n PlClient,\n PlTransaction,\n ResourceId,\n ResourceRef\n} from '@milaboratories/pl-client';\nimport { createRenderHeavyBlock, createBContextFromUpstreams } from './template/render_block';\nimport {\n Block,\n BlockRenderingStateKey,\n ProjectStructure,\n ProjectStructureKey,\n parseProjectField,\n ProjectField,\n projectFieldName,\n ProjectRenderingState,\n SchemaVersionCurrent,\n SchemaVersionKey,\n ProjectResourceType,\n InitialBlockStructure,\n InitialProjectRenderingState,\n ProjectMetaKey,\n InitialBlockMeta,\n parseBlockFrontendStateKey,\n blockFrontendStateKey,\n blockArgsAuthorKey,\n ProjectLastModifiedTimestamp,\n ProjectCreatedTimestamp,\n ProjectStructureAuthorKey,\n getServiceTemplateField\n} from '../model/project_model';\nimport { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';\nimport {\n allBlocks,\n BlockGraph,\n graphDiff,\n productionGraph,\n stagingGraph\n} from '../model/project_model_util';\nimport { BlockPackSpecPrepared } from '../model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { AuthorMarker, ProjectMeta } from '@milaboratories/pl-model-middle-layer';\nimport Denque from 'denque';\nimport { exportContext, getPreparedExportTemplateEnvelope } from './context_export';\nimport { loadTemplate } from './template/template_loading';\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>>;\n\ninterface BlockInfoState {\n readonly id: string;\n readonly fields: BlockFieldStates;\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 as T;\n }\n const currentModId = modIdCb();\n if (lastModId !== currentModId) {\n lastModId = currentModId;\n value = valueCb();\n }\n return valueCb() as T;\n };\n}\n\nclass BlockInfo {\n constructor(\n public readonly id: string,\n public readonly fields: BlockFieldStates\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 currentInputsC = cached(\n () => this.fields.currentArgs!.modCount,\n () => JSON.parse(Buffer.from(this.fields.currentArgs!.value!).toString())\n );\n private readonly actualProductionInputsC = cached(\n () => this.fields.prodArgs?.modCount,\n () => {\n const bin = this.fields.prodArgs?.value;\n if (bin === undefined) return undefined;\n return JSON.parse(Buffer.from(bin).toString());\n }\n );\n\n get currentInputs(): any {\n return this.currentInputsC();\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 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();\n }\n\n get actualProductionInputs(): any | undefined {\n return this.actualProductionInputsC();\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}\n\nconst NoNewBlocks = (blockId: string) => {\n throw new Error(`No new block info for ${blockId}`);\n};\n\nexport interface SetArgsRequest {\n blockId: string;\n args: string;\n}\n\ntype GraphInfoFields =\n | 'stagingUpstream'\n | 'stagingDownstream'\n | 'futureProductionUpstream'\n | 'futureProductionDownstream'\n | 'actualProductionUpstream'\n | 'actualProductionDownstream';\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 private readonly changedBlockFrontendStates = new Set<string>();\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 blockFrontendStates: Map<string, string>,\n private readonly ctxExportTplHolder: AnyResourceRef\n ) {}\n\n private fixProblems() {\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\n get wasModified(): boolean {\n return (\n this.lastModifiedChanged ||\n this.structureChanged ||\n this.fieldsChanged ||\n this.metaChanged ||\n this.renderingStateChanged ||\n this.changedBlockFrontendStates.size > 0\n );\n }\n\n get structure(): ProjectStructure {\n // clone\n return JSON.parse(JSON.stringify(this.struct));\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 getPendingProductionGraph(): BlockGraph {\n if (this.pendingProductionGraph === undefined)\n this.pendingProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getBlockInfo(blockId).currentInputs\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.getBlockInfo(blockId).actualProductionInputs\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 return notEmpty(this.blockInfos.get(blockId));\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: Omit<BlockFieldState, 'modCount'>\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 private resetOrLimboProduction(blockId: string): boolean {\n const fields = this.getBlockInfo(blockId).fields;\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\n this.blocksInLimbo.add(blockId);\n this.renderingStateChanged = true;\n\n // doing some gc\n this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');\n\n return true;\n }\n // reset\n else return this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Optimally sets inputs for multiple blocks in one go */\n public setArgs(requests: SetArgsRequest[]) {\n const changed: string[] = [];\n for (const { blockId, args } of requests) {\n const info = this.getBlockInfo(blockId);\n JSON.parse(args); // checking\n const binary = Buffer.from(args);\n if (Buffer.compare(info.fields.currentArgs!.value!, binary) === 0) continue;\n const argsRef = this.tx.createValue(Pl.JsonObject, binary);\n this.setBlockField(blockId, 'currentArgs', argsRef, 'Ready', binary);\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(blockId);\n changed.push(blockId);\n }\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', changed, ({ id }) => this.resetStaging(id));\n\n if (changed.length > 0) this.updateLastModified();\n }\n\n public setUiState(blockId: string, newState: string | undefined): void {\n if (this.blockInfos.get(blockId) === undefined) throw new Error('no such block');\n if (this.blockFrontendStates.get(blockId) === newState) return;\n if (newState === undefined) this.blockFrontendStates.delete(blockId);\n else this.blockFrontendStates.set(blockId, newState);\n this.changedBlockFrontendStates.add(blockId);\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(blockId);\n this.updateLastModified();\n }\n\n /** Update block label */\n public setBlockLabel(blockId: string, label: string): void {\n const newStructure = this.structure;\n let ok = false;\n for (const block of allBlocks(newStructure))\n if (block.id === blockId) {\n block.label = label;\n ok = true;\n break;\n }\n if (!ok) throw new Error(`block ${blockId} not found`);\n this.updateStructure(newStructure);\n this.updateLastModified();\n }\n\n private createCtx(upstream: Set<string>, ctxField: 'stagingCtx' | 'prodCtx'): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields[ctxField] === undefined || info.fields[ctxField]!.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields[ctxField]!.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.createCtx(this.getStagingGraph().nodes.get(blockId)!.upstream, 'stagingCtx');\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.createCtx(\n this.getPendingProductionGraph().nodes.get(blockId)!.upstream,\n 'prodCtx'\n );\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 /** Very generic method, better check for more specialized case-specific methods first. */\n public updateStructure(\n newStructure: ProjectStructure,\n newBlockSpecProvider: (blockId: string) => NewBlockSpec = NoNewBlocks\n ): void {\n const currentStagingGraph = this.getStagingGraph();\n const currentActualProductionGraph = this.getActualProductionGraph();\n\n const newStagingGraph = stagingGraph(newStructure);\n\n // new actual production graph without new blocks\n const newActualProductionGraph = productionGraph(\n newStructure,\n (blockId) => this.blockInfos.get(blockId)?.actualProductionInputs\n );\n\n const stagingDiff = graphDiff(currentStagingGraph, newStagingGraph);\n const prodDiff = graphDiff(currentActualProductionGraph, newActualProductionGraph);\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 if (this.blockFrontendStates.delete(blockId)) this.changedBlockFrontendStates.add(blockId);\n }\n\n // creating new blocks\n for (const blockId of stagingDiff.onlyInB) {\n const info = new BlockInfo(blockId, {});\n this.blockInfos.set(blockId, info);\n const spec = newBlockSpecProvider(blockId);\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 // args\n const binArgs = Buffer.from(spec.args);\n const argsRes = this.tx.createValue(Pl.JsonObject, binArgs);\n this.setBlockField(blockId, 'currentArgs', argsRes, 'Ready', binArgs);\n\n // checking structure\n info.check();\n }\n\n // resetting stagings affected by topology change\n for (const blockId of stagingDiff.different) this.resetStaging(blockId);\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 return spec;\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, newArgs?: string): 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 (newArgs !== undefined) {\n // this will also reset all downstream stagings\n this.setArgs([{ blockId, args: newArgs }]);\n // reset UI state along with args\n this.setUiState(blockId, undefined);\n }\n // resetting staging outputs for all downstream blocks\n else\n this.getStagingGraph().traverse('downstream', [blockId], ({ id }) => this.resetStaging(id));\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 // checking that targets contain all upstreams\n else\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 // sending to limbo all downstream blocks\n prodGraph.traverse('downstream', [...rendered], (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 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 for (const blockId of this.changedBlockFrontendStates) {\n const uiState = this.blockFrontendStates.get(blockId);\n if (uiState === undefined) this.tx.deleteKValue(this.rid, blockFrontendStateKey(blockId));\n else this.tx.setKValue(this.rid, blockFrontendStateKey(blockId), uiState);\n }\n\n this.assignAuthorMarkers();\n }\n\n public static async load(\n tx: PlTransaction,\n rid: ResourceId,\n author?: AuthorMarker\n ): Promise<ProjectMutator> {\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 allKVP = tx.listKeyValuesString(rid);\n\n // loading jsons\n const [\n fullResourceState,\n schema,\n lastModified,\n meta,\n structure,\n { stagingRefreshTimestamp, blocksInLimbo },\n allKV\n ] = await Promise.all([\n fullResourceStateP,\n schemaP,\n lastModifiedP,\n metaP,\n structureP,\n renderingStateP,\n allKVP\n ]);\n if (schema !== SchemaVersionCurrent)\n throw new Error(\n `Can't act on this project resource because it has a wrong schema version: ${schema}`\n );\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 // 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 blockFrontendStates = new Map<string, string>();\n for (const kv of allKV) {\n const blockId = parseBlockFrontendStateKey(kv.key);\n if (blockId === undefined) continue;\n blockFrontendStates.set(blockId, kv.value);\n }\n\n const requests: [BlockFieldState, Promise<BasicResourceData>][] = [];\n blockInfoStates!.forEach(({ id, fields }) => {\n for (const [, 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 requests.push([state, tx.getResourceData(state.ref, false)]);\n }\n });\n for (const [state, response] of requests) {\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\n const blockInfos = new Map<string, BlockInfo>();\n blockInfoStates.forEach(({ id, fields }) => blockInfos.set(id, new BlockInfo(id, fields)));\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 blockFrontendStates,\n ctxExportTplHolder\n );\n\n prj.fixProblems();\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 txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n cb: (p: ProjectMutator) => T | Promise<T>\n): Promise<T> {\n return withProjectAuthored(txOrPl, rid, undefined, cb);\n}\n\nexport async function withProjectAuthored<T>(\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(tx, rid, author);\n const result = await cb(mut);\n if (!mut.wasModified)\n // skipping save and commit altogether if no modifications were\n // actually made\n return result;\n mut.save();\n await tx.commit();\n return result;\n });\n } else {\n const mut = await ProjectMutator.load(txOrPl, rid, author);\n const result = await cb(mut);\n mut.save();\n return result;\n }\n}\n","import { PObjectId, PObjectSpec } from '@platforma-sdk/model';\nimport { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { createHash } from 'crypto';\nimport canonicalize from 'canonicalize';\nimport {\n isNullResourceId,\n resourceType,\n resourceTypeToString,\n resourceTypesEqual\n} from '@milaboratories/pl-client';\nimport { Writable } from 'utility-types';\n\nexport function* allBlobs<B>(data: PFrameInternal.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): { [P in keyof T]: TResult } {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [key, callback(value, key as any)])\n ) as any;\n}\n\nexport function mapBlobs<B1, B2>(\n data: PFrameInternal.DataInfo<B1>,\n mapping: (blob: B1) => B2\n): PFrameInternal.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, PFrameInternal.JsonDataValue>;\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): PFrameInternal.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 = superKey.slice(0, superKey.length - 1) + ',' + key.slice(1, key.length);\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<PFrameInternal.BinaryChunkInfo<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, PFrameInternal.BinaryChunkInfo<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<PFrameInternal.BinaryChunkInfo<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 = superKey.slice(0, superKey.length - 1) + ',' + key.slice(1, key.length);\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 = superKey.slice(0, superKey.length - 1) + ',' + key.slice(1, key.length);\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, PFrameInternal.BinaryChunkInfo<ResourceInfo>>\n };\n }\n\n throw new Error(`unsupported resource type: ${resourceTypeToString(data.resourceType)}`);\n}\n\nexport function derivePObjectId(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","import { PlError, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { PObject, PObjectSpec, ValueOrError } from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport assert from 'assert';\nimport { Writable } from 'utility-types';\nimport { derivePObjectId } 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, string> | undefined;\n}\n\nconst BContextValuePrefix = 'values/';\nconst BContextValueSpecSuffix = '.spec';\nconst BContextValueDataSuffix = '.data';\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 default:\n // other value types planned\n continue;\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): 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 [exportName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${exportName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${exportName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${exportName}`);\n if (!data.ok) throw new PlError(data.error);\n collection[exportName] = {\n id: derivePObjectId(result.spec, data.value),\n spec: result.spec,\n data: data.value\n };\n }\n return collection;\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n Ref,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n executePSpecPredicate\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { outputRef } from '../model/args';\nimport {\n Block,\n ProjectStructure,\n ProjectStructureKey,\n projectFieldName\n} from '../model/project_model';\nimport { allBlocks, stagingGraph } from '../model/project_model_util';\nimport { Optional } from 'utility-types';\nimport { derivePObjectId } from './data';\nimport {\n RawPObjectCollection,\n RawPObjectEntry,\n parseRawPObjectCollection\n} from './p_object_collection';\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<Ref, '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 getBlockLabel(blockId: string): string {\n return notEmpty(this.blocks.get(blockId)?.info?.label, `block \"${blockId}\" not found`);\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, string>>, 'id'>\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, string>>, '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 ? derivePObjectId(result.spec, data.value) : 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 const ret: ExtendedOption[] = [];\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, string> | 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 { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { Optional } from 'utility-types';\nimport {\n Block,\n ProjectStructure,\n ProjectStructureKey,\n blockFrontendStateKey,\n projectFieldName\n} from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { ResultPool } from '../pool/result_pool';\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: string;\n readonly uiState: 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 projectNode: PlTreeNodeAccessor,\n blockId: string\n): BlockContextArgsOnly {\n const projectEntry = projectNode.persist();\n const args = notEmpty(\n projectNode\n .traverse({\n field: projectFieldName(blockId, 'currentArgs'),\n errorIfFieldNotSet: true\n })\n .getDataAsString()\n );\n const uiState = projectNode.getKeyValueAsString(blockFrontendStateKey(blockId));\n return {\n blockId,\n args,\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 projectNode: PlTreeNodeAccessor,\n blockId: string\n): BlockContextFull {\n const projectEntry = projectNode.persist();\n return {\n ...constructBlockContextArgsOnly(projectNode, 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 { 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 'GetBlobContentAsString':\n case 'GetBlobContentAsJson':\n case 'GetDownloadedBlobContent':\n case 'GetOnDemandBlobContent':\n case 'GetImportProgress':\n case 'GetLastLogs':\n case 'GetProgressLog':\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 { 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 {\n Cfg,\n CfgMapArrayValues,\n CfgMapRecordValues,\n CfgMapResourceFields\n} from '@platforma-sdk/model';\nimport { ArgumentRequests, Operation, OperationAction, Subroutine } from './operation';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { mapRecord } from './util';\nimport { computableFromCfgUnsafe } from './executor';\nimport { assertNever } from '@milaboratories/ts-helpers';\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, any> = {};\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);\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: 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: 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);\n }\n }\n )\n };\n };\n};\n\nconst SRGetBlobContentAsString: Subroutine = (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(() => drivers.blobDriver.getDownloadedBlob(resourceInfo), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle);\n return content.toString();\n }\n })\n };\n };\n};\n\nconst SRGetBlobContentAsJson: 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: Computable.make(\n (c) => drivers.blobDriver.getDownloadedBlob(c.accessor(source).node().resourceInfo),\n {\n postprocessValue: async (value) => {\n if (value == undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle);\n if (content == undefined) return undefined;\n return JSON.parse(Buffer.from(content).toString());\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 ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: 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 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 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 const ctxValue = ctx[cfg.variable];\n if (typeof ctxValue === 'function') return (e) => res(ctxValue(e.cCtx));\n else {\n if (ctxValue === undefined) console.log('asdasd');\n return resOp(ctxValue);\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,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContentAsString':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsString,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContentAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsJson,\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 '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 '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 { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { PlResourceEntry, StdCtx } from '@platforma-sdk/model';\nimport { 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: JSON.parse(ctx.args),\n $ui: ctx.uiState !== undefined ? JSON.parse(ctx.uiState) : undefined,\n $prod: ctx.prod,\n $staging: ctx.staging\n };\n}\n","import {\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 { Computable, ComputableCtx, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Cfg } from '@platforma-sdk/model';\nimport { renderCfg, resOp } from './renderer';\nimport canonicalize from 'canonicalize';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\nimport { 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 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 = canonicalize({\n ctx: Object.fromEntries(Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1)),\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 async postprocessValue(value: MaterializedComputable[], stable: boolean): Promise<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 { Computable, ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport {\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n JsRenderInternal,\n Option,\n PColumn,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport { QuickJSContext, QuickJSHandle, Scope, VmFunctionImplementation } from 'quickjs-emscripten';\nimport { Optional } from 'utility-types';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\nimport { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport { Block } from '../model/project_model';\nimport { parseFinalPObjectCollection } from '../pool/p_object_collection';\nimport { ResultPool } from '../pool/result_pool';\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString('base64') : undefined;\n}\n\nexport class JsExecutionContext\n implements JsRenderInternal.GlobalCfgRenderCtxMethods<string, string>\n{\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly computablesToResolve: Record<string, Computable<any>> = {};\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 scope: Scope,\n private readonly vm: QuickJSContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n computableCtx: ComputableCtx\n ) {\n this.computableCtx = computableCtx;\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 this.meta = blockCtx.blockMeta(computableCtx);\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\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 public evaluateBundle(code: string) {\n try {\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 }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n try {\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 throw err;\n }\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 ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix);\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): 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)).toString(\n 'utf-8'\n );\n }\n })\n );\n }\n\n public getBlobContentAsBase64(handle: string): 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)).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 // 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 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, string>>, '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 //\n // PFrames / PTables\n //\n\n public createPFrame(def: PFrameDef<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.getAccessor(d))),\n this.computableCtx\n );\n }\n\n public createPTable(def: PTableDef<PColumn<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) => mapPObjectData(c, (d) => this.getAccessor(d))),\n this.computableCtx\n );\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 //\n // QuickJS Helpers\n //\n\n private 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) throw new Error(`Can't export value: ${obj}`);\n return result;\n }\n\n private 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): unknown {\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 // Exporting props\n\n this.vm.setProp(configCtx, 'args', localScope.manage(this.vm.newString(this.blockCtx.args)));\n if (this.blockCtx.uiState !== undefined)\n this.vm.setProp(\n configCtx,\n 'uiState',\n localScope.manage(this.vm.newString(this.blockCtx.uiState))\n );\n\n this.vm.setProp(configCtx, 'callbackRegistry', this.callbackRegistry);\n\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>\n ): void => {\n this.vm.newFunction(name, fn).consume((fnh) => this.vm.setProp(configCtx, name, fnh));\n };\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction('getAccessorHandleByName', (name) => {\n return this.exportSingleValue(\n this.getAccessorHandleByName(this.vm.getString(name)),\n undefined\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction('resolveWithCommon', (handle, commonOptions, ...steps) => {\n return this.exportSingleValue(\n this.resolveWithCommon(\n this.vm.getString(handle),\n this.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => this.importObjectViaJson(step) as FieldTraversalStepFromSDK | string\n )\n ),\n undefined\n );\n });\n\n exportCtxFunction('getResourceType', (handle) => {\n return this.exportObjectViaJson(this.getResourceType(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getInputsLocked', (handle) => {\n return this.exportSingleValue(this.getInputsLocked(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getOutputsLocked', (handle) => {\n return this.exportSingleValue(this.getOutputsLocked(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsReadyOrError', (handle) => {\n return this.exportSingleValue(this.getIsReadyOrError(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsFinal', (handle) => {\n return this.exportSingleValue(this.getIsFinal(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getError', (handle) => {\n return this.exportSingleValue(this.getError(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listInputFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listOutputFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listDynamicFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getKeyValueBase64', (handle, key) => {\n return this.exportSingleValue(\n this.getKeyValueBase64(this.vm.getString(handle), this.vm.getString(key)),\n undefined\n );\n });\n\n exportCtxFunction('getKeyValueAsString', (handle, key) => {\n return this.exportSingleValue(\n this.getKeyValueAsString(this.vm.getString(handle), this.vm.getString(key)),\n undefined\n );\n });\n\n exportCtxFunction('getDataBase64', (handle) => {\n return this.exportSingleValue(this.getDataBase64(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getDataAsString', (handle) => {\n return this.exportSingleValue(this.getDataAsString(this.vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction('parsePObjectCollection', (handle, errorOnUnknownField, prefix) => {\n return this.exportObjectUniversal(\n this.parsePObjectCollection(\n this.vm.getString(handle),\n this.vm.dump(errorOnUnknownField) as boolean,\n this.vm.getString(prefix)\n ),\n undefined\n );\n });\n\n //\n // Blobs\n //\n\n exportCtxFunction('getBlobContentAsBase64', (handle) => {\n return this.exportSingleValue(\n this.getBlobContentAsBase64(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getBlobContentAsString', (handle) => {\n return this.exportSingleValue(\n this.getBlobContentAsString(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getDownloadedBlobContentHandle', (handle) => {\n return this.exportSingleValue(\n this.getDownloadedBlobContentHandle(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getOnDemandBlobContentHandle', (handle) => {\n return this.exportSingleValue(\n this.getOnDemandBlobContentHandle(this.vm.getString(handle)),\n undefined\n );\n });\n\n //\n // ImportProgress\n //\n\n exportCtxFunction('getImportProgress', (handle) => {\n return this.exportSingleValue(this.getImportProgress(this.vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction('getLastLogs', (handle, nLines) => {\n return this.exportSingleValue(\n this.getLastLogs(this.vm.getString(handle), this.vm.getNumber(nLines)),\n undefined\n );\n });\n\n exportCtxFunction('getProgressLog', (handle, patternToSearch) => {\n return this.exportSingleValue(\n this.getProgressLog(this.vm.getString(handle), this.vm.getString(patternToSearch)),\n undefined\n );\n });\n\n exportCtxFunction('getLogHandle', (handle) => {\n return this.exportSingleValue(this.getLogHandle(this.vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction('getBlockLabel', (blockId) => {\n return this.exportSingleValue(this.getBlockLabel(this.vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction('getDataFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction('getDataWithErrorsFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction('getSpecsFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction('calculateOptions', (predicate) => {\n return this.exportObjectUniversal(\n this.calculateOptions(this.importObjectViaJson(predicate) as PSpecPredicate),\n undefined\n );\n });\n\n //\n // PFrames / PTables\n //\n\n exportCtxFunction('createPFrame', (def) => {\n return this.exportSingleValue(\n this.createPFrame(this.importObjectViaJson(def) as PFrameDef<string>),\n undefined\n );\n });\n\n exportCtxFunction('createPTable', (def) => {\n return this.exportSingleValue(\n this.createPTable(this.importObjectViaJson(def) as PTableDef<PColumn<string>>),\n undefined\n );\n });\n\n this.vm.setProp(this.vm.global, 'cfgRenderCtx', configCtx);\n });\n }\n}\n","import { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport { Code, FunctionHandle } from '@platforma-sdk/model';\nimport { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Scope } from 'quickjs-emscripten';\nimport { JsExecutionContext } from './context';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\n\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: FunctionHandle,\n code: Code,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n return Computable.makeRaw((cCtx) => {\n const scope = new Scope();\n cCtx.addOnDestroy(() => scope.dispose());\n\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 640);\n runtime.setMaxStackSize(1024 * 320);\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm, ctx, env, cCtx);\n\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh);\n\n rCtx.resetComputableCtx();\n\n return {\n ir: rCtx.computablesToResolve,\n postprocessValue: async (resolved: Record<string, unknown>) => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved)) rCtx.runCallback(handle, value);\n\n // rendering result\n return rCtx.importObjectUniversal(result);\n }\n };\n }, ops);\n}\n","import { Code, isFunctionHandle, TypedConfigOrFunctionHandle } from '@platforma-sdk/model';\nimport { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { computableFromCfg } from '../cfg_render/executor';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { computableFromRF } from '../js_render';\nimport { BlockContextAny } from './block_ctx';\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrFunctionHandle,\n code: Code | undefined,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n if (isFunctionHandle(cfgOrFh)) {\n if (code === undefined) throw new Error('No code bundle.');\n return computableFromRF(env, ctx, cfgOrFh, code, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n","import { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectRenderingState,\n ProjectStructure,\n ProjectStructureAuthorKey,\n ProjectStructureKey\n} from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { allBlocks, productionGraph } from '../model/project_model_util';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Pl } from '@milaboratories/pl-client';\nimport {\n AuthorMarker,\n BlockCalculationStatus,\n ProjectMeta,\n ProjectOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { constructBlockContextArgsOnly } from './block_ctx';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { BlockSection, normalizeBlockConfig } from '@platforma-sdk/model';\nimport { computableFromCfgOrRF } from './render';\nimport { NavigationStates } from './navigation_states';\n\ntype BlockInfo = {\n currentArguments: any;\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: any;\n};\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n entry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(entry).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\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 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: rInputs.getDataAsJson(),\n stale: cInputs.id !== rInputs.id,\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: cInputs.getDataAsJson(), prod });\n }\n\n const currentGraph = productionGraph(structure, (id) => infos.get(id)!.currentArguments);\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label, 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 // block-pack\n const blockPack = prj.traverse(\n {\n field: projectFieldName(id, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true }\n );\n\n // sections\n const bpInfo = blockPack?.getDataAsJson<BlockPackInfo>();\n const { sections, inputsValid, sdkVersion } =\n ifNotUndef(bpInfo?.config, (blockConfU) => {\n const blockConf = normalizeBlockConfig(blockConfU);\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prj, id);\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n blockConf.sections,\n blockConf.code\n ) as ComputableStableDefined<BlockSection[]>,\n inputsValid: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n blockConf.inputsValid,\n blockConf.code\n ) as ComputableStableDefined<boolean>,\n sdkVersion: blockConf.sdkVersion\n };\n }) || {};\n\n const updatedBlockPack = ifNotUndef(bpInfo, (info) =>\n env.blockUpdateWatcher.get(info.source, ctx)\n );\n\n return {\n id,\n label,\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 sections,\n inputsValid,\n currentBlockPack: bpInfo?.source,\n updatedBlockPack,\n sdkVersion,\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 &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n return { ...b, canRun, stale };\n })\n };\n }\n }\n ).withStableType();\n}\n","import { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { projectFieldName } from '../model/project_model';\nimport { Pl } from '@milaboratories/pl-client';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { normalizeBlockConfig } from '@platforma-sdk/model';\n\nexport function getBlockCfg(prj: PlTreeNodeAccessor, blockId: string) {\n return ifNotUndef(\n prj\n .traverse(\n {\n field: projectFieldName(blockId, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true }\n )\n ?.getDataAsJson<BlockPackInfo>()?.config,\n (cfg) => normalizeBlockConfig(cfg)\n );\n}\n","import { PlTreeEntry, PlTreeEntryAccessor } from '@milaboratories/pl-tree';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport { Pl, resourceTypesEqual } from '@milaboratories/pl-client';\nimport {\n FrontendFromFolderData,\n FrontendFromFolderResourceType,\n FrontendFromUrlData,\n FrontendFromUrlResourceType\n} from '../model';\nimport { PathResult } from '@milaboratories/pl-drivers';\nimport { projectFieldName } from '../model/project_model';\nimport { BlockPackFrontendField } from '../mutator/block-pack/block_pack';\nimport { getBlockCfg } from './util';\nimport { FrontendData } from '../model/frontend';\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment\n): undefined | string | ComputableStableDefined<PathResult> {\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.getPath(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 frontendPathComputable(\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.path;\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 blockCfg = getBlockCfg(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 { path: frontendPathComputable(frontendEntry, env), sdkVersion: blockCfg?.sdkVersion };\n },\n { mode: 'StableOnlyLive' }\n ) as ComputableStableDefined<FrontendData>;\n}\n","import { PlTreeEntry } from '@milaboratories/pl-tree';\nimport {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors\n} from '@milaboratories/computable';\nimport { constructBlockContext, constructBlockContextArgsOnly } from './block_ctx';\nimport { blockArgsAuthorKey } from '../model/project_model';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { getBlockCfg } from './util';\nimport { AuthorMarker, BlockStateInternal } from '@milaboratories/pl-model-middle-layer';\nimport { computableFromCfgOrRF } from './render';\nimport { resourceIdToString } from '@milaboratories/pl-client';\n\nexport type BlockArgsAndUiState = Omit<BlockStateInternal, 'outputs' | 'navigationState'>;\n\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n id: string\n): Computable<BlockArgsAndUiState>;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n id: string,\n cCtx: ComputableCtx\n): BlockArgsAndUiState;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n id: string,\n cCtx?: ComputableCtx\n): BlockArgsAndUiState | Computable<BlockArgsAndUiState> {\n return Computable.make(\n (c) => {\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(prj, id);\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(id)),\n args: JSON.parse(ctx.args),\n ui: ctx.uiState !== undefined ? JSON.parse(ctx.uiState) : undefined\n };\n },\n { key: 'inputs#' + resourceIdToString(projectEntry.rid) + id }\n );\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n return Computable.make(\n (c) => {\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(prj, id);\n\n const blockCfg = getBlockCfg(prj, id);\n\n return ifNotUndef(blockCfg, (cfg) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs))\n outputs[cellId] = Computable.wrapError(\n computableFromCfgOrRF(env, ctx, cellCfg, cfg.code)\n );\n return outputs;\n });\n },\n { key: 'outputs#' + resourceIdToString(projectEntry.rid) + id }\n ).withStableType();\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable } from '@milaboratories/computable';\nimport { projectFieldName, ProjectStructure, ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { Pl } from '@milaboratories/pl-client';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { hasActiveCfgComponents } from '../cfg_render/util';\nimport { Cfg, isFunctionHandle, normalizeBlockConfig } from '@platforma-sdk/model';\nimport { constructBlockContext } from './block_ctx';\nimport { computableFromCfg } from '../cfg_render/executor';\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, renderingMode } of allBlocks(structure)) {\n // block-pack\n const blockPack = prj.traverse(\n {\n field: projectFieldName(id, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true }\n );\n\n const bpInfo = blockPack?.getDataAsJson<BlockPackInfo>();\n if (bpInfo?.config === undefined) continue;\n\n const blockConf = normalizeBlockConfig(bpInfo.config);\n const activeOutputConfigs = Object.entries(blockConf.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => !isFunctionHandle(cfg) && hasActiveCfgComponents(cfg))\n .map((cfg) => cfg as Cfg);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj, id);\n\n // console.log(blockCtx.prod(ctx));\n\n for (const cfg of activeOutputConfigs)\n ret.push(Computable.wrapError(computableFromCfg(env.driverKit, blockCtx, cfg)));\n }\n\n return ret;\n });\n}\n","import { ChangeSource, Computable, ComputableCtx } from '@milaboratories/computable';\nimport { NavigationState, 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();\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();\n }\n }\n}\n","import { MiddleLayerEnvironment } from './middle_layer';\nimport {\n ensureResourceIdNotNull,\n field,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n ResourceId\n} from '@milaboratories/pl-client';\nimport { Computable, ComputableStableDefined, WatchableValue } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { withProject, withProjectAuthored } from '../mutator/project';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport { FrontendData } from '../model/frontend';\nimport { projectFieldName, ProjectStructure } from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { BlockPackInfo } from '../model/block_pack';\nimport {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\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\n private readonly navigationStates = new NavigationStates();\n private readonly blockComputables = new Map<string, BlockStateComputables>();\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.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.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 } catch (e: any) {\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 blockCfg = await this.env.bpPreparer.getBlockConfig(blockPackSpec);\n await withProjectAuthored(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: JSON.stringify(blockCfg.initialArgs),\n blockPack: preparedBp\n },\n before\n )\n );\n await this.projectTree.refreshState();\n\n return blockId;\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 = await this.env.bpPreparer.getBlockConfig(blockPackSpec);\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? JSON.stringify(blockCfg.initialArgs) : 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.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.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.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.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: any, author?: AuthorMarker) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.setArgs([{ blockId, args: JSON.stringify(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.pl, this.rid, author, (mut) =>\n mut.setUiState(blockId, uiState === undefined ? undefined : JSON.stringify(uiState))\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\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.pl, this.rid, author, (mut) => {\n mut.setArgs([{ blockId, args: JSON.stringify(args) }]);\n mut.setUiState(blockId, JSON.stringify(uiState));\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 bpInfo = JSON.parse(\n Buffer.from(notEmpty(bpData.data)).toString('utf-8')\n ) as BlockPackInfo;\n await withProjectAuthored(tx, this.rid, author, (prj) => {\n prj.setArgs([{ blockId, args: JSON.stringify(bpInfo.config.initialArgs) }]);\n prj.setUiState(blockId, undefined);\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 === 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 argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId)\n }),\n {\n postprocessValue: (v) =>\n ({\n ...v.argsAndUiState,\n outputs: v.outputs,\n navigationState: v.navigationState\n }) as BlockStateInternal\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 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 const projectTree = await SynchronizedTreeState.init(env.pl, rid, env.ops.defaultTreeOptions);\n return new Project(env, rid, projectTree);\n }\n}\n","import { TemporalSynchronizedTreeOps } from './types';\nimport { DownloadDriverOps } from '@milaboratories/pl-drivers';\nimport { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport * as os from 'node:os';\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOps = {\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 /** Common root where to put downloaded blobs. */\n readonly blobDownloadPath: string;\n\n /**\n * If Platforma is running in local mode and a download driver\n * needs to download files from local storage, it will open files\n * from the specified directory. Otherwise, it should be empty.\n * */\n readonly platformLocalStorageNameToPath: Record<string, string>;\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 * If the client wants to upload files from their local machine to Platforma,\n * this option should be set. Set any unique storage names\n * to any paths from where the client will upload files,\n * e.g., {'local': '/'}.\n * */\n readonly localStorageNameToPath: Record<string, string>;\n};\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOps: Pick<\n DriverKitOps,\n | 'platformLocalStorageNameToPath'\n | 'blobDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n | 'localStorageNameToPath'\n> = {\n platformLocalStorageNameToPath: {},\n localStorageNameToPath: { local: os.homedir() },\n blobDriverOps: {\n cacheSoftSizeBytes: 100 * 1024 * 1024, // 100MB\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};\n\n/** Fields with default values are marked as optional here. */\nexport type DriverKitOpsConstructor = Omit<DriverKitOps, keyof typeof DefaultDriverKitOps> &\n Partial<typeof DefaultDriverKitOps>;\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOps = DriverKitOps & {\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 /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOps: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOps\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'platformLocalStorageNameToPath'\n | 'devBlockUpdateRecheckInterval'\n> = {\n ...DefaultDriverKitOps,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5\n};\n\n/** Fields with default values are marked as optional here. */\nexport type MiddleLayerOpsConstructor = Omit<MiddleLayerOps, keyof typeof DefaultMiddleLayerOps> &\n Partial<typeof DefaultMiddleLayerOps>;\n","import { PollComputablePool, PollPoolOps } from '@milaboratories/computable';\nimport { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { Dispatcher } from 'undici';\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from './registry';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & { readonly http?: Dispatcher };\n\nconst NoUpdatesKey = '__no_updates__';\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n BlockPackSpec,\n BlockPackSpec | undefined\n> {\n private readonly http?: Dispatcher;\n\n constructor(ops: BlockUpdateWatcherOps = {}) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps });\n this.http = ops.http;\n }\n\n protected getKey(req: BlockPackSpec): string {\n switch (req.type) {\n case 'dev':\n case 'dev-v1':\n return `dev_1_${req.folder}_${req.mtime}`;\n case 'dev-v2':\n return `dev_2_${req.folder}_${req.mtime}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: BlockPackSpec): Promise<BlockPackSpec | undefined> {\n try {\n switch (req.type) {\n case 'dev':\n case 'dev-v1': {\n const mtime = await getDevV1PacketMtime(req.folder);\n if (mtime === req.mtime) return undefined;\n else return { ...req, mtime };\n }\n case 'dev-v2': {\n const description = await tryLoadPackDescription(req.folder);\n if (description === undefined) return undefined;\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === req.mtime) return undefined;\n else return { ...req, mtime: mtime };\n }\n default:\n return undefined;\n }\n } catch (e: unknown) {\n return undefined;\n }\n }\n\n protected resultsEqual(\n res1: BlockPackSpec | undefined,\n res2: BlockPackSpec | undefined\n ): boolean {\n if (res1 === undefined && res2 === undefined) return true;\n if (res1 === undefined || res2 === undefined) return false;\n if (res1.type === 'from-registry-v1' || res2.type === 'from-registry-v1')\n throw new Error('Unexpected, not yet supported.');\n return res1.folder === res2.folder && res1.mtime === res2.mtime;\n }\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 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\n // TODO: we can postpone this operation, and run it in the background\n const res: any = envelop.resource;\n if (res !== undefined && res !== null && typeof res[Symbol.dispose] === 'function')\n res[Symbol.dispose]();\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 if (!this.resources.has(key)) throw new Error(`resource not found, key = ${key}`);\n return this.resources.get(key)!.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 { DownloadDriver } from '@milaboratories/pl-drivers';\nimport type PFramesType from '@milaboratories/pframes-node';\nimport { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { ComputableCtx, ComputableStableDefined } from '@milaboratories/computable';\nimport {\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 mapPObjectData,\n PFrameDef,\n JoinEntry,\n PTableDef,\n mapPTableDef\n} from '@platforma-sdk/model';\nimport { RefCountResourcePool } from './ref_count_pool';\nimport { allBlobs, mapBlobs, parseDataInfoResource } from './data';\nimport { createHash } from 'crypto';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\n\n// special way of importing native node module\nconst PFrames: PFramesType = require('@milaboratories/pframes-node');\n\nfunction blobKey(res: ResourceInfo): string {\n return String(res.id);\n}\n\ntype InternalPFrameData = PFrameDef<PFrameInternal.DataInfo<ResourceInfo>>;\n\nclass PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {\n public readonly pFrame: PFrameInternal.PFrame = new PFrames.PFrame();\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 columns: InternalPFrameData\n ) {\n // pframe initialization\n this.pFrame.setDataSource(this);\n for (const column of columns) {\n for (const blob of allBlobs(column.data)) this.blobIdToResource.set(blobKey(blob), blob);\n const dataInfo = mapBlobs(column.data, blobKey);\n try {\n this.pFrame.addColumnSpec(column.id, column.spec);\n this.pFrame.setColumnData(column.id, dataInfo);\n } catch (err) {\n throw new Error(\n `Adding column ${column.id} to PFrame failed: ${err}; Spec: ${column.spec}, DataInfo: ${dataInfo}.`\n );\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 Error(`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) await computable.awaitStableFullValue();\n };\n\n public readonly resolveBlob = async (blobId: string): Promise<string> => {\n const computable = this.getOrCreateComputableForBlob(blobId);\n return this.blobDriver.getLocalPath((await computable.awaitStableValue()).handle);\n };\n\n [Symbol.dispose](): void {\n for (const computable of this.blobHandleComputables.values()) computable.resetState();\n this.pFrame.dispose();\n }\n}\n\ntype FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport class PFrameDriver implements SdkPFrameDriver {\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>;\n private readonly pTables: RefCountResourcePool<FullPTableDef, Promise<PFrameInternal.PTable>>;\n\n constructor(private readonly blobDriver: DownloadDriver) {\n this.pFrames = new (class extends RefCountResourcePool<InternalPFrameData, PFrameHolder> {\n constructor(private readonly blobDriver: DownloadDriver) {\n super();\n }\n protected createNewResource(params: InternalPFrameData): PFrameHolder {\n return new PFrameHolder(this.blobDriver, params);\n }\n protected calculateParamsKey(params: InternalPFrameData): string {\n return stableKeyFromPFrameData(params);\n }\n })(this.blobDriver);\n\n this.pTables = new (class extends RefCountResourcePool<\n FullPTableDef,\n Promise<PFrameInternal.PTable>\n > {\n constructor(\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>\n ) {\n super();\n }\n protected async createNewResource(params: FullPTableDef): Promise<PFrameInternal.PTable> {\n const pFrame = this.pFrames.getByKey(params.pFrameHandle);\n const rawPTable = await pFrame.pFrame.createTable({\n src: joinEntryToInternal(params.def.src),\n filters: params.def.filters\n });\n return params.def.sorting.length !== 0 ? rawPTable.sort(params.def.sorting) : rawPTable;\n }\n protected calculateParamsKey(params: FullPTableDef): string {\n return stableKeyFromFullPTableDef(params);\n }\n })(this.pFrames);\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(def: PFrameDef<PlTreeNodeAccessor>, ctx: ComputableCtx): PFrameHandle {\n const internalData = def.map((c) => mapPObjectData(c, (d) => parseDataInfoResource(d)));\n const res = this.pFrames.acquire(internalData);\n ctx.addOnDestroy(res.unref);\n return res.key as PFrameHandle;\n }\n\n public createPTable(\n def: PTableDef<PColumn<PlTreeNodeAccessor>>,\n ctx: ComputableCtx\n ): PTableHandle {\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 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 ? [{ axesSpec: request.compatibleWith, qualifications: [] }]\n : []\n };\n return {\n hits: (await this.pFrames.getByKey(handle).pFrame.findColumns(iRequest)).hits.map(\n (h) => h.hit\n )\n };\n }\n\n public async getColumnSpec(handle: PFrameHandle, columnId: PObjectId): Promise<PColumnSpec> {\n return this.pFrames.getByKey(handle).pFrame.getColumnSpec(columnId);\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n return this.pFrames.getByKey(handle).pFrame.listColumns();\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>\n ): Promise<CalculateTableDataResponse> {\n let table = await this.pFrames.getByKey(handle).pFrame.createTable({\n src: joinEntryToInternal(request.src),\n filters: request.filters\n });\n\n if (request.sorting.length > 0) {\n const sortedTable = await table.sort(request.sorting);\n table.dispose();\n table = sortedTable;\n }\n\n const spec = table.getSpec();\n const data = await table.getData([...spec.keys()]);\n table.dispose();\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i]\n }));\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest\n ): Promise<UniqueValuesResponse> {\n return await this.pFrames.getByKey(handle).pFrame.getUniqueValues(request);\n }\n\n //\n // PTable istance methods\n //\n\n public async getShape(handle: PTableHandle): Promise<PTableShape> {\n const pTable = await this.pTables.getByKey(handle);\n return pTable.getShape();\n }\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const pTable = await this.pTables.getByKey(handle);\n return pTable.getSpec();\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range?: TableRange\n ): Promise<PTableVector[]> {\n const pTable = await this.pTables.getByKey(handle);\n return pTable.getData(columnIndices, range);\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntry {\n switch (entry.type) {\n case 'column':\n return {\n type: 'column',\n columnId: entry.column,\n qualifications: []\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(data.pFrameHandle);\n hash.update(canonicalize(data.def)!);\n return hash.digest().toString('hex');\n}\n\nfunction stableKeyFromPFrameData(data: PColumn<unknown>[]): string {\n // PObject IDs derived from the PObjects canonical identity, so represents the content\n const ids = data.map((d) => d.id).sort();\n const hash = createHash('sha256');\n let previous = '';\n for (const id of ids) {\n if (previous === id) continue; // only unique ids\n hash.update(id);\n previous = id;\n }\n return hash.digest().toString('hex');\n}\n\nexport function extractAllColumns<D>(entry: JoinEntry<PColumn<D>>): PFrameDef<D> {\n const columns = new Map<PObjectId, PColumn<D>>();\n addAllColumns(entry, columns);\n return [...columns.values()];\n}\n\nfunction addAllColumns<D>(entry: JoinEntry<PColumn<D>>, map: Map<PObjectId, PColumn<D>>): void {\n switch (entry.type) {\n case 'column':\n map.set(entry.column.id, entry.column);\n return;\n case 'full':\n case 'inner':\n for (const e of entry.entries) addAllColumns(e, map);\n return;\n case 'outer':\n addAllColumns(entry.primary, map);\n for (const e of entry.secondary) addAllColumns(e, map);\n return;\n default:\n assertNever(entry);\n }\n}\n","import { PlClient } from '@milaboratories/pl-client';\nimport {\n createDownloadClient, createLogsClient, createLsFilesClient, createUploadBlobClient, createUploadProgressClient, DownloadDriver,\n InternalLsDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver\n} from '@milaboratories/pl-drivers';\nimport * as Sdk from '@milaboratories/pl-model-common';\nimport { HmacSha256Signer, MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport * as os from 'node:os';\nimport { PFrameDriver } from '../pool';\nimport { DefaultDriverKitOps, DriverKitOps, DriverKitOpsConstructor } 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 logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: PFrameDriver;\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 logger: MiLogger,\n _ops: DriverKitOpsConstructor\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = { ...DefaultDriverKitOps, ..._ops };\n checkStorageNamesDoNotIntersect(logger, ops);\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(logger, pl, ops.platformLocalStorageNameToPath);\n const logsClient = createLogsClient(pl, logger);\n const uploadBlobClient = createUploadBlobClient(pl, logger);\n const uploadProgressClient = createUploadProgressClient(pl, logger);\n const lsClient = createLsFilesClient(pl, logger);\n\n const blobDriver = new DownloadDriver(\n logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n signer,\n ops.blobDriverOps\n );\n const uploadDriver = new UploadDriver(\n logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps\n );\n const logsStreamDriver = new LogsStreamDriver(logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(logsStreamDriver, blobDriver);\n const lsDriver = new LsDriver(logger, lsClient, pl, signer, ops.localStorageNameToPath);\n\n const pFrameDriver = new PFrameDriver(blobDriver);\n\n return {\n blobDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver\n };\n}\n\nfunction checkStorageNamesDoNotIntersect(logger: MiLogger, ops: DriverKitOps) {\n if (ops.localStorageNameToPath.local != os.homedir())\n logger.warn(`'local' storage with homedir was overwrote: ${ops.localStorageNameToPath.local}`);\n\n const platformStorages = Object.keys(ops.platformLocalStorageNameToPath);\n const intersected = Object.keys(ops.localStorageNameToPath).find((name) =>\n platformStorages.includes(name)\n );\n\n if (intersected)\n throw new Error(\n `Platform local storages include one or more local storages: ` +\n ` ${intersected}. Note that we automatically included 'local' storage with user's home directory.`\n );\n}\n","import {\n field,\n isNullResourceId,\n PlClient,\n ResourceId,\n toGlobalResourceId\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProject, withProjectAuthored } from '../mutator/project';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport { ConsoleLoggerAdapter, HmacSha256Signer, Signer } from '@milaboratories/ts-helpers';\nimport { ComputableStableDefined, WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport { DefaultMiddleLayerOps, MiddleLayerOps, MiddleLayerOpsConstructor } from './ops';\nimport { randomUUID } from 'node:crypto';\nimport { ProjectListEntry } from '../model';\nimport { AuthorMarker, ProjectMeta } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport { getQuickJS, QuickJSWASMModule } from 'quickjs-emscripten';\nimport { initDriverKit, MiddleLayerDriverKit } from './driver_kit';\nimport { DriverKit } from '@platforma-sdk/model';\nimport { DownloadUrlDriver } from '@milaboratories/pl-drivers';\n\nexport interface MiddleLayerEnvironment {\n readonly pl: PlClient;\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}\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 projectList: ComputableStableDefined<ProjectListEntry[]>\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\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.pl, rid, author, async (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 }\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 /** Initialize middle layer */\n public static async init(pl: PlClient, _ops: MiddleLayerOpsConstructor): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = { ...DefaultMiddleLayerOps, ..._ops };\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 = new ConsoleLoggerAdapter(console);\n\n const driverKit = await initDriverKit(pl, logger, ops);\n\n const bpPreparer = new BlockPackPreparer(driverKit.signer);\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n logger,\n pl.httpDispatcher,\n ops.frontendDownloadPath\n );\n\n const env: MiddleLayerEnvironment = {\n pl,\n signer: driverKit.signer,\n ops,\n bpPreparer,\n frontendDownloadDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher({\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: pl.httpDispatcher\n }),\n quickJs: await getQuickJS()\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 projectListTC.computable\n );\n }\n}\n"],"names":["tryStat","path","fsp","error","LegacyDevBlockPackMetaYaml","RegistryV1","LegacyDevBlockPackMetaJson","LegacyDevBlockPackTemplate","LegacyDevBlockPackConfig","LegacyDevBlockPackFrontendFolder","CanonicalBlockConfigRequest","CanonicalBlockUiRequestPackageJson","LegacyDevBlockPackFiles","isLegacyDevPackage","packageRoot","tryResolve","root","request","err","mustResolve","res","resolveDevPacket","ignoreErrors","workflow","config","uiPackageJson","getFileContent","fs","getFileStat","getDevV1PacketMtime","devPath","mtime","f","fullPath","stat","getDevV2PacketMtime","description","wfStats","modelStats","BlockPackRegistry","registrySpecs","http","regSpec","result","httpOptions","overview","overviewEntry","organization","pkg","latestMeta","latestVersion","entry","legacyYamlContent","YAML","v2Description","tryLoadPackDescription","assertNever","packages","regSpecs","CentralRegistry","CentralDevSnapshotRegistry","InitialBlockStructure","InitialProjectRenderingState","InitialBlockMeta","ProjectResourceType","SchemaVersionKey","SchemaVersionCurrent","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","BlockFrontendStateKeyPrefix","BlockFrontendStateKeyPattern","blockFrontendStateKey","blockId","BlockArgsAuthorKeyPrefix","blockArgsAuthorKey","ProjectStructureAuthorKey","parseBlockFrontendStateKey","key","match","ServiceTemplateCacheFieldPrefix","getServiceTemplateField","hash","projectFieldName","fieldName","projectFieldPattern","parseProjectField","name","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","TengoTemplateGet","TengoTemplateGetRegistry","TengoTemplateGetTemplateURI","TengoTemplateGetTemplate","TengoTemplatePack","TengoTemplatePackConvert","TengoTemplatePackConvertTemplatePack","TengoTemplatePackConvertTemplate","prepareTemplateSpec","loadTemplateFromRegistry","spec","getTemplate","registry","uri","templateFromRegistry","loadTemplateFromExplicit","templatePack","templatePackConvert","templatePackField","template","loadTemplate","FrontendFromUrlResourceType","FrontendFromFolderResourceType","createFrontend","BlockPackCustomType","BlockPackTemplateField","BlockPackFrontendField","tSlash","str","BlockPackPreparer","signer","devPaths","configContent","loadPackDescription","urlPrefix","templateContent","frontendPath","workflowContent","source","templateUrl","templateResponse","createCustomBlockPack","blockPackInfo","bp","createBlockPack","outputRef","isBlockOutputReference","obj","addAllReferencedBlocks","allowed","type","child","inferAllReferencedBlocks","args","allBlocks","structure","g","b","BlockGraph","nodes","__publicField","direction","rootBlockIds","all","r","cb","unprocessed","queued","nextUnprocessed","info","v","stagingGraph","previous","id","current","productionGraph","argsProvider","possibleUpstreams","upstreams","dep","setsEqual","a","e","intersects","graphDiff","onlyInA","onlyInB","different","fromA","fromB","preparedTemplateEnvelop","getPreparedExportTemplateEnvelope","preparedTemplate","SdkTemplates","createHash","exportContext","exportTpl","cached","modIdCb","valueCb","initialized","lastModId","value","currentModId","BlockInfo","fields","_a","bin","NoNewBlocks","ProjectMutator","author","schema","struct","renderingState","blocksInLimbo","blockInfos","blockFrontendStates","ctxExportTplHolder","blockInfo","block","state","fid","ref","status","fieldNames","deleted","_b","_c","requests","changed","binary","argsRef","newState","label","newStructure","ok","upstream","ctxField","upstreamContexts","results","newBlockSpecProvider","currentStagingGraph","currentActualProductionGraph","newStagingGraph","newActualProductionGraph","stagingDiff","prodDiff","binArgs","argsRes","before","newStruct","done","group","idx","newArgs","blockIds","addUpstreams","blockIdsSet","prodGraph","rendered","render","activeProdGraph","queue","Denque","stopped","downstream","lags","lag","upstreamLag","stagingRenderingRate","elapsed","lagThreshold","_d","markerStr","uiState","fullResourceStateP","schemaP","lastModifiedP","metaP","structureP","renderingStateP","allKVP","fullResourceState","stagingRefreshTimestamp","allKV","blockInfoStates","projectField","isNullResourceId","ctxExportTplEnvelope","ctxExportTplCacheFieldName","ctxExportTplField","ensureResourceIdNotNull","blocksInLimboSet","kv","isResource","isResourceRef","response","isNotNullResourceId","blockInStruct","createProject","ts","withProject","txOrPl","withProjectAuthored","PlClient","mut","allBlobs","data","blob","index","values","mapValues","callback","mapBlobs","mapping","PColumnDataJsonPartitioned","resourceType","PColumnDataJsonSuperPartitioned","PColumnDataBinaryPartitioned","PColumnDataBinarySuperPartitioned","PColumnDataJson","parseDataInfoResource","resourceData","dataContent","parts","superKey","superPart","keys","partKey","part","superData","resourceTypeToString","derivePObjectId","canonicalize","parseRawPObjectCollection","errorOnUnknownField","ignoreFieldErrors","prefix","entryPattern","locked","parseFinalPObjectCollection","rawCollection","assert","collection","exportName","PlError","ResultPool","blocks","allSpecsAvailable","outer","resultWithErrors","entries","isComplete","instabilityMarker","markUnstable","marker","tryAddEntry","exportsProcessed","predicate","found","exportsChecked","addToFound","executePSpecPredicate","prjEntry","rootBlockId","targetBlocks","prod","loadCtx","staging","calculated","ctxAccessor","constructBlockContextArgsOnly","projectNode","projectEntry","cCtx","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","drivers","SRGetBlobContentAsString","resourceInfo","SRGetBlobContentAsJson","c","content","SRGetDownloadedBlobContent","SRGetOnDemandBlobContent","SRGetImportProgress","SRGetLastLogs","lines","SRGetProgressLog","patternToSearch","SRGetLogHandle","ctxValue","computableFromCfgUnsafe","NonKeyCtxFields","toCfgContext","ReturnOpKey","ReturnArgKey","ReturnDestination","isReturnDestination","destination","zeroStack","execute","stack","operations","allowComputables","operationQueue","deliverResult","pending","computables","mainLoop","op","action","newOpKey","argRequests","initialArgCounter","operation","computableFromCfg","bCtx","stable","resolvedOps","mc","postEnv","copyOfPendingSubrotines","copiedStack","isArrayBufferOrView","bytesToBase64","JsExecutionContext","scope","vm","blockCtx","computableCtx","json","code","cbName","Scope","localScope","targetCallback","wellKnownAccessor","ctxKey","lambda","handle","commonOptions","steps","acc","accResult","mapPObjectData","d","hPrefix","computable","fHandle","nLines","mapValueInVOE","specs","def","mapPTableDef","accessor","nextHandle","manage","simpleHandle","text","strHandle","configCtx","exportCtxFunction","fn","fnh","step","computableFromRF","fh","runtime","rCtx","resolved","computableFromCfgOrRF","cfgOrFh","isFunctionHandle","projectOverview","navigationStates","infos","cInputs","rInputs","_e","currentGraph","limbo","renderingMode","gNode","calculationStatus","blockPack","bpInfo","sections","inputsValid","sdkVersion","blockConfU","blockConf","normalizeBlockConfig","blockCtxArgsOnly","updatedBlockPack","cantRun","staleBlocks","stale","u","canRun","getBlockCfg","kernel","frontendRes","frontendPathComputable","frontendData","blockCfg","frontendEntry","blockArgsAndUiState","resourceIdToString","blockOutputs","outputs","cellId","cellCfg","activeConfigs","ret","activeOutputConfigs","NavigationStates","ChangeSource","DefaultNavigationState","Project","projectTree","setTimeout","isNotFoundError","isTimeoutOrCancelError","blockLabel","blockPackSpec","preparedBp","resetArgs","currentStructure","currentGroup","bpHolderRid","bpRid","bpData","fd","DefaultDriverKitOps","os","DefaultMiddleLayerOps","DefaultBlockUpdateWatcherOps","NoUpdatesKey","BlockUpdateWatcher","PollComputablePool","req","res1","res2","RefCountResourcePool","envelop","params","unrefereced","PFrames","blobKey","PFrameHolder","blobDriver","columns","blobIds","blobId","column","dataInfo","blobResource","PFrameDriver","stableKeyFromPFrameData","pFrames","rawPTable","joinEntryToInternal","stableKeyFromFullPTableDef","internalData","pFrameHandle","extractAllColumns","defIds","iRequest","h","columnId","table","sortedTable","columnIndices","range","col","ids","addAllColumns","map","initDriverKit","logger","_ops","checkStorageNamesDoNotIntersect","HmacSha256Signer","downloadClient","createDownloadClient","logsClient","createLogsClient","uploadBlobClient","createUploadBlobClient","uploadProgressClient","createUploadProgressClient","lsClient","createLsFilesClient","DownloadDriver","uploadDriver","UploadDriver","logsStreamDriver","LogsStreamDriver","logDriver","LogsDriver","lsDriver","LsDriver","pFrameDriver","platformStorages","intersected","MiddleLayer","driverKit","projectListResourceId","openedProjectsList","projectListTree","projectList","toGlobalResourceId","projects","projectsField","projectsFieldData","ConsoleLoggerAdapter","bpPreparer","frontendDownloadDriver","DownloadUrlDriver","getQuickJS","WatchableValue","projectListTC"],"mappings":"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"}
|