@milaboratories/pl-middle-layer 1.43.8 → 1.43.10
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/middle_layer/middle_layer.cjs +1 -1
- package/dist/middle_layer/middle_layer.cjs.map +1 -1
- package/dist/middle_layer/middle_layer.js +1 -1
- package/dist/middle_layer/middle_layer.js.map +1 -1
- package/dist/middle_layer/project.cjs +33 -24
- package/dist/middle_layer/project.cjs.map +1 -1
- package/dist/middle_layer/project.d.ts +1 -0
- package/dist/middle_layer/project.d.ts.map +1 -1
- package/dist/middle_layer/project.js +33 -24
- package/dist/middle_layer/project.js.map +1 -1
- package/dist/mutator/project.cjs +3 -3
- package/dist/mutator/project.cjs.map +1 -1
- package/dist/mutator/project.d.ts +1 -1
- package/dist/mutator/project.d.ts.map +1 -1
- package/dist/mutator/project.js +3 -3
- package/dist/mutator/project.js.map +1 -1
- package/package.json +14 -14
- package/src/middle_layer/middle_layer.ts +1 -1
- package/src/middle_layer/project.ts +32 -21
- package/src/mutator/project.ts +3 -2
|
@@ -89,7 +89,7 @@ class MiddleLayer {
|
|
|
89
89
|
async setProjectMeta(rid, meta, author) {
|
|
90
90
|
await project.withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {
|
|
91
91
|
prj.setMeta(meta);
|
|
92
|
-
});
|
|
92
|
+
}, { name: 'setProjectMeta' });
|
|
93
93
|
await this.projectListTree.refreshState();
|
|
94
94
|
}
|
|
95
95
|
/** Permanently deletes project from the project list, this will result in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middle_layer.cjs","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type {\n PlClient,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n field,\n isNullResourceId,\n toGlobalResourceId,\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProjectAuthored } from '../mutator/project';\nimport type { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { BlockEventDispatcher } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport type {\n MiddleLayerOps,\n MiddleLayerOpsConstructor,\n} from './ops';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectListEntry } from '../model';\nimport type { AuthorMarker, ProjectMeta, BlockPlatform } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { getQuickJS } from 'quickjs-emscripten';\nimport type { MiddleLayerDriverKit } from './driver_kit';\nimport { initDriverKit } from './driver_kit';\nimport type { DriverKit, SupportedRequirement } from '@platforma-sdk/model';\nimport { RuntimeCapabilities } from '@platforma-sdk/model';\nimport type { DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport type { Dispatcher } from 'undici';\nimport { RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\nimport { ProjectHelper } from '../model/project_helper';\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(requirement: SupportedRequirement, value: number | boolean = true): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {\n prj.setMeta(meta);\n });\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx('MLRemoveProject', async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx('Project id to resource id', async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error('Unexpected project list structure.');\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === 'string') return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /**\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 */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement('requiresModelAPIVersion', 1);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":["randomUUID","createProject","field","toGlobalResourceId","withProjectAuthored","isNullResourceId","Project","HmacSha256Signer","ops","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","getDebugFlags","ProjectsField","ProjectsResourceType","initDriverKit","RetryAgent","V2RegistryProvider","BlockPackPreparer","getQuickJS","RuntimeCapabilities","BlockEventDispatcher","BlockUpdateWatcher","ProjectHelper","WatchableValue","createProjectList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middle_layer.cjs","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type {\n PlClient,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n field,\n isNullResourceId,\n toGlobalResourceId,\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProjectAuthored } from '../mutator/project';\nimport type { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { BlockEventDispatcher } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport type {\n MiddleLayerOps,\n MiddleLayerOpsConstructor,\n} from './ops';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectListEntry } from '../model';\nimport type { AuthorMarker, ProjectMeta, BlockPlatform } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { getQuickJS } from 'quickjs-emscripten';\nimport type { MiddleLayerDriverKit } from './driver_kit';\nimport { initDriverKit } from './driver_kit';\nimport type { DriverKit, SupportedRequirement } from '@platforma-sdk/model';\nimport { RuntimeCapabilities } from '@platforma-sdk/model';\nimport type { DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport type { Dispatcher } from 'undici';\nimport { RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\nimport { ProjectHelper } from '../model/project_helper';\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(requirement: SupportedRequirement, value: number | boolean = true): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {\n prj.setMeta(meta);\n }, { name: 'setProjectMeta' });\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 /**\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 */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement('requiresModelAPIVersion', 1);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":["randomUUID","createProject","field","toGlobalResourceId","withProjectAuthored","isNullResourceId","Project","HmacSha256Signer","ops","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","getDebugFlags","ProjectsField","ProjectsResourceType","initDriverKit","RetryAgent","V2RegistryProvider","BlockPackPreparer","getQuickJS","RuntimeCapabilities","BlockEventDispatcher","BlockUpdateWatcher","ProjectHelper","WatchableValue","createProjectList"],"mappings":"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"}
|
|
@@ -87,7 +87,7 @@ class MiddleLayer {
|
|
|
87
87
|
async setProjectMeta(rid, meta, author) {
|
|
88
88
|
await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {
|
|
89
89
|
prj.setMeta(meta);
|
|
90
|
-
});
|
|
90
|
+
}, { name: 'setProjectMeta' });
|
|
91
91
|
await this.projectListTree.refreshState();
|
|
92
92
|
}
|
|
93
93
|
/** Permanently deletes project from the project list, this will result in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middle_layer.js","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type {\n PlClient,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n field,\n isNullResourceId,\n toGlobalResourceId,\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProjectAuthored } from '../mutator/project';\nimport type { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { BlockEventDispatcher } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport type {\n MiddleLayerOps,\n MiddleLayerOpsConstructor,\n} from './ops';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectListEntry } from '../model';\nimport type { AuthorMarker, ProjectMeta, BlockPlatform } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { getQuickJS } from 'quickjs-emscripten';\nimport type { MiddleLayerDriverKit } from './driver_kit';\nimport { initDriverKit } from './driver_kit';\nimport type { DriverKit, SupportedRequirement } from '@platforma-sdk/model';\nimport { RuntimeCapabilities } from '@platforma-sdk/model';\nimport type { DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport type { Dispatcher } from 'undici';\nimport { RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\nimport { ProjectHelper } from '../model/project_helper';\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(requirement: SupportedRequirement, value: number | boolean = true): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {\n prj.setMeta(meta);\n });\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx('MLRemoveProject', async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx('Project id to resource id', async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error('Unexpected project list structure.');\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === 'string') return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /**\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 */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement('requiresModelAPIVersion', 1);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middle_layer.js","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type {\n PlClient,\n ResourceId } from '@milaboratories/pl-client';\nimport {\n field,\n isNullResourceId,\n toGlobalResourceId,\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProjectAuthored } from '../mutator/project';\nimport type { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport type { MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { BlockEventDispatcher } from '@milaboratories/ts-helpers';\nimport { HmacSha256Signer } from '@milaboratories/ts-helpers';\nimport type { ComputableStableDefined } from '@milaboratories/computable';\nimport { WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport type {\n MiddleLayerOps,\n MiddleLayerOpsConstructor,\n} from './ops';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport type { ProjectListEntry } from '../model';\nimport type { AuthorMarker, ProjectMeta, BlockPlatform } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport type { QuickJSWASMModule } from 'quickjs-emscripten';\nimport { getQuickJS } from 'quickjs-emscripten';\nimport type { MiddleLayerDriverKit } from './driver_kit';\nimport { initDriverKit } from './driver_kit';\nimport type { DriverKit, SupportedRequirement } from '@platforma-sdk/model';\nimport { RuntimeCapabilities } from '@platforma-sdk/model';\nimport type { DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport type { Dispatcher } from 'undici';\nimport { RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\nimport { ProjectHelper } from '../model/project_helper';\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(requirement: SupportedRequirement, value: number | boolean = true): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.pl, rid, author, (prj) => {\n prj.setMeta(meta);\n }, { name: 'setProjectMeta' });\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 /**\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 */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement('requiresModelAPIVersion', 1);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -68,12 +68,15 @@ class Project {
|
|
|
68
68
|
this.refreshLoopResult = this.refreshLoop();
|
|
69
69
|
this.activeConfigs = active_cfg.activeConfigs(projectTree.entry(), env);
|
|
70
70
|
}
|
|
71
|
+
get projectLockId() {
|
|
72
|
+
return 'project:' + this.rid.toString();
|
|
73
|
+
}
|
|
71
74
|
async refreshLoop() {
|
|
72
75
|
while (!this.destroyed) {
|
|
73
76
|
try {
|
|
74
77
|
await project.withProject(this.env.projectHelper, this.env.pl, this.rid, (prj) => {
|
|
75
78
|
prj.doRefresh(this.env.ops.stagingRenderingRate);
|
|
76
|
-
});
|
|
79
|
+
}, { name: 'doRefresh', lockId: this.projectLockId });
|
|
77
80
|
await this.activeConfigs.getValue();
|
|
78
81
|
await promises.setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);
|
|
79
82
|
// Block computables houskeeping
|
|
@@ -114,18 +117,24 @@ class Project {
|
|
|
114
117
|
const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);
|
|
115
118
|
const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);
|
|
116
119
|
const blockCfg = model.extractConfig(blockCfgContainer); // full content of this var should never be persisted
|
|
117
|
-
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {
|
|
121
|
+
return mut.addBlock({
|
|
122
|
+
id: blockId,
|
|
123
|
+
label: blockLabel,
|
|
124
|
+
renderingMode: blockCfg.renderingMode,
|
|
125
|
+
}, {
|
|
126
|
+
args: canonicalize(blockCfg.initialArgs),
|
|
127
|
+
uiState: canonicalize(blockCfg.initialUiState),
|
|
128
|
+
blockPack: preparedBp,
|
|
129
|
+
}, before);
|
|
121
130
|
}, {
|
|
122
|
-
|
|
123
|
-
uiState: canonicalize(blockCfg.initialUiState),
|
|
124
|
-
blockPack: preparedBp,
|
|
125
|
-
}, before), { retryOptions: {
|
|
131
|
+
retryOptions: {
|
|
126
132
|
...plClient.DefaultRetryOptions,
|
|
127
133
|
backoffMultiplier: plClient.DefaultRetryOptions.backoffMultiplier * 1.1,
|
|
128
|
-
}
|
|
134
|
+
},
|
|
135
|
+
name: 'addBlock',
|
|
136
|
+
lockId: this.projectLockId,
|
|
137
|
+
});
|
|
129
138
|
await this.projectTree.refreshState();
|
|
130
139
|
return blockId;
|
|
131
140
|
}
|
|
@@ -142,7 +151,7 @@ class Project {
|
|
|
142
151
|
* @return returns newly created block id
|
|
143
152
|
* */
|
|
144
153
|
async duplicateBlock(originalBlockId, before, author = undefined, newBlockId = node_crypto.randomUUID()) {
|
|
145
|
-
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.duplicateBlock(originalBlockId, newBlockId, before));
|
|
154
|
+
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.duplicateBlock(originalBlockId, newBlockId, before), { name: 'duplicateBlock', lockId: this.projectLockId });
|
|
146
155
|
await this.projectTree.refreshState();
|
|
147
156
|
return newBlockId;
|
|
148
157
|
}
|
|
@@ -153,12 +162,12 @@ class Project {
|
|
|
153
162
|
async updateBlockPack(blockId, blockPackSpec, resetArgs = false, author) {
|
|
154
163
|
const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);
|
|
155
164
|
const blockCfg = model.extractConfig(await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec));
|
|
156
|
-
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.migrateBlockPack(blockId, preparedBp, resetArgs ? { args: blockCfg.initialArgs, uiState: blockCfg.initialUiState } : undefined));
|
|
165
|
+
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.migrateBlockPack(blockId, preparedBp, resetArgs ? { args: blockCfg.initialArgs, uiState: blockCfg.initialUiState } : undefined), { name: 'updateBlockPack', lockId: this.projectLockId });
|
|
157
166
|
await this.projectTree.refreshState();
|
|
158
167
|
}
|
|
159
168
|
/** Deletes a block with all associated data. */
|
|
160
169
|
async deleteBlock(blockId, author) {
|
|
161
|
-
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId));
|
|
170
|
+
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId), { name: 'deleteBlock', lockId: this.projectLockId });
|
|
162
171
|
this.navigationStates.deleteBlock(blockId);
|
|
163
172
|
await this.projectTree.refreshState();
|
|
164
173
|
}
|
|
@@ -172,10 +181,10 @@ class Project {
|
|
|
172
181
|
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {
|
|
173
182
|
const currentStructure = mut.structure;
|
|
174
183
|
if (currentStructure.groups.length !== 1)
|
|
175
|
-
throw new Error('Unexpected project structure, non-
|
|
184
|
+
throw new Error('Unexpected project structure, non-singular block group');
|
|
176
185
|
const currentGroup = currentStructure.groups[0];
|
|
177
186
|
if (currentGroup.blocks.length !== blocks.length)
|
|
178
|
-
throw new Error(`
|
|
187
|
+
throw new Error(`Length mismatch: ${currentGroup.blocks.length} !== ${blocks.length}`);
|
|
179
188
|
if (new Set(blocks).size !== blocks.length)
|
|
180
189
|
throw new Error(`Repeated block ids`);
|
|
181
190
|
const newStructure = {
|
|
@@ -193,7 +202,7 @@ class Project {
|
|
|
193
202
|
],
|
|
194
203
|
};
|
|
195
204
|
mut.updateStructure(newStructure);
|
|
196
|
-
});
|
|
205
|
+
}, { name: 'reorderBlocks', lockId: this.projectLockId });
|
|
197
206
|
await this.projectTree.refreshState();
|
|
198
207
|
}
|
|
199
208
|
/**
|
|
@@ -202,7 +211,7 @@ class Project {
|
|
|
202
211
|
* stale state.
|
|
203
212
|
* */
|
|
204
213
|
async runBlock(blockId) {
|
|
205
|
-
await project.withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true));
|
|
214
|
+
await project.withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true), { name: 'runBlock', lockId: this.projectLockId });
|
|
206
215
|
await this.projectTree.refreshState();
|
|
207
216
|
}
|
|
208
217
|
/**
|
|
@@ -211,7 +220,7 @@ class Project {
|
|
|
211
220
|
* calculated.
|
|
212
221
|
* */
|
|
213
222
|
async stopBlock(blockId) {
|
|
214
|
-
await project.withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.stopProduction(blockId));
|
|
223
|
+
await project.withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.stopProduction(blockId), { name: 'stopBlock', lockId: this.projectLockId });
|
|
215
224
|
await this.projectTree.refreshState();
|
|
216
225
|
}
|
|
217
226
|
// /** Update block label. */
|
|
@@ -228,7 +237,7 @@ class Project {
|
|
|
228
237
|
* in collaborative editing scenario.
|
|
229
238
|
* */
|
|
230
239
|
async setBlockArgs(blockId, args, author) {
|
|
231
|
-
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.setStates([{ blockId, args }]));
|
|
240
|
+
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.setStates([{ blockId, args }]), { name: 'setBlockArgs', lockId: this.projectLockId });
|
|
232
241
|
await this.projectTree.refreshState();
|
|
233
242
|
}
|
|
234
243
|
/**
|
|
@@ -238,7 +247,7 @@ class Project {
|
|
|
238
247
|
* in collaborative editing scenario.
|
|
239
248
|
* */
|
|
240
249
|
async setUiState(blockId, uiState, author) {
|
|
241
|
-
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.setStates([{ blockId, uiState }]));
|
|
250
|
+
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.setStates([{ blockId, uiState }]), { name: 'setUiState', lockId: this.projectLockId });
|
|
242
251
|
await this.projectTree.refreshState();
|
|
243
252
|
}
|
|
244
253
|
/**
|
|
@@ -257,14 +266,14 @@ class Project {
|
|
|
257
266
|
async setBlockArgsAndUiState(blockId, args, uiState, author) {
|
|
258
267
|
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {
|
|
259
268
|
mut.setStates([{ blockId, args, uiState }]);
|
|
260
|
-
});
|
|
269
|
+
}, { name: 'setBlockArgsAndUiState', lockId: this.projectLockId });
|
|
261
270
|
await this.projectTree.refreshState();
|
|
262
271
|
}
|
|
263
272
|
/** Update block settings */
|
|
264
273
|
async setBlockSettings(blockId, newValue) {
|
|
265
274
|
await project.withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, undefined, (mut) => {
|
|
266
275
|
mut.setBlockSettings(blockId, newValue);
|
|
267
|
-
});
|
|
276
|
+
}, { name: 'setBlockSettings' });
|
|
268
277
|
await this.projectTree.refreshState();
|
|
269
278
|
}
|
|
270
279
|
/** Resets arguments and ui state of the block to initial state */
|
|
@@ -277,7 +286,7 @@ class Project {
|
|
|
277
286
|
const config = model.extractConfig(tsHelpers.cachedDeserialize(tsHelpers.notEmpty(bpData.data)).config);
|
|
278
287
|
await project.withProjectAuthored(this.env.projectHelper, tx, this.rid, author, (prj) => {
|
|
279
288
|
prj.setStates([{ blockId, args: config.initialArgs, uiState: config.initialUiState }]);
|
|
280
|
-
});
|
|
289
|
+
}, { name: 'resetBlockArgsAndUiState', lockId: this.projectLockId });
|
|
281
290
|
await tx.commit();
|
|
282
291
|
});
|
|
283
292
|
await this.projectTree.refreshState();
|
|
@@ -364,7 +373,7 @@ class Project {
|
|
|
364
373
|
// Applying migrations to the project resource, if needed
|
|
365
374
|
await migration.applyProjectMigrations(env.pl, rid);
|
|
366
375
|
// Doing a no-op mutation to apply all migration and schema fixes
|
|
367
|
-
await project.withProject(env.projectHelper, env.pl, rid, (_) => { });
|
|
376
|
+
await project.withProject(env.projectHelper, env.pl, rid, (_) => { }, { name: 'init' });
|
|
368
377
|
// Loading project tree
|
|
369
378
|
const projectTree = await plTree.SynchronizedTreeState.init(env.pl, rid, {
|
|
370
379
|
...env.ops.defaultTreeOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.cjs","sources":["../../src/middle_layer/project.ts"],"sourcesContent":["import type { MiddleLayerEnvironment } from './middle_layer';\nimport type {\n FieldData,\n OptionalAnyResourceId,\n ResourceId,\n} from '@milaboratories/pl-client';\nimport {\n DefaultRetryOptions,\n ensureResourceIdNotNull,\n field,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n resourceIdToString,\n} from '@milaboratories/pl-client';\nimport type { ComputableStableDefined, ComputableValueOrErrors } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport type { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { withProject, withProjectAuthored } from '../mutator/project';\nimport type { ExtendedResourceData } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState, treeDumpStats } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport type { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport type { FrontendData } from '../model/frontend';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName } from '../model/project_model';\nimport { cachedDeserialize, notEmpty } from '@milaboratories/ts-helpers';\nimport type { BlockPackInfo } from '../model/block_pack';\nimport type {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal,\n BlockSettings,\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\nimport { extractConfig } from '@platforma-sdk/model';\nimport fs from 'node:fs/promises';\nimport canonicalize from 'canonicalize';\nimport type { ProjectOverviewLight } from './project_overview_light';\nimport { projectOverviewLight } from './project_overview_light';\nimport { applyProjectMigrations } from '../mutator/migration';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\n};\n\nfunction stringifyForDump(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === 'bigint')\n return resourceIdToString(value as OptionalAnyResourceId);\n else if (\n ArrayBuffer.isView(value)\n || value instanceof Int8Array\n || value instanceof Uint8Array\n || value instanceof Uint8ClampedArray\n || value instanceof Int16Array\n || value instanceof Uint16Array\n || value instanceof Int32Array\n || value instanceof Uint32Array\n || value instanceof Float32Array\n || value instanceof Float64Array\n || value instanceof BigInt64Array\n || value instanceof BigUint64Array\n )\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString('base64');\n else if (Buffer.isBuffer(value))\n return value.toString('base64');\n\n return value;\n });\n}\n\n/** Data access object, to manipulate and read single opened (!) project data. */\nexport class Project {\n /** Underlying pl resource id */\n public readonly rid: ResourceId;\n\n /** Data for the left panel, contain basic information about block status. */\n public readonly overview: ComputableStableDefined<ProjectOverview>;\n private readonly overviewLight: Computable<ProjectOverviewLight>;\n\n private readonly navigationStates = new NavigationStates();\n // null is set for deleted blocks\n private readonly blockComputables = new Map<string, BlockStateComputables | null>();\n\n private readonly blockFrontends = new Map<string, ComputableStableDefined<FrontendData>>();\n private readonly activeConfigs: Computable<unknown[]>;\n private readonly refreshLoopResult: Promise<void>;\n\n private readonly abortController = new AbortController();\n private destroyed = false;\n\n constructor(\n private readonly env: MiddleLayerEnvironment,\n rid: ResourceId,\n private readonly projectTree: SynchronizedTreeState,\n ) {\n this.overview = projectOverview(\n projectTree.entry(),\n this.navigationStates,\n env,\n ).withPreCalculatedValueTree();\n this.overviewLight = projectOverviewLight(projectTree.entry())\n .withPreCalculatedValueTree();\n this.rid = rid;\n this.refreshLoopResult = this.refreshLoop();\n this.activeConfigs = activeConfigs(projectTree.entry(), env);\n }\n\n private async refreshLoop(): Promise<void> {\n while (!this.destroyed) {\n try {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (prj) => {\n prj.doRefresh(this.env.ops.stagingRenderingRate);\n });\n await this.activeConfigs.getValue();\n await setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);\n\n // Block computables houskeeping\n const overviewLight = await this.overviewLight.getValue();\n const existingBlocks = new Set(overviewLight.listOfBlocks);\n // Doing cleanup for deleted blocks\n for (const blockId of this.blockComputables.keys()) {\n if (!existingBlocks.has(blockId)) {\n const computable = this.blockComputables.get(blockId);\n if (computable !== undefined && computable !== null) computable.fullState.resetState();\n this.blockComputables.set(blockId, null);\n }\n }\n } catch (e: unknown) {\n if (isNotFoundError(e)) {\n console.warn(\n 'project refresh routine terminated, because project was externally deleted',\n );\n break;\n } else if (!isTimeoutOrCancelError(e))\n throw new Error('Unexpected exception', { cause: e });\n }\n }\n }\n\n /**\n * Adds new block to the project.\n *\n * @param blockLabel block label / title visible to the user\n * @param blockPackSpec object describing the \"block type\", read more in the type docs\n * @param before id of the block to insert new block before\n * @param blockId internal id to be assigned for the block, this arg can be omitted\n * then, randomly generated UUID will be assigned automatically\n *\n * @return returns newly created block id\n * */\n public async addBlock(\n blockLabel: string,\n blockPackSpec: BlockPackSpecAny,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n blockId: string = randomUUID(),\n ): Promise<string> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n const blockCfg = extractConfig(blockCfgContainer); // full content of this var should never be persisted\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.addBlock(\n {\n id: blockId,\n label: blockLabel,\n renderingMode: blockCfg.renderingMode,\n },\n {\n args: canonicalize(blockCfg.initialArgs)!,\n uiState: canonicalize(blockCfg.initialUiState)!,\n blockPack: preparedBp,\n },\n before,\n ),\n { retryOptions: {\n ...DefaultRetryOptions,\n backoffMultiplier: DefaultRetryOptions.backoffMultiplier * 1.1,\n } },\n );\n await this.projectTree.refreshState();\n\n return blockId;\n }\n\n /**\n * Duplicates an existing block by copying all its fields and state.\n * This method works at the mutator level for efficient block copying.\n *\n * @param originalBlockId id of the block to duplicate\n * @param before id of the block to insert new block before\n * @param author author marker for the duplication operation\n * @param newBlockId internal id to be assigned for the duplicated block,\n * if omitted, a randomly generated UUID will be assigned\n *\n * @return returns newly created block id\n * */\n public async duplicateBlock(\n originalBlockId: string,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n newBlockId: string = randomUUID(),\n ): Promise<string> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.duplicateBlock(originalBlockId, newBlockId, before),\n );\n await this.projectTree.refreshState();\n\n return newBlockId;\n }\n\n /**\n * Update block to new block pack, optionally resetting args and ui state to\n * initial values\n * */\n public async updateBlockPack(\n blockId: string,\n blockPackSpec: BlockPackSpecAny,\n resetArgs: boolean = false,\n author?: AuthorMarker,\n ): Promise<void> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfg = extractConfig(await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec));\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? { args: blockCfg.initialArgs, uiState: blockCfg.initialUiState } : undefined,\n ),\n );\n await this.projectTree.refreshState();\n }\n\n /** Deletes a block with all associated data. */\n public async deleteBlock(blockId: string, author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId));\n this.navigationStates.deleteBlock(blockId);\n await this.projectTree.refreshState();\n }\n\n /**\n * Updates block order according to the given array of block ids.\n *\n * Provided array must contain exactly the same set of ids current project cosists of,\n * an error will be thrown instead.\n */\n public async reorderBlocks(blocks: string[], author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n const currentStructure = mut.structure;\n if (currentStructure.groups.length !== 1)\n throw new Error('Unexpected project structure, non-sinular block group');\n const currentGroup = currentStructure.groups[0];\n if (currentGroup.blocks.length !== blocks.length)\n throw new Error(`Lengh mismatch: ${currentGroup.blocks.length} !== ${blocks.length}`);\n if (new Set<string>(blocks).size !== blocks.length) throw new Error(`Repeated block ids`);\n const newStructure: ProjectStructure = {\n groups: [\n {\n id: currentGroup.id,\n label: currentGroup.label,\n blocks: blocks.map((blockId) => {\n const block = currentGroup.blocks.find((b) => b.id === blockId);\n if (block === undefined) throw new Error(`Can't find block: ${blockId}`);\n return block;\n }),\n },\n ],\n };\n mut.updateStructure(newStructure);\n });\n await this.projectTree.refreshState();\n }\n\n /**\n * Renders production part of the block starting all connected heavy computations.\n * Upstream blocks of the specified block will be started automatically if in\n * stale state.\n * */\n public async runBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true));\n await this.projectTree.refreshState();\n }\n\n /**\n * Stops the block if it is running by destroying its production state. All\n * its downstreams will also be destroyed or moved to limbo if already\n * calculated.\n * */\n public async stopBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.stopProduction(blockId));\n await this.projectTree.refreshState();\n }\n\n // /** Update block label. */\n // public async setBlockLabel(blockId: string, label: string, author?: AuthorMarker) {\n // await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n // mut.setBlockLabel(blockId, label);\n // });\n // await this.projectTree.refreshState();\n // }\n\n /**\n * Sets block args, and changes whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgs(blockId: string, args: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, args }]),\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets ui block state associated with the block.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setUiState(blockId: string, uiState: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, uiState }]),\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\n // eslint-disable-next-line @typescript-eslint/require-await\n public async setNavigationState(blockId: string, state: NavigationState): Promise<void> {\n this.navigationStates.setState(blockId, state);\n }\n\n /**\n * Sets block args and ui state, and changes the whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgsAndUiState(\n blockId: string,\n args: unknown,\n uiState: unknown,\n author?: AuthorMarker,\n ) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n mut.setStates([{ blockId, args, uiState }]);\n });\n await this.projectTree.refreshState();\n }\n\n /** Update block settings */\n public async setBlockSettings(blockId: string, newValue: BlockSettings) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, undefined, (mut) => {\n mut.setBlockSettings(blockId, newValue);\n });\n await this.projectTree.refreshState();\n }\n\n /** Resets arguments and ui state of the block to initial state */\n public async resetBlockArgsAndUiState(blockId: string, author?: AuthorMarker): Promise<void> {\n await this.env.pl.withWriteTx('BlockInputsReset', async (tx) => {\n // reading default arg values from block pack\n const bpHolderRid = ensureResourceIdNotNull(\n (await tx.getField(field(this.rid, projectFieldName(blockId, 'blockPack')))).value,\n );\n const bpRid = ensureResourceIdNotNull(\n (await tx.getField(field(bpHolderRid, Pl.HolderRefField))).value,\n );\n const bpData = await tx.getResourceData(bpRid, false);\n const config = extractConfig(cachedDeserialize<BlockPackInfo>(notEmpty(bpData.data)).config);\n await withProjectAuthored(this.env.projectHelper, tx, this.rid, author, (prj) => {\n prj.setStates([{ blockId, args: config.initialArgs, uiState: config.initialUiState }]);\n });\n await tx.commit();\n });\n await this.projectTree.refreshState();\n }\n\n private getBlockComputables(blockId: string): BlockStateComputables {\n const cached = this.blockComputables.get(blockId);\n if (cached === null) throw new Error(`Block ${blockId} is deleted`);\n if (cached === undefined) {\n // state consists of inputs (args + ui state) and outputs\n const outputs = blockOutputs(this.projectTree.entry(), blockId, this.env);\n const fullState = Computable.make(\n (ctx) => {\n return {\n argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId),\n overview: this.overview,\n };\n },\n {\n postprocessValue: (v) => {\n const sdkVersion = v.overview?.blocks?.find((b) => b.id == blockId)?.sdkVersion;\n const toString = sdkVersion && shouldStillUseStringErrors(sdkVersion);\n const newOutputs = toString && v.outputs !== undefined\n ? convertErrorsToStrings(v.outputs)\n : v.outputs;\n\n return {\n ...v.argsAndUiState,\n outputs: newOutputs,\n navigationState: v.navigationState,\n } as BlockStateInternal;\n },\n },\n );\n\n const computables: BlockStateComputables = {\n fullState: fullState.withPreCalculatedValueTree(),\n };\n\n this.blockComputables.set(blockId, computables);\n\n return computables;\n }\n return cached;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch full block state,\n * including outputs, arguments, ui state.\n * */\n public getBlockState(blockId: string): Computable<BlockStateInternal> {\n return this.getBlockComputables(blockId).fullState;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch path of the\n * folder containing frontend code.\n * */\n public getBlockFrontend(blockId: string): ComputableStableDefined<FrontendData> {\n const cached = this.blockFrontends.get(blockId);\n if (cached === undefined) {\n const fd = frontendData(\n this.projectTree.entry(),\n blockId,\n this.env,\n ).withPreCalculatedValueTree();\n this.blockFrontends.set(blockId, fd);\n return fd;\n }\n return cached;\n }\n\n /** Called by middle layer on close */\n public async destroy(): Promise<void> {\n // terminating the project service loop\n this.destroyed = true;\n this.abortController.abort();\n await this.refreshLoopResult;\n\n // terminating the synchronized project tree\n await this.projectTree.terminate();\n\n // the following will deregister all external resource holders, like\n // downloaded files, running uploads and alike\n this.overview.resetState();\n this.blockFrontends.forEach((c) => c.resetState());\n this.blockComputables.forEach((c) => {\n if (c !== null) c.fullState.resetState();\n });\n this.activeConfigs.resetState();\n }\n\n /** @deprecated */\n public async destroyAndAwaitTermination(): Promise<void> {\n await this.destroy();\n }\n\n public static async init(env: MiddleLayerEnvironment, rid: ResourceId): Promise<Project> {\n // Applying migrations to the project resource, if needed\n await applyProjectMigrations(env.pl, rid);\n\n // Doing a no-op mutation to apply all migration and schema fixes\n await withProject(env.projectHelper, env.pl, rid, (_) => {});\n\n // Loading project tree\n const projectTree = await SynchronizedTreeState.init(\n env.pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: projectTreePruning,\n },\n env.logger,\n );\n\n if (env.ops.debugOps.dumpInitialTreeState) {\n const state = projectTree.dumpState();\n state.sort((a, b) => (b.data?.byteLength ?? 0) - (a.data?.byteLength ?? 0));\n const stats = treeDumpStats(state);\n await fs.writeFile(`${resourceIdToString(rid)}.json`, stringifyForDump(state));\n await fs.writeFile(`${resourceIdToString(rid)}.stats.json`, stringifyForDump(stats));\n }\n\n return new Project(env, rid, projectTree);\n }\n}\n\nfunction projectTreePruning(r: ExtendedResourceData): FieldData[] {\n // console.log(\n // JSON.stringify(\n // { ...r, kv: [], data: undefined } satisfies ExtendedResourceData,\n // (_, v) => {\n // if (typeof v === 'bigint') return v.toString();\n // return v;\n // }\n // )\n // );\n if (r.type.name.startsWith('StreamWorkdir/'))\n return [];\n switch (r.type.name) {\n case 'BlockPackCustom':\n return r.fields.filter((f) => f.name !== 'template');\n case 'UserProject':\n return r.fields.filter((f) => !f.name.startsWith('__serviceTemplate'));\n case 'Blob':\n return [];\n default:\n return r.fields;\n }\n}\n\n/** Returns true if sdk version of the block is old and we need to convert\n * ErrorLike errors to strings like it was.\n * We need it for keeping old blocks and new UI compatibility. */\nfunction shouldStillUseStringErrors(sdkVersion: string): boolean {\n return !isVersionGreater(sdkVersion, '1.26.0');\n}\n\n/** Checks if sdk version is greater that a target version. */\nfunction isVersionGreater(sdkVersion: string, targetVersion: string): boolean {\n const version = sdkVersion.split('.').map(Number);\n const target = targetVersion.split('.').map(Number);\n\n return (\n version[0] > target[0]\n || (version[0] === target[0] && version[1] > target[1])\n || (version[0] === target[0] && version[1] === target[1] && version[2] > target[2])\n );\n};\n\n/** Converts ErrorLike errors to strings in the outputs like it was in old ML versions. */\nfunction convertErrorsToStrings(\n outputs: Record<string, ComputableValueOrErrors<unknown>>,\n): Record<string, ComputableValueOrErrors<unknown>> {\n const result: Record<string, ComputableValueOrErrors<unknown>> = {};\n for (const [key, val] of Object.entries(outputs)) {\n if (val.ok) {\n result[key] = val;\n continue;\n }\n\n result[key] = {\n ok: false,\n errors: val.errors.map((e) => {\n if (typeof e === 'string') {\n return e;\n } else if (e.type == 'PlError' && e.fullMessage !== undefined) {\n return e.fullMessage;\n }\n return e.message;\n }),\n moreErrors: val.moreErrors,\n };\n }\n\n return result;\n}\n"],"names":["resourceIdToString","NavigationStates","projectOverview","projectOverviewLight","activeConfigs","withProject","setTimeout","isNotFoundError","isTimeoutOrCancelError","randomUUID","extractConfig","withProjectAuthored","DefaultRetryOptions","ensureResourceIdNotNull","field","projectFieldName","Pl","cachedDeserialize","notEmpty","blockOutputs","Computable","blockArgsAndUiState","frontendData","applyProjectMigrations","SynchronizedTreeState","treeDumpStats"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"project.cjs","sources":["../../src/middle_layer/project.ts"],"sourcesContent":["import type { MiddleLayerEnvironment } from './middle_layer';\nimport type {\n FieldData,\n OptionalAnyResourceId,\n ResourceId,\n} from '@milaboratories/pl-client';\nimport {\n DefaultRetryOptions,\n ensureResourceIdNotNull,\n field,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n resourceIdToString,\n} from '@milaboratories/pl-client';\nimport type { ComputableStableDefined, ComputableValueOrErrors } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport type { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { withProject, withProjectAuthored } from '../mutator/project';\nimport type { ExtendedResourceData } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState, treeDumpStats } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport type { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport type { FrontendData } from '../model/frontend';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName } from '../model/project_model';\nimport { cachedDeserialize, notEmpty } from '@milaboratories/ts-helpers';\nimport type { BlockPackInfo } from '../model/block_pack';\nimport type {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal,\n BlockSettings,\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\nimport { extractConfig } from '@platforma-sdk/model';\nimport fs from 'node:fs/promises';\nimport canonicalize from 'canonicalize';\nimport type { ProjectOverviewLight } from './project_overview_light';\nimport { projectOverviewLight } from './project_overview_light';\nimport { applyProjectMigrations } from '../mutator/migration';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\n};\n\nfunction stringifyForDump(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === 'bigint')\n return resourceIdToString(value as OptionalAnyResourceId);\n else if (\n ArrayBuffer.isView(value)\n || value instanceof Int8Array\n || value instanceof Uint8Array\n || value instanceof Uint8ClampedArray\n || value instanceof Int16Array\n || value instanceof Uint16Array\n || value instanceof Int32Array\n || value instanceof Uint32Array\n || value instanceof Float32Array\n || value instanceof Float64Array\n || value instanceof BigInt64Array\n || value instanceof BigUint64Array\n )\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString('base64');\n else if (Buffer.isBuffer(value))\n return value.toString('base64');\n\n return value;\n });\n}\n\n/** Data access object, to manipulate and read single opened (!) project data. */\nexport class Project {\n /** Underlying pl resource id */\n public readonly rid: ResourceId;\n\n /** Data for the left panel, contain basic information about block status. */\n public readonly overview: ComputableStableDefined<ProjectOverview>;\n private readonly overviewLight: Computable<ProjectOverviewLight>;\n\n private readonly navigationStates = new NavigationStates();\n // null is set for deleted blocks\n private readonly blockComputables = new Map<string, BlockStateComputables | null>();\n\n private readonly blockFrontends = new Map<string, ComputableStableDefined<FrontendData>>();\n private readonly activeConfigs: Computable<unknown[]>;\n private readonly refreshLoopResult: Promise<void>;\n\n private readonly abortController = new AbortController();\n private destroyed = false;\n\n constructor(\n private readonly env: MiddleLayerEnvironment,\n rid: ResourceId,\n private readonly projectTree: SynchronizedTreeState,\n ) {\n this.overview = projectOverview(\n projectTree.entry(),\n this.navigationStates,\n env,\n ).withPreCalculatedValueTree();\n this.overviewLight = projectOverviewLight(projectTree.entry())\n .withPreCalculatedValueTree();\n this.rid = rid;\n this.refreshLoopResult = this.refreshLoop();\n this.activeConfigs = activeConfigs(projectTree.entry(), env);\n }\n\n get projectLockId(): string {\n return 'project:' + this.rid.toString();\n }\n\n private async refreshLoop(): Promise<void> {\n while (!this.destroyed) {\n try {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (prj) => {\n prj.doRefresh(this.env.ops.stagingRenderingRate);\n }, { name: 'doRefresh', lockId: this.projectLockId });\n await this.activeConfigs.getValue();\n await setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);\n\n // Block computables houskeeping\n const overviewLight = await this.overviewLight.getValue();\n const existingBlocks = new Set(overviewLight.listOfBlocks);\n // Doing cleanup for deleted blocks\n for (const blockId of this.blockComputables.keys()) {\n if (!existingBlocks.has(blockId)) {\n const computable = this.blockComputables.get(blockId);\n if (computable !== undefined && computable !== null) computable.fullState.resetState();\n this.blockComputables.set(blockId, null);\n }\n }\n } catch (e: unknown) {\n if (isNotFoundError(e)) {\n console.warn(\n 'project refresh routine terminated, because project was externally deleted',\n );\n break;\n } else if (!isTimeoutOrCancelError(e))\n throw new Error('Unexpected exception', { cause: e });\n }\n }\n }\n\n /**\n * Adds new block to the project.\n *\n * @param blockLabel block label / title visible to the user\n * @param blockPackSpec object describing the \"block type\", read more in the type docs\n * @param before id of the block to insert new block before\n * @param blockId internal id to be assigned for the block, this arg can be omitted\n * then, randomly generated UUID will be assigned automatically\n *\n * @return returns newly created block id\n * */\n public async addBlock(\n blockLabel: string,\n blockPackSpec: BlockPackSpecAny,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n blockId: string = randomUUID(),\n ): Promise<string> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n const blockCfg = extractConfig(blockCfgContainer); // full content of this var should never be persisted\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n return mut.addBlock(\n {\n id: blockId,\n label: blockLabel,\n renderingMode: blockCfg.renderingMode,\n },\n {\n args: canonicalize(blockCfg.initialArgs)!,\n uiState: canonicalize(blockCfg.initialUiState)!,\n blockPack: preparedBp,\n },\n before,\n );\n },\n {\n retryOptions: {\n ...DefaultRetryOptions,\n backoffMultiplier: DefaultRetryOptions.backoffMultiplier * 1.1,\n },\n name: 'addBlock',\n lockId: this.projectLockId,\n });\n\n await this.projectTree.refreshState();\n\n return blockId;\n }\n\n /**\n * Duplicates an existing block by copying all its fields and state.\n * This method works at the mutator level for efficient block copying.\n *\n * @param originalBlockId id of the block to duplicate\n * @param before id of the block to insert new block before\n * @param author author marker for the duplication operation\n * @param newBlockId internal id to be assigned for the duplicated block,\n * if omitted, a randomly generated UUID will be assigned\n *\n * @return returns newly created block id\n * */\n public async duplicateBlock(\n originalBlockId: string,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n newBlockId: string = randomUUID(),\n ): Promise<string> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.duplicateBlock(originalBlockId, newBlockId, before),\n { name: 'duplicateBlock', lockId: this.projectLockId },\n );\n await this.projectTree.refreshState();\n\n return newBlockId;\n }\n\n /**\n * Update block to new block pack, optionally resetting args and ui state to\n * initial values\n * */\n public async updateBlockPack(\n blockId: string,\n blockPackSpec: BlockPackSpecAny,\n resetArgs: boolean = false,\n author?: AuthorMarker,\n ): Promise<void> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfg = extractConfig(await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec));\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? { args: blockCfg.initialArgs, uiState: blockCfg.initialUiState } : undefined,\n ),\n { name: 'updateBlockPack', lockId: this.projectLockId },\n );\n await this.projectTree.refreshState();\n }\n\n /** Deletes a block with all associated data. */\n public async deleteBlock(blockId: string, author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId), { name: 'deleteBlock', lockId: this.projectLockId });\n this.navigationStates.deleteBlock(blockId);\n await this.projectTree.refreshState();\n }\n\n /**\n * Updates block order according to the given array of block ids.\n *\n * Provided array must contain exactly the same set of ids current project cosists of,\n * an error will be thrown instead.\n */\n public async reorderBlocks(blocks: string[], author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n const currentStructure = mut.structure;\n if (currentStructure.groups.length !== 1)\n throw new Error('Unexpected project structure, non-singular block group');\n const currentGroup = currentStructure.groups[0];\n if (currentGroup.blocks.length !== blocks.length)\n throw new Error(`Length 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 }, { name: 'reorderBlocks', lockId: this.projectLockId });\n await this.projectTree.refreshState();\n }\n\n /**\n * Renders production part of the block starting all connected heavy computations.\n * Upstream blocks of the specified block will be started automatically if in\n * stale state.\n * */\n public async runBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true), { name: 'runBlock', lockId: this.projectLockId });\n await this.projectTree.refreshState();\n }\n\n /**\n * Stops the block if it is running by destroying its production state. All\n * its downstreams will also be destroyed or moved to limbo if already\n * calculated.\n * */\n public async stopBlock(blockId: string): Promise<void> {\n await withProject(this.env.projectHelper, this.env.pl, this.rid, (mut) => mut.stopProduction(blockId), { name: 'stopBlock', lockId: this.projectLockId });\n await this.projectTree.refreshState();\n }\n\n // /** Update block label. */\n // public async setBlockLabel(blockId: string, label: string, author?: AuthorMarker) {\n // await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n // mut.setBlockLabel(blockId, label);\n // });\n // await this.projectTree.refreshState();\n // }\n\n /**\n * Sets block args, and changes whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgs(blockId: string, args: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, args }]),\n { name: 'setBlockArgs', lockId: this.projectLockId });\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets ui block state associated with the block.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setUiState(blockId: string, uiState: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>\n mut.setStates([{ blockId, uiState }]),\n { name: 'setUiState', lockId: this.projectLockId });\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\n // eslint-disable-next-line @typescript-eslint/require-await\n public async setNavigationState(blockId: string, state: NavigationState): Promise<void> {\n this.navigationStates.setState(blockId, state);\n }\n\n /**\n * Sets block args and ui state, and changes the whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgsAndUiState(\n blockId: string,\n args: unknown,\n uiState: unknown,\n author?: AuthorMarker,\n ) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) => {\n mut.setStates([{ blockId, args, uiState }]);\n }, { name: 'setBlockArgsAndUiState', lockId: this.projectLockId });\n await this.projectTree.refreshState();\n }\n\n /** Update block settings */\n public async setBlockSettings(blockId: string, newValue: BlockSettings) {\n await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, undefined, (mut) => {\n mut.setBlockSettings(blockId, newValue);\n }, { name: 'setBlockSettings' });\n await this.projectTree.refreshState();\n }\n\n /** Resets arguments and ui state of the block to initial state */\n public async resetBlockArgsAndUiState(blockId: string, author?: AuthorMarker): Promise<void> {\n await this.env.pl.withWriteTx('BlockInputsReset', async (tx) => {\n // reading default arg values from block pack\n const bpHolderRid = ensureResourceIdNotNull(\n (await tx.getField(field(this.rid, projectFieldName(blockId, 'blockPack')))).value,\n );\n const bpRid = ensureResourceIdNotNull(\n (await tx.getField(field(bpHolderRid, Pl.HolderRefField))).value,\n );\n const bpData = await tx.getResourceData(bpRid, false);\n const config = extractConfig(cachedDeserialize<BlockPackInfo>(notEmpty(bpData.data)).config);\n await withProjectAuthored(this.env.projectHelper, tx, this.rid, author, (prj) => {\n prj.setStates([{ blockId, args: config.initialArgs, uiState: config.initialUiState }]);\n }, { name: 'resetBlockArgsAndUiState', lockId: this.projectLockId });\n await tx.commit();\n });\n await this.projectTree.refreshState();\n }\n\n private getBlockComputables(blockId: string): BlockStateComputables {\n const cached = this.blockComputables.get(blockId);\n if (cached === null) throw new Error(`Block ${blockId} is deleted`);\n if (cached === undefined) {\n // state consists of inputs (args + ui state) and outputs\n const outputs = blockOutputs(this.projectTree.entry(), blockId, this.env);\n const fullState = Computable.make(\n (ctx) => {\n return {\n argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId),\n overview: this.overview,\n };\n },\n {\n postprocessValue: (v) => {\n const sdkVersion = v.overview?.blocks?.find((b) => b.id == blockId)?.sdkVersion;\n const toString = sdkVersion && shouldStillUseStringErrors(sdkVersion);\n const newOutputs = toString && v.outputs !== undefined\n ? convertErrorsToStrings(v.outputs)\n : v.outputs;\n\n return {\n ...v.argsAndUiState,\n outputs: newOutputs,\n navigationState: v.navigationState,\n } as BlockStateInternal;\n },\n },\n );\n\n const computables: BlockStateComputables = {\n fullState: fullState.withPreCalculatedValueTree(),\n };\n\n this.blockComputables.set(blockId, computables);\n\n return computables;\n }\n return cached;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch full block state,\n * including outputs, arguments, ui state.\n * */\n public getBlockState(blockId: string): Computable<BlockStateInternal> {\n return this.getBlockComputables(blockId).fullState;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch path of the\n * folder containing frontend code.\n * */\n public getBlockFrontend(blockId: string): ComputableStableDefined<FrontendData> {\n const cached = this.blockFrontends.get(blockId);\n if (cached === undefined) {\n const fd = frontendData(\n this.projectTree.entry(),\n blockId,\n this.env,\n ).withPreCalculatedValueTree();\n this.blockFrontends.set(blockId, fd);\n return fd;\n }\n return cached;\n }\n\n /** Called by middle layer on close */\n public async destroy(): Promise<void> {\n // terminating the project service loop\n this.destroyed = true;\n this.abortController.abort();\n await this.refreshLoopResult;\n\n // terminating the synchronized project tree\n await this.projectTree.terminate();\n\n // the following will deregister all external resource holders, like\n // downloaded files, running uploads and alike\n this.overview.resetState();\n this.blockFrontends.forEach((c) => c.resetState());\n this.blockComputables.forEach((c) => {\n if (c !== null) c.fullState.resetState();\n });\n this.activeConfigs.resetState();\n }\n\n /** @deprecated */\n public async destroyAndAwaitTermination(): Promise<void> {\n await this.destroy();\n }\n\n public static async init(env: MiddleLayerEnvironment, rid: ResourceId): Promise<Project> {\n // Applying migrations to the project resource, if needed\n await applyProjectMigrations(env.pl, rid);\n\n // Doing a no-op mutation to apply all migration and schema fixes\n await withProject(env.projectHelper, env.pl, rid, (_) => {}, { name: 'init' });\n\n // Loading project tree\n const projectTree = await SynchronizedTreeState.init(\n env.pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: projectTreePruning,\n },\n env.logger,\n );\n\n if (env.ops.debugOps.dumpInitialTreeState) {\n const state = projectTree.dumpState();\n state.sort((a, b) => (b.data?.byteLength ?? 0) - (a.data?.byteLength ?? 0));\n const stats = treeDumpStats(state);\n await fs.writeFile(`${resourceIdToString(rid)}.json`, stringifyForDump(state));\n await fs.writeFile(`${resourceIdToString(rid)}.stats.json`, stringifyForDump(stats));\n }\n\n return new Project(env, rid, projectTree);\n }\n}\n\nfunction projectTreePruning(r: ExtendedResourceData): FieldData[] {\n // console.log(\n // JSON.stringify(\n // { ...r, kv: [], data: undefined } satisfies ExtendedResourceData,\n // (_, v) => {\n // if (typeof v === 'bigint') return v.toString();\n // return v;\n // }\n // )\n // );\n if (r.type.name.startsWith('StreamWorkdir/'))\n return [];\n switch (r.type.name) {\n case 'BlockPackCustom':\n return r.fields.filter((f) => f.name !== 'template');\n case 'UserProject':\n return r.fields.filter((f) => !f.name.startsWith('__serviceTemplate'));\n case 'Blob':\n return [];\n default:\n return r.fields;\n }\n}\n\n/** Returns true if sdk version of the block is old and we need to convert\n * ErrorLike errors to strings like it was.\n * We need it for keeping old blocks and new UI compatibility. */\nfunction shouldStillUseStringErrors(sdkVersion: string): boolean {\n return !isVersionGreater(sdkVersion, '1.26.0');\n}\n\n/** Checks if sdk version is greater that a target version. */\nfunction isVersionGreater(sdkVersion: string, targetVersion: string): boolean {\n const version = sdkVersion.split('.').map(Number);\n const target = targetVersion.split('.').map(Number);\n\n return (\n version[0] > target[0]\n || (version[0] === target[0] && version[1] > target[1])\n || (version[0] === target[0] && version[1] === target[1] && version[2] > target[2])\n );\n};\n\n/** Converts ErrorLike errors to strings in the outputs like it was in old ML versions. */\nfunction convertErrorsToStrings(\n outputs: Record<string, ComputableValueOrErrors<unknown>>,\n): Record<string, ComputableValueOrErrors<unknown>> {\n const result: Record<string, ComputableValueOrErrors<unknown>> = {};\n for (const [key, val] of Object.entries(outputs)) {\n if (val.ok) {\n result[key] = val;\n continue;\n }\n\n result[key] = {\n ok: false,\n errors: val.errors.map((e) => {\n if (typeof e === 'string') {\n return e;\n } else if (e.type == 'PlError' && e.fullMessage !== undefined) {\n return e.fullMessage;\n }\n return e.message;\n }),\n moreErrors: val.moreErrors,\n };\n }\n\n return result;\n}\n"],"names":["resourceIdToString","NavigationStates","projectOverview","projectOverviewLight","activeConfigs","withProject","setTimeout","isNotFoundError","isTimeoutOrCancelError","randomUUID","extractConfig","withProjectAuthored","DefaultRetryOptions","ensureResourceIdNotNull","field","projectFieldName","Pl","cachedDeserialize","notEmpty","blockOutputs","Computable","blockArgsAndUiState","frontendData","applyProjectMigrations","SynchronizedTreeState","treeDumpStats"],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ export declare class Project {
|
|
|
24
24
|
private readonly abortController;
|
|
25
25
|
private destroyed;
|
|
26
26
|
constructor(env: MiddleLayerEnvironment, rid: ResourceId, projectTree: SynchronizedTreeState);
|
|
27
|
+
get projectLockId(): string;
|
|
27
28
|
private refreshLoop;
|
|
28
29
|
/**
|
|
29
30
|
* Adds new block to the project.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,2BAA2B,CAAC;AAUnC,OAAO,KAAK,EAAE,uBAAuB,EAA2B,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIjD,OAAO,EAAE,qBAAqB,EAAiB,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACd,MAAM,uCAAuC,CAAC;AAwC/C,iFAAiF;AACjF,qBAAa,OAAO;IAoBhB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IArB9B,gCAAgC;IAChC,SAAgB,GAAG,EAAE,UAAU,CAAC;IAEhC,6EAA6E;IAC7E,SAAgB,QAAQ,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IAEjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAE3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;IAEpF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4D;IAC3F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAElD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,SAAS,CAAS;gBAGP,GAAG,EAAE,sBAAsB,EAC5C,GAAG,EAAE,UAAU,EACE,WAAW,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project.ts"],"names":[],"mappings":"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"}
|