UNPKG

@itwin/imodels-client-authoring

Version:

iModels API client wrapper for applications that author iModels.

94 lines 5.15 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ import { IModelsErrorCode, IModelsErrorImpl, IModelOperations as ManagementIModelOperations, UtilityFunctions, assertLink, } from "@itwin/imodels-client-management"; import { BaselineFileState } from "../../base/types"; import { BaselineFileOperations } from "../baseline-file/BaselineFileOperations"; export class IModelOperations extends ManagementIModelOperations { _baselineFileOperations; constructor(options, iModelsClient) { super(options, iModelsClient); this._baselineFileOperations = new BaselineFileOperations(options); } /** * Creates an iModel from Baseline file with specified properties. Wraps the * {@link https://developer.bentley.com/apis/imodels-v2/operations/create-imodel/ Create iModel} operation from iModels API. * Internally it creates an iModel instance, uploads the Baseline file, confirms Baseline * file upload and then repeatedly queries the Baseline file state until the iModel is initialized. The execution of * this method can take up to several minutes due to waiting for initialization to complete. It also depends on the * Baseline file size - the larger the file, the longer the upload will take. * @param {CreateIModelFromBaselineParams} params parameters for this operation. See {@link CreateIModelFromBaselineParams}. * @returns {Promise<IModel>} newly created iModel. See {@link IModel}. * @throws an error that implements `iModelsError` interface with code {@link IModelsErrorCode.BaselineFileInitializationFailed} if * Baseline file initialization failed or {@link IModelsErrorCode.BaselineFileInitializationTimedOut} if the operation did not complete in time. * See {@link IModelsErrorCode}. */ async createFromBaseline(params) { const baselineFileSize = await this._options.localFileSystem.getFileSize(params.iModelProperties.filePath); const createIModelBody = this.getCreateIModelFromBaselineRequestBody(params.iModelProperties, baselineFileSize); const createdIModel = await this.sendIModelPostRequest(params.authorization, createIModelBody, params.headers); assertLink(createdIModel._links.upload); const uploadLink = createdIModel._links.upload; await this._options.cloudStorage.upload({ url: uploadLink.href, storageType: uploadLink.storageType, data: params.iModelProperties.filePath, }); assertLink(createdIModel._links.complete); const confirmUploadUrl = createdIModel._links.complete.href; await this.sendPostRequest({ authorization: params.authorization, url: confirmUploadUrl, body: undefined, headers: params.headers, }); await this.waitForBaselineFileInitialization({ authorization: params.authorization, iModelId: createdIModel.id, headers: params.headers, timeOutInMs: params.timeOutInMs, }); return this.getSingle({ authorization: params.authorization, iModelId: createdIModel.id, headers: params.headers, }); } getCreateIModelFromBaselineRequestBody(iModelProperties, baselineFileSize) { return { ...this.getCreateEmptyIModelRequestBody(iModelProperties), baselineFile: { size: baselineFileSize, }, }; } async waitForBaselineFileInitialization(params) { const isBaselineInitialized = async () => { const { state } = await this._baselineFileOperations.getSingle(params); if (state !== BaselineFileState.Initialized && state !== BaselineFileState.WaitingForFile && state !== BaselineFileState.InitializationScheduled) throw new IModelsErrorImpl({ code: IModelsErrorCode.BaselineFileInitializationFailed, message: `Baseline File initialization failed with state '${state}.'`, originalError: undefined, statusCode: undefined, details: undefined, }); return state === BaselineFileState.Initialized; }; return UtilityFunctions.waitForCondition({ conditionToSatisfy: isBaselineInitialized, timeoutErrorFactory: () => new IModelsErrorImpl({ code: IModelsErrorCode.BaselineFileInitializationTimedOut, message: "Timed out waiting for Baseline File initialization.", originalError: undefined, statusCode: undefined, details: undefined, }), timeOutInMs: params.timeOutInMs, }); } } //# sourceMappingURL=IModelOperations.js.map