@itwin/core-backend 4.10.0-dev.30 → 4.10.0-dev.32
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/CHANGELOG.md +8 -1
- package/lib/cjs/DevTools.d.ts +0 -2
- package/lib/cjs/DevTools.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +2 -2
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ElementGraphics.js +1 -2
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js +3 -3
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js +1 -2
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +1 -2
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelJsFs.d.ts +0 -1
- package/lib/cjs/IModelJsFs.d.ts.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +5 -2
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/RpcBackend.js +1 -2
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js +2 -3
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/TextAnnotationGeometry.js +1 -2
- package/lib/cjs/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/TextAnnotationLayout.js +4 -4
- package/lib/cjs/TextAnnotationLayout.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +2 -2
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewStore.d.ts +1 -1
- package/lib/cjs/ViewStore.d.ts.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +1 -2
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js +3 -3
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js +1 -2
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +2 -2
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +1 -2
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +11 -11
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/rpc/multipart.js +3 -4
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js +2 -2
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/request.js +1 -2
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js +1 -2
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +2 -2
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/package.json +16 -17
package/lib/cjs/IpcHost.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IpcHost.js","sourceRoot":"","sources":["../../src/IpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module NativeApp\r\n */\r\n\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { assert, BentleyError, IModelStatus, Logger, LogLevel, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n ChangesetIndex, ChangesetIndexAndId, EditingScopeNotifications, getPullChangesIpcChannel, IModelConnectionProps, IModelError, IModelRpcProps,\r\n ipcAppChannels, IpcAppFunctions, IpcAppNotifications, IpcInvokeReturn, IpcListener, IpcSocketBackend, iTwinChannel,\r\n OpenBriefcaseProps, OpenCheckpointArgs, PullChangesOptions, RemoveFunction, StandaloneOpenOptions, TileTreeContentIds, TxnNotifications,\r\n} from \"@itwin/core-common\";\r\nimport { ProgressFunction, ProgressStatus } from \"./CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, SnapshotDb, StandaloneDb } from \"./IModelDb\";\r\nimport { IModelHost, IModelHostOptions } from \"./IModelHost\";\r\nimport { cancelTileContentRequests } from \"./rpc-impl/IModelTileRpcImpl\";\r\nimport { IModelNative } from \"./internal/NativePlatform\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\n\r\n/**\r\n * Options for [[IpcHost.startup]]\r\n * @public\r\n */\r\nexport interface IpcHostOpts {\r\n iModelHost?: IModelHostOptions;\r\n ipcHost?: {\r\n /** The Ipc socket to use for communications with frontend. Allows undefined only for headless tests. */\r\n socket?: IpcSocketBackend;\r\n\r\n /** don't send stack information on exceptions */\r\n exceptions?: {\r\n noStack?: boolean;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Used by applications that have a dedicated backend. IpcHosts may send messages to their corresponding IpcApp.\r\n * @note if either end terminates, the other must too.\r\n * @public\r\n */\r\nexport class IpcHost {\r\n public static noStack = false;\r\n private static _ipc: IpcSocketBackend | undefined;\r\n /** Get the implementation of the [IpcSocketBackend]($common) interface. */\r\n private static get ipc(): IpcSocketBackend { return this._ipc!; } // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n /** Determine whether Ipc is available for this backend. This will only be true if [[startup]] has been called on this class. */\r\n public static get isValid(): boolean { return undefined !== this._ipc; }\r\n\r\n /**\r\n * Send a message to the frontend over an Ipc channel.\r\n * @param channel the name of the channel matching the name registered with [[IpcApp.addListener]].\r\n * @param data The content of the message.\r\n */\r\n public static send(channel: string, ...data: any[]): void {\r\n this.ipc.send(iTwinChannel(channel), ...data);\r\n }\r\n\r\n /**\r\n * Establish a handler for an Ipc channel to receive [[Frontend.invoke]] calls\r\n * @param channel The name of the channel for this handler.\r\n * @param handler A function that supplies the implementation for `channel`\r\n * @note returns A function to call to remove the handler.\r\n */\r\n public static handle(channel: string, handler: (...args: any[]) => Promise<any>): RemoveFunction {\r\n return this.ipc.handle(iTwinChannel(channel), handler);\r\n }\r\n /**\r\n * Establish a handler to receive messages sent via [[IpcApp.send]].\r\n * @param channel The name of the channel for the messages.\r\n * @param listener A function called when messages are sent over `channel`\r\n * @note returns A function to call to remove the listener.\r\n */\r\n public static addListener(channel: string, listener: IpcListener): RemoveFunction {\r\n return this.ipc.addListener(iTwinChannel(channel), listener);\r\n }\r\n /**\r\n * Remove a previously registered listener\r\n * @param channel The name of the channel for the listener previously registered with [[addListener]]\r\n * @param listener The function passed to [[addListener]]\r\n */\r\n public static removeListener(channel: string, listener: IpcListener): void {\r\n this.ipc.removeListener(iTwinChannel(channel), listener);\r\n }\r\n\r\n private static notify(channel: string, briefcase: BriefcaseDb | StandaloneDb, methodName: string, ...args: any[]) {\r\n if (this.isValid)\r\n return this.send(`${channel}/${briefcase.key}`, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static notifyIpcFrontend<T extends keyof IpcAppNotifications>(methodName: T, ...args: Parameters<IpcAppNotifications[T]>) {\r\n return IpcHost.send(ipcAppChannels.appNotify, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static notifyTxns<T extends keyof TxnNotifications>(briefcase: BriefcaseDb | StandaloneDb, methodName: T, ...args: Parameters<TxnNotifications[T]>) {\r\n this.notify(ipcAppChannels.txns, briefcase, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static notifyEditingScope<T extends keyof EditingScopeNotifications>(briefcase: BriefcaseDb | StandaloneDb, methodName: T, ...args: Parameters<EditingScopeNotifications[T]>) {\r\n this.notify(ipcAppChannels.editingScope, briefcase, methodName, ...args);\r\n }\r\n\r\n /**\r\n * Start the backend of an Ipc app.\r\n * @param opt\r\n * @note this method calls [[IModelHost.startup]] internally.\r\n */\r\n public static async startup(opt?: IpcHostOpts): Promise<void> {\r\n this._ipc = opt?.ipcHost?.socket;\r\n if (opt?.ipcHost?.exceptions?.noStack)\r\n this.noStack = true;\r\n\r\n if (this.isValid) { // for tests, we use IpcHost but don't have a frontend\r\n IpcAppHandler.register();\r\n }\r\n\r\n await IModelHost.startup(opt?.iModelHost);\r\n }\r\n\r\n /** Shutdown IpcHost backend. Also calls [[IModelHost.shutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n this._ipc = undefined;\r\n await IModelHost.shutdown();\r\n }\r\n}\r\n\r\n/**\r\n * Base class for all implementations of an Ipc interface.\r\n *\r\n * Create a subclass to implement your Ipc interface. Your class should be declared like this:\r\n * ```ts\r\n * class MyHandler extends IpcHandler implements MyInterface\r\n * ```\r\n * to ensure all methods and signatures are correct.\r\n *\r\n * Then, call `MyClass.register` at startup to connect your class to your channel.\r\n * @public\r\n */\r\nexport abstract class IpcHandler {\r\n /**\r\n * All subclasses *must* implement this method to specify their channel name.\r\n *\r\n * Channel names are the key that connects Handlers and senders. The channel name of IpcHandlers must exactly match the name used by senders.\r\n * By convention, channel names should be prefixed by a *namespace* (e.g. `${appName}/`)\r\n * unique enough to disambiguate them from channels for other apps that may be running in the same processes.\r\n */\r\n public abstract get channelName(): string;\r\n\r\n /**\r\n * Register this class as the handler for methods on its channel. This static method creates a new instance\r\n * that becomes the handler and is `this` when its methods are called.\r\n * @returns A function that can be called to remove the handler.\r\n * @note this method should only be called once per channel. If it is called multiple times, subsequent calls replace the previous ones.\r\n */\r\n public static register(): RemoveFunction {\r\n const impl = new (this as any)() as IpcHandler; // create an instance of subclass. \"as any\" is necessary because base class is abstract\r\n return IpcHost.handle(impl.channelName, async (_evt: Event, funcName: string, ...args: any[]): Promise<IpcInvokeReturn> => {\r\n try {\r\n const func = (impl as any)[funcName];\r\n if (typeof func !== \"function\")\r\n throw new IModelError(IModelStatus.FunctionNotFound, `Method \"${impl.constructor.name}.${funcName}\" not found on IpcHandler registered for channel: ${impl.channelName}`);\r\n\r\n return { result: await func.call(impl, ...args) };\r\n } catch (err: any) {\r\n const ret: IpcInvokeReturn = {\r\n error: {\r\n name: err.hasOwnProperty(\"name\") ? err.name : err.constructor?.name ?? \"Unknown Error\",\r\n message: err.message ?? BentleyError.getErrorMessage(err),\r\n errorNumber: err.errorNumber ?? 0,\r\n },\r\n };\r\n if (!IpcHost.noStack)\r\n ret.error.stack = BentleyError.getErrorStack(err);\r\n return ret;\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Implementation of IpcAppFunctions\r\n */\r\nclass IpcAppHandler extends IpcHandler implements IpcAppFunctions {\r\n public get channelName() { return ipcAppChannels.functions; }\r\n\r\n private _iModelKeyToPullStatus = new Map<string, ProgressStatus>();\r\n\r\n public async log(_timestamp: number, level: LogLevel, category: string, message: string, metaData?: any): Promise<void> {\r\n switch (level) {\r\n case LogLevel.Error:\r\n Logger.logError(category, message, metaData);\r\n break;\r\n case LogLevel.Info:\r\n Logger.logInfo(category, message, metaData);\r\n break;\r\n case LogLevel.Trace:\r\n Logger.logTrace(category, message, metaData);\r\n break;\r\n case LogLevel.Warning:\r\n Logger.logWarning(category, message, metaData);\r\n break;\r\n }\r\n }\r\n\r\n public async cancelTileContentRequests(tokenProps: IModelRpcProps, contentIds: TileTreeContentIds[]): Promise<void> {\r\n return cancelTileContentRequests(tokenProps, contentIds);\r\n }\r\n public async cancelElementGraphicsRequests(key: string, requestIds: string[]): Promise<void> {\r\n return IModelDb.findByKey(key)[_nativeDb].cancelElementGraphicsRequests(requestIds);\r\n }\r\n public async openBriefcase(args: OpenBriefcaseProps): Promise<IModelConnectionProps> {\r\n const db = await BriefcaseDb.open(args);\r\n return db.toJSON();\r\n }\r\n public async openCheckpoint(checkpoint: OpenCheckpointArgs): Promise<IModelConnectionProps> {\r\n return (await SnapshotDb.openCheckpoint(checkpoint)).getConnectionProps();\r\n }\r\n public async openStandalone(filePath: string, openMode: OpenMode, opts?: StandaloneOpenOptions): Promise<IModelConnectionProps> {\r\n return StandaloneDb.openFile(filePath, openMode, opts).getConnectionProps();\r\n }\r\n public async closeIModel(key: string): Promise<void> {\r\n IModelDb.findByKey(key).close();\r\n }\r\n public async saveChanges(key: string, description?: string): Promise<void> {\r\n IModelDb.findByKey(key).saveChanges(description);\r\n }\r\n public async hasPendingTxns(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].hasPendingTxns();\r\n }\r\n\r\n public async isUndoPossible(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].isUndoPossible();\r\n }\r\n public async isRedoPossible(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].isRedoPossible();\r\n }\r\n public async getUndoString(key: string): Promise<string> {\r\n return IModelDb.findByKey(key)[_nativeDb].getUndoString();\r\n }\r\n public async getRedoString(key: string): Promise<string> {\r\n return IModelDb.findByKey(key)[_nativeDb].getUndoString();\r\n }\r\n\r\n public async pullChanges(key: string, toIndex?: ChangesetIndex, options?: PullChangesOptions): Promise<ChangesetIndexAndId> {\r\n const iModelDb = BriefcaseDb.findByKey(key);\r\n\r\n this._iModelKeyToPullStatus.set(key, ProgressStatus.Continue);\r\n const checkAbort = () => this._iModelKeyToPullStatus.get(key) ?? ProgressStatus.Continue;\r\n\r\n let onProgress: ProgressFunction | undefined;\r\n if (options?.reportProgress) {\r\n const progressCallback: ProgressFunction = (loaded, total) => {\r\n IpcHost.send(getPullChangesIpcChannel(iModelDb.iModelId), { loaded, total });\r\n return checkAbort();\r\n };\r\n onProgress = throttleProgressCallback(progressCallback, checkAbort, options?.progressInterval);\r\n } else if (options?.enableCancellation) {\r\n onProgress = checkAbort;\r\n }\r\n\r\n try {\r\n await iModelDb.pullChanges({ toIndex, onProgress });\r\n } finally {\r\n this._iModelKeyToPullStatus.delete(key);\r\n }\r\n\r\n return iModelDb.changeset as ChangesetIndexAndId;\r\n }\r\n public async cancelPullChangesRequest(key: string): Promise<void> {\r\n this._iModelKeyToPullStatus.set(key, ProgressStatus.Abort);\r\n }\r\n\r\n public async pushChanges(key: string, description: string): Promise<ChangesetIndexAndId> {\r\n const iModelDb = BriefcaseDb.findByKey(key);\r\n await iModelDb.pushChanges({ description });\r\n return iModelDb.changeset as ChangesetIndexAndId;\r\n }\r\n\r\n public async toggleGraphicalEditingScope(key: string, startSession: boolean): Promise<boolean> {\r\n const val: IModelJsNative.ErrorStatusOrResult<any, boolean> = IModelDb.findByKey(key)[_nativeDb].setGeometricModelTrackingEnabled(startSession);\r\n if (val.error)\r\n throw new IModelError(val.error.status, \"Failed to toggle graphical editing scope\");\r\n assert(undefined !== val.result);\r\n return val.result;\r\n }\r\n public async isGraphicalEditingSupported(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].isGeometricModelTrackingSupported();\r\n }\r\n\r\n public async reverseTxns(key: string, numOperations: number): Promise<IModelStatus> {\r\n return IModelDb.findByKey(key)[_nativeDb].reverseTxns(numOperations);\r\n }\r\n public async reverseAllTxn(key: string): Promise<IModelStatus> {\r\n return IModelDb.findByKey(key)[_nativeDb].reverseAll();\r\n }\r\n public async reinstateTxn(key: string): Promise<IModelStatus> {\r\n return IModelDb.findByKey(key)[_nativeDb].reinstateTxn();\r\n }\r\n public async restartTxnSession(key: string): Promise<void> {\r\n return IModelDb.findByKey(key)[_nativeDb].restartTxnSession();\r\n }\r\n\r\n public async queryConcurrency(pool: \"io\" | \"cpu\"): Promise<number> {\r\n return IModelNative.platform.queryConcurrency(pool);\r\n }\r\n}\r\n\r\n/**\r\n * Prevents progress callback being called more frequently when provided interval.\r\n * @internal\r\n */\r\nexport function throttleProgressCallback(func: ProgressFunction, checkAbort: () => ProgressStatus, progressInterval?: number): ProgressFunction {\r\n const interval = progressInterval ?? 250; // by default, only send progress events every 250 milliseconds\r\n let nextTime = Date.now() + interval;\r\n const progressCallback: ProgressFunction = (loaded, total) => {\r\n const now = Date.now();\r\n if (loaded >= total || now >= nextTime) {\r\n nextTime = now + interval;\r\n return func(loaded, total);\r\n }\r\n return checkAbort();\r\n };\r\n\r\n return progressCallback;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"IpcHost.js","sourceRoot":"","sources":["../../src/IpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module NativeApp\r\n */\r\n\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { assert, BentleyError, IModelStatus, Logger, LogLevel, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n ChangesetIndex, ChangesetIndexAndId, EditingScopeNotifications, getPullChangesIpcChannel, IModelConnectionProps, IModelError, IModelRpcProps,\r\n ipcAppChannels, IpcAppFunctions, IpcAppNotifications, IpcInvokeReturn, IpcListener, IpcSocketBackend, iTwinChannel,\r\n OpenBriefcaseProps, OpenCheckpointArgs, PullChangesOptions, RemoveFunction, StandaloneOpenOptions, TileTreeContentIds, TxnNotifications,\r\n} from \"@itwin/core-common\";\r\nimport { ProgressFunction, ProgressStatus } from \"./CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, SnapshotDb, StandaloneDb } from \"./IModelDb\";\r\nimport { IModelHost, IModelHostOptions } from \"./IModelHost\";\r\nimport { cancelTileContentRequests } from \"./rpc-impl/IModelTileRpcImpl\";\r\nimport { IModelNative } from \"./internal/NativePlatform\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\n\r\n/**\r\n * Options for [[IpcHost.startup]]\r\n * @public\r\n */\r\nexport interface IpcHostOpts {\r\n iModelHost?: IModelHostOptions;\r\n ipcHost?: {\r\n /** The Ipc socket to use for communications with frontend. Allows undefined only for headless tests. */\r\n socket?: IpcSocketBackend;\r\n\r\n /** don't send stack information on exceptions */\r\n exceptions?: {\r\n noStack?: boolean;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Used by applications that have a dedicated backend. IpcHosts may send messages to their corresponding IpcApp.\r\n * @note if either end terminates, the other must too.\r\n * @public\r\n */\r\nexport class IpcHost {\r\n public static noStack = false;\r\n private static _ipc: IpcSocketBackend | undefined;\r\n /** Get the implementation of the [IpcSocketBackend]($common) interface. */\r\n private static get ipc(): IpcSocketBackend { return this._ipc!; } // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n /** Determine whether Ipc is available for this backend. This will only be true if [[startup]] has been called on this class. */\r\n public static get isValid(): boolean { return undefined !== this._ipc; }\r\n\r\n /**\r\n * Send a message to the frontend over an Ipc channel.\r\n * @param channel the name of the channel matching the name registered with [[IpcApp.addListener]].\r\n * @param data The content of the message.\r\n */\r\n public static send(channel: string, ...data: any[]): void {\r\n this.ipc.send(iTwinChannel(channel), ...data);\r\n }\r\n\r\n /**\r\n * Establish a handler for an Ipc channel to receive [[Frontend.invoke]] calls\r\n * @param channel The name of the channel for this handler.\r\n * @param handler A function that supplies the implementation for `channel`\r\n * @note returns A function to call to remove the handler.\r\n */\r\n public static handle(channel: string, handler: (...args: any[]) => Promise<any>): RemoveFunction {\r\n return this.ipc.handle(iTwinChannel(channel), handler);\r\n }\r\n /**\r\n * Establish a handler to receive messages sent via [[IpcApp.send]].\r\n * @param channel The name of the channel for the messages.\r\n * @param listener A function called when messages are sent over `channel`\r\n * @note returns A function to call to remove the listener.\r\n */\r\n public static addListener(channel: string, listener: IpcListener): RemoveFunction {\r\n return this.ipc.addListener(iTwinChannel(channel), listener);\r\n }\r\n /**\r\n * Remove a previously registered listener\r\n * @param channel The name of the channel for the listener previously registered with [[addListener]]\r\n * @param listener The function passed to [[addListener]]\r\n */\r\n public static removeListener(channel: string, listener: IpcListener): void {\r\n this.ipc.removeListener(iTwinChannel(channel), listener);\r\n }\r\n\r\n private static notify(channel: string, briefcase: BriefcaseDb | StandaloneDb, methodName: string, ...args: any[]) {\r\n if (this.isValid)\r\n return this.send(`${channel}/${briefcase.key}`, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static notifyIpcFrontend<T extends keyof IpcAppNotifications>(methodName: T, ...args: Parameters<IpcAppNotifications[T]>) {\r\n return IpcHost.send(ipcAppChannels.appNotify, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static notifyTxns<T extends keyof TxnNotifications>(briefcase: BriefcaseDb | StandaloneDb, methodName: T, ...args: Parameters<TxnNotifications[T]>) {\r\n this.notify(ipcAppChannels.txns, briefcase, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static notifyEditingScope<T extends keyof EditingScopeNotifications>(briefcase: BriefcaseDb | StandaloneDb, methodName: T, ...args: Parameters<EditingScopeNotifications[T]>) {\r\n this.notify(ipcAppChannels.editingScope, briefcase, methodName, ...args);\r\n }\r\n\r\n /**\r\n * Start the backend of an Ipc app.\r\n * @param opt\r\n * @note this method calls [[IModelHost.startup]] internally.\r\n */\r\n public static async startup(opt?: IpcHostOpts): Promise<void> {\r\n this._ipc = opt?.ipcHost?.socket;\r\n if (opt?.ipcHost?.exceptions?.noStack)\r\n this.noStack = true;\r\n\r\n if (this.isValid) { // for tests, we use IpcHost but don't have a frontend\r\n IpcAppHandler.register();\r\n }\r\n\r\n await IModelHost.startup(opt?.iModelHost);\r\n }\r\n\r\n /** Shutdown IpcHost backend. Also calls [[IModelHost.shutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n this._ipc = undefined;\r\n await IModelHost.shutdown();\r\n }\r\n}\r\n\r\n/**\r\n * Base class for all implementations of an Ipc interface.\r\n *\r\n * Create a subclass to implement your Ipc interface. Your class should be declared like this:\r\n * ```ts\r\n * class MyHandler extends IpcHandler implements MyInterface\r\n * ```\r\n * to ensure all methods and signatures are correct.\r\n *\r\n * Then, call `MyClass.register` at startup to connect your class to your channel.\r\n * @public\r\n */\r\nexport abstract class IpcHandler {\r\n /**\r\n * All subclasses *must* implement this method to specify their channel name.\r\n *\r\n * Channel names are the key that connects Handlers and senders. The channel name of IpcHandlers must exactly match the name used by senders.\r\n * By convention, channel names should be prefixed by a *namespace* (e.g. `${appName}/`)\r\n * unique enough to disambiguate them from channels for other apps that may be running in the same processes.\r\n */\r\n public abstract get channelName(): string;\r\n\r\n /**\r\n * Register this class as the handler for methods on its channel. This static method creates a new instance\r\n * that becomes the handler and is `this` when its methods are called.\r\n * @returns A function that can be called to remove the handler.\r\n * @note this method should only be called once per channel. If it is called multiple times, subsequent calls replace the previous ones.\r\n */\r\n public static register(): RemoveFunction {\r\n const impl = new (this as any)() as IpcHandler; // create an instance of subclass. \"as any\" is necessary because base class is abstract\r\n const prohibitedFunctions = Object.getOwnPropertyNames(Object.getPrototypeOf({}));\r\n\r\n return IpcHost.handle(impl.channelName, async (_evt: Event, funcName: string, ...args: any[]): Promise<IpcInvokeReturn> => {\r\n try {\r\n if (prohibitedFunctions.includes(funcName))\r\n throw new Error(`Method \"${funcName}\" not available for channel: ${impl.channelName}`);\r\n\r\n const func = (impl as any)[funcName];\r\n if (typeof func !== \"function\")\r\n throw new IModelError(IModelStatus.FunctionNotFound, `Method \"${impl.constructor.name}.${funcName}\" not found on IpcHandler registered for channel: ${impl.channelName}`);\r\n\r\n return { result: await func.call(impl, ...args) };\r\n } catch (err: any) {\r\n const ret: IpcInvokeReturn = {\r\n error: {\r\n name: err.hasOwnProperty(\"name\") ? err.name : err.constructor?.name ?? \"Unknown Error\",\r\n message: err.message ?? BentleyError.getErrorMessage(err),\r\n errorNumber: err.errorNumber ?? 0,\r\n },\r\n };\r\n if (!IpcHost.noStack)\r\n ret.error.stack = BentleyError.getErrorStack(err);\r\n return ret;\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Implementation of IpcAppFunctions\r\n */\r\nclass IpcAppHandler extends IpcHandler implements IpcAppFunctions {\r\n public get channelName() { return ipcAppChannels.functions; }\r\n\r\n private _iModelKeyToPullStatus = new Map<string, ProgressStatus>();\r\n\r\n public async log(_timestamp: number, level: LogLevel, category: string, message: string, metaData?: any): Promise<void> {\r\n switch (level) {\r\n case LogLevel.Error:\r\n Logger.logError(category, message, metaData);\r\n break;\r\n case LogLevel.Info:\r\n Logger.logInfo(category, message, metaData);\r\n break;\r\n case LogLevel.Trace:\r\n Logger.logTrace(category, message, metaData);\r\n break;\r\n case LogLevel.Warning:\r\n Logger.logWarning(category, message, metaData);\r\n break;\r\n }\r\n }\r\n\r\n public async cancelTileContentRequests(tokenProps: IModelRpcProps, contentIds: TileTreeContentIds[]): Promise<void> {\r\n return cancelTileContentRequests(tokenProps, contentIds);\r\n }\r\n public async cancelElementGraphicsRequests(key: string, requestIds: string[]): Promise<void> {\r\n return IModelDb.findByKey(key)[_nativeDb].cancelElementGraphicsRequests(requestIds);\r\n }\r\n public async openBriefcase(args: OpenBriefcaseProps): Promise<IModelConnectionProps> {\r\n const db = await BriefcaseDb.open(args);\r\n return db.toJSON();\r\n }\r\n public async openCheckpoint(checkpoint: OpenCheckpointArgs): Promise<IModelConnectionProps> {\r\n return (await SnapshotDb.openCheckpoint(checkpoint)).getConnectionProps();\r\n }\r\n public async openStandalone(filePath: string, openMode: OpenMode, opts?: StandaloneOpenOptions): Promise<IModelConnectionProps> {\r\n return StandaloneDb.openFile(filePath, openMode, opts).getConnectionProps();\r\n }\r\n public async closeIModel(key: string): Promise<void> {\r\n IModelDb.findByKey(key).close();\r\n }\r\n public async saveChanges(key: string, description?: string): Promise<void> {\r\n IModelDb.findByKey(key).saveChanges(description);\r\n }\r\n public async hasPendingTxns(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].hasPendingTxns();\r\n }\r\n\r\n public async isUndoPossible(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].isUndoPossible();\r\n }\r\n public async isRedoPossible(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].isRedoPossible();\r\n }\r\n public async getUndoString(key: string): Promise<string> {\r\n return IModelDb.findByKey(key)[_nativeDb].getUndoString();\r\n }\r\n public async getRedoString(key: string): Promise<string> {\r\n return IModelDb.findByKey(key)[_nativeDb].getUndoString();\r\n }\r\n\r\n public async pullChanges(key: string, toIndex?: ChangesetIndex, options?: PullChangesOptions): Promise<ChangesetIndexAndId> {\r\n const iModelDb = BriefcaseDb.findByKey(key);\r\n\r\n this._iModelKeyToPullStatus.set(key, ProgressStatus.Continue);\r\n const checkAbort = () => this._iModelKeyToPullStatus.get(key) ?? ProgressStatus.Continue;\r\n\r\n let onProgress: ProgressFunction | undefined;\r\n if (options?.reportProgress) {\r\n const progressCallback: ProgressFunction = (loaded, total) => {\r\n IpcHost.send(getPullChangesIpcChannel(iModelDb.iModelId), { loaded, total });\r\n return checkAbort();\r\n };\r\n onProgress = throttleProgressCallback(progressCallback, checkAbort, options?.progressInterval);\r\n } else if (options?.enableCancellation) {\r\n onProgress = checkAbort;\r\n }\r\n\r\n try {\r\n await iModelDb.pullChanges({ toIndex, onProgress });\r\n } finally {\r\n this._iModelKeyToPullStatus.delete(key);\r\n }\r\n\r\n return iModelDb.changeset as ChangesetIndexAndId;\r\n }\r\n public async cancelPullChangesRequest(key: string): Promise<void> {\r\n this._iModelKeyToPullStatus.set(key, ProgressStatus.Abort);\r\n }\r\n\r\n public async pushChanges(key: string, description: string): Promise<ChangesetIndexAndId> {\r\n const iModelDb = BriefcaseDb.findByKey(key);\r\n await iModelDb.pushChanges({ description });\r\n return iModelDb.changeset as ChangesetIndexAndId;\r\n }\r\n\r\n public async toggleGraphicalEditingScope(key: string, startSession: boolean): Promise<boolean> {\r\n const val: IModelJsNative.ErrorStatusOrResult<any, boolean> = IModelDb.findByKey(key)[_nativeDb].setGeometricModelTrackingEnabled(startSession);\r\n if (val.error)\r\n throw new IModelError(val.error.status, \"Failed to toggle graphical editing scope\");\r\n assert(undefined !== val.result);\r\n return val.result;\r\n }\r\n public async isGraphicalEditingSupported(key: string): Promise<boolean> {\r\n return IModelDb.findByKey(key)[_nativeDb].isGeometricModelTrackingSupported();\r\n }\r\n\r\n public async reverseTxns(key: string, numOperations: number): Promise<IModelStatus> {\r\n return IModelDb.findByKey(key)[_nativeDb].reverseTxns(numOperations);\r\n }\r\n public async reverseAllTxn(key: string): Promise<IModelStatus> {\r\n return IModelDb.findByKey(key)[_nativeDb].reverseAll();\r\n }\r\n public async reinstateTxn(key: string): Promise<IModelStatus> {\r\n return IModelDb.findByKey(key)[_nativeDb].reinstateTxn();\r\n }\r\n public async restartTxnSession(key: string): Promise<void> {\r\n return IModelDb.findByKey(key)[_nativeDb].restartTxnSession();\r\n }\r\n\r\n public async queryConcurrency(pool: \"io\" | \"cpu\"): Promise<number> {\r\n return IModelNative.platform.queryConcurrency(pool);\r\n }\r\n}\r\n\r\n/**\r\n * Prevents progress callback being called more frequently when provided interval.\r\n * @internal\r\n */\r\nexport function throttleProgressCallback(func: ProgressFunction, checkAbort: () => ProgressStatus, progressInterval?: number): ProgressFunction {\r\n const interval = progressInterval ?? 250; // by default, only send progress events every 250 milliseconds\r\n let nextTime = Date.now() + interval;\r\n const progressCallback: ProgressFunction = (loaded, total) => {\r\n const now = Date.now();\r\n if (loaded >= total || now >= nextTime) {\r\n nextTime = now + interval;\r\n return func(loaded, total);\r\n }\r\n return checkAbort();\r\n };\r\n\r\n return progressCallback;\r\n}\r\n"]}
|
package/lib/cjs/LocalHub.js
CHANGED
|
@@ -456,7 +456,7 @@ class LocalHub {
|
|
|
456
456
|
else {
|
|
457
457
|
// if requester is the only one holding a shared lock, "upgrade" the lock from shared to exclusive
|
|
458
458
|
if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {
|
|
459
|
-
const id = lockStatus.sharedBy.values().next().value;
|
|
459
|
+
const id = lockStatus.sharedBy.values().next().value; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
460
460
|
throw new BackendHubAccess_1.LockConflict(id, this.getBriefcase(id).alias, "shared lock is held");
|
|
461
461
|
}
|
|
462
462
|
this.removeSharedLock(props.id, briefcase.briefcaseId);
|
package/lib/cjs/LocalHub.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\r\n ChangesetRange, IModelError, LocalDirName, LocalFileName, LockState,\r\n} from \"@itwin/core-common\";\r\nimport { LockConflict, LockMap, LockProps } from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\n\r\n// cspell:ignore rowid\r\n\r\n/** @internal */\r\ninterface MockBriefcaseIdProps {\r\n id: BriefcaseId;\r\n user: string; // Just an AccessToken that simulates a user\r\n alias: string;\r\n assigned: boolean;\r\n}\r\n\r\n/** @internal */\r\ninterface LocalHubProps {\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n readonly iModelName: string;\r\n readonly description?: string;\r\n readonly version0?: string;\r\n readonly noLocks?: true;\r\n}\r\n\r\ninterface LocksEntry {\r\n id: Id64String;\r\n level: LockState;\r\n lastCsIndex?: ChangesetIndex;\r\n briefcaseId?: BriefcaseId;\r\n}\r\n\r\ninterface LockStatusNone {\r\n state: LockState.None;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusExclusive {\r\n state: LockState.Exclusive;\r\n briefcaseId: BriefcaseId;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusShared {\r\n state: LockState.Shared;\r\n sharedBy: Set<BriefcaseId>;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\ninterface BriefcaseIdAndChangeset {\r\n changeset: ChangesetIdWithIndex;\r\n briefcaseId: BriefcaseId;\r\n}\r\n\r\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\r\n\r\n/**\r\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\r\n * @internal\r\n */\r\nexport class LocalHub {\r\n public readonly iTwinId: GuidString;\r\n public readonly iModelId: GuidString;\r\n public readonly iModelName: string;\r\n public readonly description?: string;\r\n private _hubDb?: SQLiteDb;\r\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\r\n private _latestChangesetIndex = 0;\r\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\r\n\r\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\r\n this.iTwinId = arg.iTwinId;\r\n this.iModelId = arg.iModelId;\r\n this.iModelName = arg.iModelName;\r\n this.description = arg.description;\r\n\r\n this.cleanup();\r\n\r\n IModelJsFs.recursiveMkDirSync(this.rootDir);\r\n IModelJsFs.mkdirSync(this.changesetDir);\r\n IModelJsFs.mkdirSync(this.checkpointDir);\r\n\r\n const db = this._hubDb = new SQLiteDb();\r\n db.createDb(this.mockDbName);\r\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\r\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,\\\r\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\r\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\r\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\r\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\r\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\r\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\r\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\r\n db.saveChanges();\r\n\r\n const version0Root = `${rootDir}_version0`;\r\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\r\n\r\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\r\n IModelJsFs.recursiveMkDirSync(version0Root);\r\n IModelJsFs.removeSync(version0);\r\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\r\n }\r\n\r\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\r\n if (!arg.version0)\r\n IModelJsFs.removeSync(version0);\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(this.iTwinId);\r\n nativeDb.setIModelId(this.iModelId);\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeFile();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\r\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\r\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\r\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\r\n\r\n /** Acquire the next available briefcaseId and assign it to the supplied user */\r\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\r\n const db = this.db;\r\n const newId = this._nextBriefcaseId++;\r\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, newId);\r\n stmt.bindString(2, user);\r\n stmt.bindString(3, alias ?? `${user} (${newId})`);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\r\n });\r\n db.saveChanges();\r\n return newId;\r\n }\r\n\r\n /** Release a briefcaseId */\r\n public releaseBriefcaseId(id: BriefcaseId) {\r\n const db = this.db;\r\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\r\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Get an array of all of the currently assigned Briefcases */\r\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\r\n const briefcases: MockBriefcaseIdProps[] = [];\r\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\r\n if (onlyAssigned)\r\n sql += \" WHERE assigned=1\";\r\n\r\n this.db.withSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n briefcases.push({\r\n id: stmt.getValueInteger(0),\r\n user: stmt.getValueString(1),\r\n alias: stmt.getValueString(2),\r\n assigned: stmt.getValueInteger(3) !== 0,\r\n });\r\n }\r\n });\r\n return briefcases;\r\n }\r\n\r\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\r\n public getBriefcaseIds(user: string): BriefcaseId[] {\r\n const briefcases: BriefcaseId[] = [];\r\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\r\n stmt.bindString(1, user);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.push(stmt.getValueInteger(0));\r\n });\r\n return briefcases;\r\n }\r\n\r\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\r\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\r\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\r\n });\r\n }\r\n\r\n private getChangesetFileName(index: ChangesetIndex) {\r\n return join(this.changesetDir, `changeset-${index}`);\r\n }\r\n\r\n /** Add a changeset to the timeline\r\n * @return the changesetIndex of the added changeset\r\n */\r\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\r\n const stats = IModelJsFs.lstatSync(changeset.pathname);\r\n if (!stats)\r\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\r\n\r\n const parentIndex = this.getChangesetById(changeset.parentId).index;\r\n if (parentIndex !== this.latestChangesetIndex)\r\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\r\n\r\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\r\n const db = this.db;\r\n changeset.index = this._latestChangesetIndex + 1;\r\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, changeset.index);\r\n stmt.bindString(2, changeset.id);\r\n stmt.bindString(3, changeset.description);\r\n stmt.bindInteger(4, stats.size);\r\n stmt.bindInteger(5, changeset.changesType ?? 0);\r\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\r\n stmt.bindString(7, changeset.userCreated ?? \"\");\r\n stmt.bindInteger(8, changeset.briefcaseId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert changeset into mock db\");\r\n });\r\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\r\n db.saveChanges();\r\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\r\n return changeset.index;\r\n }\r\n\r\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\r\n return changeset.index ?? this.getChangesetIndex(changeset.id);\r\n }\r\n\r\n /** Get the index of a changeset by its Id */\r\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\r\n if (id === \"\")\r\n return 0;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\r\n stmt.bindString(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset ${id} not found`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its Id */\r\n public getChangesetById(id: ChangesetId): ChangesetProps {\r\n return this.getChangesetByIndex(this.getChangesetIndex(id));\r\n }\r\n\r\n public getPreviousIndex(index: ChangesetIndex) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `cannot get previous index`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public getParentId(index: ChangesetIndex): ChangesetId {\r\n if (index === 0)\r\n return \"\";\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, this.getPreviousIndex(index));\r\n stmt.step();\r\n return stmt.getValueString(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its index */\r\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\r\n if (index <= 0)\r\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0 };\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset at index ${index} not found`);\r\n\r\n return {\r\n description: stmt.getValueString(0),\r\n size: stmt.getValueDouble(1),\r\n changesType: stmt.getValueInteger(2),\r\n pushDate: stmt.getValueString(3),\r\n userCreated: stmt.getValueString(4),\r\n id: stmt.getValueString(5),\r\n briefcaseId: stmt.getValueInteger(6),\r\n index,\r\n parentId: this.getParentId(index),\r\n };\r\n });\r\n }\r\n\r\n public getLatestChangeset(): ChangesetProps {\r\n return this.getChangesetByIndex(this.latestChangesetIndex);\r\n }\r\n\r\n public getChangesetId(index: ChangesetIndex): ChangesetId {\r\n return this.getChangesetByIndex(index).id;\r\n }\r\n\r\n /** Get an array of changesets starting with first to last, by index */\r\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\r\n const changesets: ChangesetProps[] = [];\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\r\n });\r\n return changesets;\r\n }\r\n\r\n /** Name a version */\r\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\r\n stmt.bindString(1, arg.versionName);\r\n stmt.bindInteger(2, arg.csIndex);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Delete a named version */\r\n public deleteNamedVersion(versionName: string) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't delete named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** find the changeset for a named version */\r\n public findNamedVersion(versionName: string): ChangesetProps {\r\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\r\n return stmt.getValueInteger(0);\r\n });\r\n return this.getChangesetByIndex(index);\r\n }\r\n\r\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\r\n return `checkpoint-${csIndex}`;\r\n }\r\n\r\n /** \"upload\" a checkpoint */\r\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\r\n stmt.bindInteger(1, arg.changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== res)\r\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\r\n });\r\n db.saveChanges();\r\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\r\n IModelJsFs.copySync(arg.localFile, outName);\r\n return outName;\r\n }\r\n\r\n /** Get an array of the indexes for a range of checkpoints */\r\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n const checkpoints: ChangesetIndex[] = [];\r\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n checkpoints.push(stmt.getValueInteger(0));\r\n\r\n });\r\n return checkpoints;\r\n }\r\n\r\n /** Find the checkpoint that is no newer than a changesetIndex */\r\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\r\n if (changesetIndex <= 0)\r\n return 0;\r\n\r\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\r\n stmt.bindInteger(1, changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== res)\r\n throw new IModelError(res, \"can't get previous checkpoint\");\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** \"download\" a checkpoint */\r\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\r\n const index = this.getIndexFromChangeset(arg.changeset);\r\n const prev = this.queryPreviousCheckpoint(index);\r\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\r\n const changeset = this.getChangesetByIndex(index);\r\n return { index, id: changeset.id };\r\n }\r\n\r\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\r\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\r\n return arg;\r\n }\r\n\r\n /** \"download\" a changeset */\r\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\r\n const cs = this.getChangesetByIndex(arg.index);\r\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\r\n return this.copyChangeset(csProps);\r\n }\r\n\r\n /** \"download\" all the changesets in a given range */\r\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\r\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\r\n for (const cs of cSets) {\r\n cs.pathname = join(arg.targetDir, cs.id);\r\n this.copyChangeset(cs);\r\n }\r\n return cSets;\r\n }\r\n\r\n private querySharedLockHolders(elementId: Id64String) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const briefcases = new Set<BriefcaseId>();\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.add(stmt.getValueInteger(0));\r\n return briefcases;\r\n });\r\n }\r\n\r\n public queryAllLocks(briefcaseId: BriefcaseId) {\r\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\r\n const locks: LockProps[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\r\n });\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\r\n });\r\n return locks;\r\n }\r\n\r\n public queryLockStatus(elementId: Id64String): LockStatus {\r\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n return { state: LockState.None };\r\n const lastCsVal = stmt.getValue(0);\r\n const lock = {\r\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\r\n state: stmt.getValueInteger(1),\r\n };\r\n switch (lock.state) {\r\n case LockState.None:\r\n return lock;\r\n case LockState.Exclusive:\r\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\r\n case LockState.Shared:\r\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\r\n default:\r\n throw new Error(\"illegal lock state\");\r\n }\r\n });\r\n }\r\n\r\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\r\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\r\n\r\n const wantShared = props.state === LockState.Shared;\r\n if (wantShared && (currStatus.state === LockState.Exclusive))\r\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\r\n\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, props.state);\r\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert lock\");\r\n });\r\n\r\n if (wantShared) {\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert shared lock\");\r\n });\r\n }\r\n }\r\n\r\n private clearLock(id: Id64String) {\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't release lock\");\r\n });\r\n }\r\n\r\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\r\n if (index <= 0)\r\n return;\r\n\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n stmt.bindId(2, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't update lock changeSetId\");\r\n });\r\n }\r\n\r\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.None)\r\n throw new Error(\"cannot request lock for LockState.None\");\r\n\r\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\r\n\r\n const lockStatus = this.queryLockStatus(props.id);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n return this.reserveLock(lockStatus, props, briefcase);\r\n\r\n case LockState.Shared:\r\n if (props.state === LockState.Shared) {\r\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\r\n this.reserveLock(lockStatus, props, briefcase);\r\n } else {\r\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\r\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\r\n const id = lockStatus.sharedBy.values().next().value;\r\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\r\n }\r\n this.removeSharedLock(props.id, briefcase.briefcaseId);\r\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\r\n }\r\n return;\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\r\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\r\n }\r\n }\r\n\r\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\r\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\r\n stmt.bindId(1, lockId);\r\n stmt.bindInteger(2, briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't remove shared lock\");\r\n });\r\n }\r\n\r\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const lockId = props.id;\r\n const lockStatus = this.queryLockStatus(lockId);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== arg.briefcaseId)\r\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\r\n this.updateLockChangeset(lockId, arg.changesetIndex);\r\n this.clearLock(lockId);\r\n break;\r\n\r\n case LockState.Shared:\r\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\r\n this.removeSharedLock(lockId, arg.briefcaseId);\r\n if (lockStatus.sharedBy.size === 1)\r\n this.clearLock(lockId);\r\n }\r\n }\r\n\r\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\r\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\r\n try {\r\n for (const lock of locks)\r\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\r\n this.db.saveChanges(); // only after all locks have been acquired\r\n } catch (err) {\r\n this.db.abandonChanges(); // abandon all locks that may have been acquired\r\n throw err;\r\n }\r\n }\r\n\r\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n const locks = new Map<Id64String, LockState>();\r\n locks.set(props.id, props.state);\r\n this.acquireLocks(locks, briefcase);\r\n }\r\n\r\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n for (const props of locks)\r\n this.releaseLock(props, arg);\r\n this.db.saveChanges();\r\n }\r\n\r\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const locks = this.queryAllLocks(arg.briefcaseId);\r\n this.releaseLocks(locks, arg);\r\n }\r\n\r\n private countTable(tableName: string): number {\r\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n // for debugging\r\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\r\n // for debugging\r\n public countLocks(): number { return this.countTable(\"locks\"); }\r\n\r\n // for debugging\r\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\r\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\r\n });\r\n return locks;\r\n }\r\n\r\n // for debugging\r\n public queryLocks(): LocksEntry[] {\r\n const locks: LocksEntry[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({\r\n id: stmt.getValueId(0),\r\n level: stmt.getValueInteger(1),\r\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\r\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\r\n });\r\n });\r\n return locks;\r\n }\r\n\r\n public removeDir(dirName: string) {\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n }\r\n public cleanup() {\r\n if (this._hubDb) {\r\n this._hubDb.closeDb();\r\n this._hubDb = undefined;\r\n }\r\n try {\r\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\r\n this.removeDir(this.rootDir);\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\r\n ChangesetRange, IModelError, LocalDirName, LocalFileName, LockState,\r\n} from \"@itwin/core-common\";\r\nimport { LockConflict, LockMap, LockProps } from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\n\r\n// cspell:ignore rowid\r\n\r\n/** @internal */\r\ninterface MockBriefcaseIdProps {\r\n id: BriefcaseId;\r\n user: string; // Just an AccessToken that simulates a user\r\n alias: string;\r\n assigned: boolean;\r\n}\r\n\r\n/** @internal */\r\ninterface LocalHubProps {\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n readonly iModelName: string;\r\n readonly description?: string;\r\n readonly version0?: string;\r\n readonly noLocks?: true;\r\n}\r\n\r\ninterface LocksEntry {\r\n id: Id64String;\r\n level: LockState;\r\n lastCsIndex?: ChangesetIndex;\r\n briefcaseId?: BriefcaseId;\r\n}\r\n\r\ninterface LockStatusNone {\r\n state: LockState.None;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusExclusive {\r\n state: LockState.Exclusive;\r\n briefcaseId: BriefcaseId;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusShared {\r\n state: LockState.Shared;\r\n sharedBy: Set<BriefcaseId>;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\ninterface BriefcaseIdAndChangeset {\r\n changeset: ChangesetIdWithIndex;\r\n briefcaseId: BriefcaseId;\r\n}\r\n\r\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\r\n\r\n/**\r\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\r\n * @internal\r\n */\r\nexport class LocalHub {\r\n public readonly iTwinId: GuidString;\r\n public readonly iModelId: GuidString;\r\n public readonly iModelName: string;\r\n public readonly description?: string;\r\n private _hubDb?: SQLiteDb;\r\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\r\n private _latestChangesetIndex = 0;\r\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\r\n\r\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\r\n this.iTwinId = arg.iTwinId;\r\n this.iModelId = arg.iModelId;\r\n this.iModelName = arg.iModelName;\r\n this.description = arg.description;\r\n\r\n this.cleanup();\r\n\r\n IModelJsFs.recursiveMkDirSync(this.rootDir);\r\n IModelJsFs.mkdirSync(this.changesetDir);\r\n IModelJsFs.mkdirSync(this.checkpointDir);\r\n\r\n const db = this._hubDb = new SQLiteDb();\r\n db.createDb(this.mockDbName);\r\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\r\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,\\\r\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\r\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\r\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\r\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\r\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\r\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\r\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\r\n db.saveChanges();\r\n\r\n const version0Root = `${rootDir}_version0`;\r\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\r\n\r\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\r\n IModelJsFs.recursiveMkDirSync(version0Root);\r\n IModelJsFs.removeSync(version0);\r\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\r\n }\r\n\r\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\r\n if (!arg.version0)\r\n IModelJsFs.removeSync(version0);\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(this.iTwinId);\r\n nativeDb.setIModelId(this.iModelId);\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeFile();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\r\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\r\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\r\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\r\n\r\n /** Acquire the next available briefcaseId and assign it to the supplied user */\r\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\r\n const db = this.db;\r\n const newId = this._nextBriefcaseId++;\r\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, newId);\r\n stmt.bindString(2, user);\r\n stmt.bindString(3, alias ?? `${user} (${newId})`);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\r\n });\r\n db.saveChanges();\r\n return newId;\r\n }\r\n\r\n /** Release a briefcaseId */\r\n public releaseBriefcaseId(id: BriefcaseId) {\r\n const db = this.db;\r\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\r\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Get an array of all of the currently assigned Briefcases */\r\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\r\n const briefcases: MockBriefcaseIdProps[] = [];\r\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\r\n if (onlyAssigned)\r\n sql += \" WHERE assigned=1\";\r\n\r\n this.db.withSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n briefcases.push({\r\n id: stmt.getValueInteger(0),\r\n user: stmt.getValueString(1),\r\n alias: stmt.getValueString(2),\r\n assigned: stmt.getValueInteger(3) !== 0,\r\n });\r\n }\r\n });\r\n return briefcases;\r\n }\r\n\r\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\r\n public getBriefcaseIds(user: string): BriefcaseId[] {\r\n const briefcases: BriefcaseId[] = [];\r\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\r\n stmt.bindString(1, user);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.push(stmt.getValueInteger(0));\r\n });\r\n return briefcases;\r\n }\r\n\r\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\r\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\r\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\r\n });\r\n }\r\n\r\n private getChangesetFileName(index: ChangesetIndex) {\r\n return join(this.changesetDir, `changeset-${index}`);\r\n }\r\n\r\n /** Add a changeset to the timeline\r\n * @return the changesetIndex of the added changeset\r\n */\r\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\r\n const stats = IModelJsFs.lstatSync(changeset.pathname);\r\n if (!stats)\r\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\r\n\r\n const parentIndex = this.getChangesetById(changeset.parentId).index;\r\n if (parentIndex !== this.latestChangesetIndex)\r\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\r\n\r\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\r\n const db = this.db;\r\n changeset.index = this._latestChangesetIndex + 1;\r\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, changeset.index);\r\n stmt.bindString(2, changeset.id);\r\n stmt.bindString(3, changeset.description);\r\n stmt.bindInteger(4, stats.size);\r\n stmt.bindInteger(5, changeset.changesType ?? 0);\r\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\r\n stmt.bindString(7, changeset.userCreated ?? \"\");\r\n stmt.bindInteger(8, changeset.briefcaseId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert changeset into mock db\");\r\n });\r\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\r\n db.saveChanges();\r\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\r\n return changeset.index;\r\n }\r\n\r\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\r\n return changeset.index ?? this.getChangesetIndex(changeset.id);\r\n }\r\n\r\n /** Get the index of a changeset by its Id */\r\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\r\n if (id === \"\")\r\n return 0;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\r\n stmt.bindString(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset ${id} not found`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its Id */\r\n public getChangesetById(id: ChangesetId): ChangesetProps {\r\n return this.getChangesetByIndex(this.getChangesetIndex(id));\r\n }\r\n\r\n public getPreviousIndex(index: ChangesetIndex) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `cannot get previous index`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public getParentId(index: ChangesetIndex): ChangesetId {\r\n if (index === 0)\r\n return \"\";\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, this.getPreviousIndex(index));\r\n stmt.step();\r\n return stmt.getValueString(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its index */\r\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\r\n if (index <= 0)\r\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0 };\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset at index ${index} not found`);\r\n\r\n return {\r\n description: stmt.getValueString(0),\r\n size: stmt.getValueDouble(1),\r\n changesType: stmt.getValueInteger(2),\r\n pushDate: stmt.getValueString(3),\r\n userCreated: stmt.getValueString(4),\r\n id: stmt.getValueString(5),\r\n briefcaseId: stmt.getValueInteger(6),\r\n index,\r\n parentId: this.getParentId(index),\r\n };\r\n });\r\n }\r\n\r\n public getLatestChangeset(): ChangesetProps {\r\n return this.getChangesetByIndex(this.latestChangesetIndex);\r\n }\r\n\r\n public getChangesetId(index: ChangesetIndex): ChangesetId {\r\n return this.getChangesetByIndex(index).id;\r\n }\r\n\r\n /** Get an array of changesets starting with first to last, by index */\r\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\r\n const changesets: ChangesetProps[] = [];\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\r\n });\r\n return changesets;\r\n }\r\n\r\n /** Name a version */\r\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\r\n stmt.bindString(1, arg.versionName);\r\n stmt.bindInteger(2, arg.csIndex);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Delete a named version */\r\n public deleteNamedVersion(versionName: string) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't delete named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** find the changeset for a named version */\r\n public findNamedVersion(versionName: string): ChangesetProps {\r\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\r\n return stmt.getValueInteger(0);\r\n });\r\n return this.getChangesetByIndex(index);\r\n }\r\n\r\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\r\n return `checkpoint-${csIndex}`;\r\n }\r\n\r\n /** \"upload\" a checkpoint */\r\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\r\n stmt.bindInteger(1, arg.changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== res)\r\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\r\n });\r\n db.saveChanges();\r\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\r\n IModelJsFs.copySync(arg.localFile, outName);\r\n return outName;\r\n }\r\n\r\n /** Get an array of the indexes for a range of checkpoints */\r\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n const checkpoints: ChangesetIndex[] = [];\r\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n checkpoints.push(stmt.getValueInteger(0));\r\n\r\n });\r\n return checkpoints;\r\n }\r\n\r\n /** Find the checkpoint that is no newer than a changesetIndex */\r\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\r\n if (changesetIndex <= 0)\r\n return 0;\r\n\r\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\r\n stmt.bindInteger(1, changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== res)\r\n throw new IModelError(res, \"can't get previous checkpoint\");\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** \"download\" a checkpoint */\r\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\r\n const index = this.getIndexFromChangeset(arg.changeset);\r\n const prev = this.queryPreviousCheckpoint(index);\r\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\r\n const changeset = this.getChangesetByIndex(index);\r\n return { index, id: changeset.id };\r\n }\r\n\r\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\r\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\r\n return arg;\r\n }\r\n\r\n /** \"download\" a changeset */\r\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\r\n const cs = this.getChangesetByIndex(arg.index);\r\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\r\n return this.copyChangeset(csProps);\r\n }\r\n\r\n /** \"download\" all the changesets in a given range */\r\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\r\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\r\n for (const cs of cSets) {\r\n cs.pathname = join(arg.targetDir, cs.id);\r\n this.copyChangeset(cs);\r\n }\r\n return cSets;\r\n }\r\n\r\n private querySharedLockHolders(elementId: Id64String) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const briefcases = new Set<BriefcaseId>();\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.add(stmt.getValueInteger(0));\r\n return briefcases;\r\n });\r\n }\r\n\r\n public queryAllLocks(briefcaseId: BriefcaseId) {\r\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\r\n const locks: LockProps[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\r\n });\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\r\n });\r\n return locks;\r\n }\r\n\r\n public queryLockStatus(elementId: Id64String): LockStatus {\r\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n return { state: LockState.None };\r\n const lastCsVal = stmt.getValue(0);\r\n const lock = {\r\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\r\n state: stmt.getValueInteger(1),\r\n };\r\n switch (lock.state) {\r\n case LockState.None:\r\n return lock;\r\n case LockState.Exclusive:\r\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\r\n case LockState.Shared:\r\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\r\n default:\r\n throw new Error(\"illegal lock state\");\r\n }\r\n });\r\n }\r\n\r\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\r\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\r\n\r\n const wantShared = props.state === LockState.Shared;\r\n if (wantShared && (currStatus.state === LockState.Exclusive))\r\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\r\n\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, props.state);\r\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert lock\");\r\n });\r\n\r\n if (wantShared) {\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert shared lock\");\r\n });\r\n }\r\n }\r\n\r\n private clearLock(id: Id64String) {\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't release lock\");\r\n });\r\n }\r\n\r\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\r\n if (index <= 0)\r\n return;\r\n\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n stmt.bindId(2, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't update lock changeSetId\");\r\n });\r\n }\r\n\r\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.None)\r\n throw new Error(\"cannot request lock for LockState.None\");\r\n\r\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\r\n\r\n const lockStatus = this.queryLockStatus(props.id);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n return this.reserveLock(lockStatus, props, briefcase);\r\n\r\n case LockState.Shared:\r\n if (props.state === LockState.Shared) {\r\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\r\n this.reserveLock(lockStatus, props, briefcase);\r\n } else {\r\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\r\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\r\n const id = lockStatus.sharedBy.values().next().value!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\r\n }\r\n this.removeSharedLock(props.id, briefcase.briefcaseId);\r\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\r\n }\r\n return;\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\r\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\r\n }\r\n }\r\n\r\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\r\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\r\n stmt.bindId(1, lockId);\r\n stmt.bindInteger(2, briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't remove shared lock\");\r\n });\r\n }\r\n\r\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const lockId = props.id;\r\n const lockStatus = this.queryLockStatus(lockId);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== arg.briefcaseId)\r\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\r\n this.updateLockChangeset(lockId, arg.changesetIndex);\r\n this.clearLock(lockId);\r\n break;\r\n\r\n case LockState.Shared:\r\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\r\n this.removeSharedLock(lockId, arg.briefcaseId);\r\n if (lockStatus.sharedBy.size === 1)\r\n this.clearLock(lockId);\r\n }\r\n }\r\n\r\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\r\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\r\n try {\r\n for (const lock of locks)\r\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\r\n this.db.saveChanges(); // only after all locks have been acquired\r\n } catch (err) {\r\n this.db.abandonChanges(); // abandon all locks that may have been acquired\r\n throw err;\r\n }\r\n }\r\n\r\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n const locks = new Map<Id64String, LockState>();\r\n locks.set(props.id, props.state);\r\n this.acquireLocks(locks, briefcase);\r\n }\r\n\r\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n for (const props of locks)\r\n this.releaseLock(props, arg);\r\n this.db.saveChanges();\r\n }\r\n\r\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const locks = this.queryAllLocks(arg.briefcaseId);\r\n this.releaseLocks(locks, arg);\r\n }\r\n\r\n private countTable(tableName: string): number {\r\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n // for debugging\r\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\r\n // for debugging\r\n public countLocks(): number { return this.countTable(\"locks\"); }\r\n\r\n // for debugging\r\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\r\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\r\n });\r\n return locks;\r\n }\r\n\r\n // for debugging\r\n public queryLocks(): LocksEntry[] {\r\n const locks: LocksEntry[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({\r\n id: stmt.getValueId(0),\r\n level: stmt.getValueInteger(1),\r\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\r\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\r\n });\r\n });\r\n return locks;\r\n }\r\n\r\n public removeDir(dirName: string) {\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n }\r\n public cleanup() {\r\n if (this._hubDb) {\r\n this._hubDb.closeDb();\r\n this._hubDb = undefined;\r\n }\r\n try {\r\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\r\n this.removeDir(this.rootDir);\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertyStore.js","sourceRoot":"","sources":["../../src/PropertyStore.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module SQLiteDb\r\n */\r\n\r\nimport { BlobContainer } from \"./BlobContainerService\";\r\nimport { CloudSqlite } from \"./CloudSqlite\";\r\nimport { VersionedSqliteDb } from \"./SQLiteDb\";\r\nimport { SettingsContainer } from \"./workspace/Settings\";\r\n\r\n/** @beta */\r\nexport namespace PropertyStore {\r\n\r\n /** The set of valid types for properties in a PropertyStore. */\r\n export type PropertyType = string | number | boolean | Uint8Array | SettingsContainer;\r\n /** The case-sensitive name of a Property. May not have leading or trailing spaces, and must be between 3 and 2048 characters long. */\r\n export type PropertyName = string;\r\n /** An array of PropertyName/PropertyType pairs to be stored in a PropertyStore. */\r\n export type PropertyArray = { name: PropertyName, value: PropertyType }[];\r\n /** The return status of an iteration function. The value \"stop\" causes the iteration to terminate. */\r\n export type IterationReturn = void | \"stop\";\r\n /** An iteration function over Properties in a PropertyStore. It is called with the name of a each Property. */\r\n export type PropertyIteration = (name: string) => IterationReturn;\r\n\r\n /** A filter used to limit and/or sort the values returned by an iteration. */\r\n export interface PropertyFilter {\r\n /** A value filter. May include wild cards when used with `GLOB` or `LIKE` */\r\n readonly value?: string;\r\n /** The comparison operator for `value`. Default is `=` */\r\n readonly valueCompare?: \"GLOB\" | \"LIKE\" | \"NOT GLOB\" | \"NOT LIKE\" | \"=\" | \"!=\" | \"<\" | \">\";\r\n /** Order results ascending or descending. If not supplied, the results are unordered (random). */\r\n readonly orderBy?: \"ASC\" | \"DESC\";\r\n /** An SQL expression to further filter results. This string is appended to the `WHERE` clause with an `AND` (that should not be part of the sqlExpression) */\r\n readonly sqlExpression?: string;\r\n }\r\n\r\n /**\r\n * A SQLite database for storing PropertyName/PropertyValue pairs.\r\n */\r\n export class PropertyDb extends VersionedSqliteDb {\r\n public override readonly myVersion = \"3.0.0\";\r\n\r\n protected override createDDL() {\r\n this.createTable({ tableName: \"properties\", columns: \"name TEXT NOT NULL PRIMARY KEY,type,value\", addTimestamp: true });\r\n }\r\n\r\n /** get the value of a Property by name.\r\n * @returns the property's value if it exists, `undefined` otherwise.\r\n */\r\n public getProperty(name: PropertyName): PropertyType | undefined {\r\n return this.withPreparedSqliteStatement(\"SELECT type,value from properties WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, name);\r\n if (!stmt.nextRow())\r\n return undefined;\r\n switch (stmt.getValueString(0)) {\r\n case \"string\":\r\n return stmt.getValueString(1);\r\n case \"boolean\":\r\n return stmt.getValueInteger(1) !== 0;\r\n case \"blob\":\r\n return stmt.getValueBlob(1);\r\n case \"number\":\r\n return stmt.getValueDouble(1);\r\n case \"object\":\r\n return JSON.parse(stmt.getValueString(1)) as SettingsContainer;\r\n }\r\n return undefined;\r\n });\r\n }\r\n /** Get the value of a string property by name.\r\n * @returns the property's value if it exists and is a string, `undefined` otherwise.\r\n */\r\n public getString(name: PropertyName, defaultValue: string): string;\r\n /** Get the value of a string property by name.\r\n * @returns the property's value if it exists and is a string, otherwise the supplied default value.\r\n */\r\n public getString(name: PropertyName): string | undefined;\r\n public getString(name: PropertyName, defaultValue?: string): string | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"string\" ? out : defaultValue;\r\n }\r\n /** Get the value of a boolean property by name.\r\n * @returns the property's value if it exists and is a boolean, `undefined` otherwise.\r\n */\r\n public getBoolean(name: PropertyName): boolean | undefined;\r\n /** Get the value of a boolean property by name.\r\n * @returns the property's value if it exists and is a boolean, otherwise the supplied default value.\r\n */\r\n public getBoolean(name: PropertyName, defaultValue: boolean): boolean;\r\n public getBoolean(name: PropertyName, defaultValue?: boolean): boolean | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"boolean\" ? out : defaultValue;\r\n }\r\n /** Get the value of a number property by name.\r\n * @returns the property's value if it exists and is a number, `undefined` otherwise.\r\n */\r\n public getNumber(name: PropertyName): number | undefined;\r\n /** Get the value of a number property by name.\r\n * @returns the property's value if it exists and is a number, otherwise the supplied default value.\r\n */\r\n public getNumber(name: PropertyName, defaultValue: number): number;\r\n public getNumber(name: PropertyName, defaultValue?: number): number | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"number\" ? out : defaultValue;\r\n }\r\n /** Get the value of a blob property by name.\r\n * @returns the property's value if it exists and is a blob, `undefined` otherwise.\r\n */\r\n public getBlob(name: PropertyName): Uint8Array | undefined;\r\n /** Get the value of a blob property by name.\r\n * @returns the property's value if it exists and is a blob, otherwise the supplied default value.\r\n */\r\n public getBlob(name: PropertyName, defaultValue: Uint8Array): Uint8Array;\r\n public getBlob(name: PropertyName, defaultValue?: Uint8Array): Uint8Array | undefined {\r\n const out = this.getProperty(name);\r\n return out instanceof Uint8Array ? out : defaultValue;\r\n }\r\n /** Get the value of an object property by name.\r\n * @returns the property's value if it exists and is an object, `undefined` otherwise.\r\n */\r\n public getObject(name: PropertyName): SettingsContainer | undefined;\r\n /** Get the value of an object property by name.\r\n * @returns the property's value if it exists and is an object, otherwise the supplied default value.\r\n */\r\n public getObject(name: PropertyName, defaultValue: SettingsContainer): SettingsContainer;\r\n public getObject(name: PropertyName, defaultValue?: SettingsContainer): SettingsContainer | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"object\" ? out as SettingsContainer : defaultValue;\r\n }\r\n\r\n /** call an iteration function for each property, optionally applying a filter */\r\n public forAllProperties(iter: PropertyIteration, filter?: PropertyFilter) {\r\n let sql = \"SELECT name FROM properties WHERE name IS NOT NULL\";\r\n if (filter?.sqlExpression)\r\n sql += ` AND ${filter.sqlExpression} `;\r\n if (filter?.value)\r\n sql += ` AND name ${filter.valueCompare ?? \"=\"} @val`;\r\n if (filter?.orderBy)\r\n sql += ` ORDER BY name ${filter.orderBy} `;\r\n\r\n this.withSqliteStatement(sql, (stmt) => {\r\n if (filter?.value)\r\n stmt.bindString(\"@val\", filter.value);\r\n\r\n while (stmt.nextRow()) {\r\n if (iter(stmt.getValueString(0)) === \"stop\")\r\n return;\r\n }\r\n });\r\n }\r\n\r\n /** Delete a single property from this PropertyDb. If the value does not exist, this method does nothing.\r\n * @note the database must be opened for write\r\n */\r\n public async deleteProperty(propName: PropertyName) {\r\n this.withSqliteStatement(\"DELETE from properties WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, propName);\r\n stmt.stepForWrite();\r\n });\r\n }\r\n /** Delete an array of properties from this PropertyDb. Any value that does not exist is ignored.\r\n * @note the database must be opened for write\r\n */\r\n public async deleteProperties(propNames: PropertyName[]) {\r\n propNames.forEach(async (name) => this.deleteProperty(name));\r\n }\r\n\r\n private validateName(name: PropertyName) {\r\n if (typeof name !== \"string\" || name.trim() !== name || name.length > 2 * 1024 || name.length < 2)\r\n throw new Error(`illegal property name[${name}]`);\r\n }\r\n\r\n /** Save a single property in this PropertyDb. If the property already exists, its value is overwritten.\r\n * @note the database must be opened for write\r\n */\r\n public async saveProperty(name: PropertyName, value: PropertyType) {\r\n this.validateName(name);\r\n this.withSqliteStatement(\"INSERT OR REPLACE INTO properties(name,type,value) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindString(1, name);\r\n switch (typeof value) {\r\n case \"string\":\r\n stmt.bindString(2, \"string\");\r\n stmt.bindString(3, value);\r\n break;\r\n case \"boolean\":\r\n stmt.bindString(2, \"boolean\");\r\n stmt.bindInteger(3, value ? 1 : 0);\r\n break;\r\n case \"number\":\r\n stmt.bindString(2, \"number\");\r\n stmt.bindDouble(3, value);\r\n break;\r\n case \"object\":\r\n if (value instanceof Uint8Array) {\r\n stmt.bindString(2, \"blob\");\r\n stmt.bindBlob(3, value);\r\n } else {\r\n stmt.bindString(2, \"object\");\r\n stmt.bindString(3, JSON.stringify(value));\r\n }\r\n break;\r\n default:\r\n throw new Error(\"illegal property value type\");\r\n }\r\n\r\n stmt.stepForWrite();\r\n });\r\n }\r\n\r\n /** Save an array of properties in this PropertyDb. If a property already exists, its value is overwritten.\r\n * @note the database must be opened for write\r\n */\r\n public async saveProperties(props: PropertyArray) {\r\n for (const prop of props)\r\n await this.saveProperty(prop.name, prop.value);\r\n }\r\n }\r\n\r\n const defaultDbName = \"PropertyDb\" as const;\r\n\r\n export interface CreateNewContainerProps {\r\n scope: BlobContainer.Scope;\r\n metadata: Omit<BlobContainer.Metadata, \"containerType\">;\r\n }\r\n\r\n /**\r\n * Provides access to a cloud-based `PropertyDb` to hold a set of values of type `PropertyType`, each with a unique `PropertyName`.\r\n * `PropertyStore.PropertyDb`s that are stored in cloud containers require an access token that grants permission to read and/or write them.\r\n * All write operations will fail without an access token that grants write permission.\r\n *\r\n * The database is cached on a local drive so reads are fast and inexpensive, and may even be done offline after a prefetch.\r\n * However, that means that callers are responsible for synchronizing the local cache to ensure it includes changes\r\n * made by others, as appropriate (see [[synchronizeWithCloud]]).\r\n */\r\n export class CloudAccess extends CloudSqlite.DbAccess<PropertyDb> {\r\n public constructor(props: CloudSqlite.ContainerAccessProps) {\r\n super({ dbType: PropertyDb, props, dbName: defaultDbName });\r\n }\r\n\r\n /**\r\n * Initialize a cloud container for use as a PropertyStore. This method is called by [[createNewContainer]].\r\n * It is only necessary to convert an existing container to a PropertyStore container.\r\n * @note this deletes any existing content in the container.\r\n * @internal\r\n */\r\n public static async initializeDb(args: { props: CloudSqlite.ContainerProps }) {\r\n return super._initializeDb({ ...args, dbType: PropertyDb, dbName: defaultDbName });\r\n }\r\n\r\n /** Create and initialize a new BlobContainer to hold a PropertyStore\r\n * @note the current user must have administrator rights to create containers.\r\n */\r\n public static async createNewContainer(args: CreateNewContainerProps): Promise<CloudSqlite.ContainerProps> {\r\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: \"property-store\" } });\r\n await this.initializeDb({ props });\r\n return props;\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PropertyStore.js","sourceRoot":"","sources":["../../src/PropertyStore.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module SQLiteDb\r\n */\r\n\r\nimport { BlobContainer } from \"./BlobContainerService\";\r\nimport { CloudSqlite } from \"./CloudSqlite\";\r\nimport { VersionedSqliteDb } from \"./SQLiteDb\";\r\nimport { SettingsContainer } from \"./workspace/Settings\";\r\n\r\n/** @beta */\r\nexport namespace PropertyStore {\r\n\r\n /** The set of valid types for properties in a PropertyStore. */\r\n export type PropertyType = string | number | boolean | Uint8Array | SettingsContainer;\r\n /** The case-sensitive name of a Property. May not have leading or trailing spaces, and must be between 3 and 2048 characters long. */\r\n export type PropertyName = string;\r\n /** An array of PropertyName/PropertyType pairs to be stored in a PropertyStore. */\r\n export type PropertyArray = { name: PropertyName, value: PropertyType }[];\r\n /** The return status of an iteration function. The value \"stop\" causes the iteration to terminate. */\r\n export type IterationReturn = void | \"stop\";\r\n /** An iteration function over Properties in a PropertyStore. It is called with the name of a each Property. */\r\n export type PropertyIteration = (name: string) => IterationReturn;\r\n\r\n /** A filter used to limit and/or sort the values returned by an iteration. */\r\n export interface PropertyFilter {\r\n /** A value filter. May include wild cards when used with `GLOB` or `LIKE` */\r\n readonly value?: string;\r\n /** The comparison operator for `value`. Default is `=` */\r\n readonly valueCompare?: \"GLOB\" | \"LIKE\" | \"NOT GLOB\" | \"NOT LIKE\" | \"=\" | \"!=\" | \"<\" | \">\";\r\n /** Order results ascending or descending. If not supplied, the results are unordered (random). */\r\n readonly orderBy?: \"ASC\" | \"DESC\";\r\n /** An SQL expression to further filter results. This string is appended to the `WHERE` clause with an `AND` (that should not be part of the sqlExpression) */\r\n readonly sqlExpression?: string;\r\n }\r\n\r\n /**\r\n * A SQLite database for storing PropertyName/PropertyValue pairs.\r\n */\r\n export class PropertyDb extends VersionedSqliteDb {\r\n public override readonly myVersion = \"3.0.0\";\r\n\r\n protected override createDDL() {\r\n this.createTable({ tableName: \"properties\", columns: \"name TEXT NOT NULL PRIMARY KEY,type,value\", addTimestamp: true });\r\n }\r\n\r\n /** get the value of a Property by name.\r\n * @returns the property's value if it exists, `undefined` otherwise.\r\n */\r\n public getProperty(name: PropertyName): PropertyType | undefined {\r\n return this.withPreparedSqliteStatement(\"SELECT type,value from properties WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, name);\r\n if (!stmt.nextRow())\r\n return undefined;\r\n switch (stmt.getValueString(0)) {\r\n case \"string\":\r\n return stmt.getValueString(1);\r\n case \"boolean\":\r\n return stmt.getValueInteger(1) !== 0;\r\n case \"blob\":\r\n return stmt.getValueBlob(1);\r\n case \"number\":\r\n return stmt.getValueDouble(1);\r\n case \"object\":\r\n return JSON.parse(stmt.getValueString(1)) as SettingsContainer;\r\n }\r\n return undefined;\r\n });\r\n }\r\n /** Get the value of a string property by name.\r\n * @returns the property's value if it exists and is a string, `undefined` otherwise.\r\n */\r\n public getString(name: PropertyName, defaultValue: string): string;\r\n /** Get the value of a string property by name.\r\n * @returns the property's value if it exists and is a string, otherwise the supplied default value.\r\n */\r\n public getString(name: PropertyName): string | undefined;\r\n public getString(name: PropertyName, defaultValue?: string): string | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"string\" ? out : defaultValue;\r\n }\r\n /** Get the value of a boolean property by name.\r\n * @returns the property's value if it exists and is a boolean, `undefined` otherwise.\r\n */\r\n public getBoolean(name: PropertyName): boolean | undefined;\r\n /** Get the value of a boolean property by name.\r\n * @returns the property's value if it exists and is a boolean, otherwise the supplied default value.\r\n */\r\n public getBoolean(name: PropertyName, defaultValue: boolean): boolean;\r\n public getBoolean(name: PropertyName, defaultValue?: boolean): boolean | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"boolean\" ? out : defaultValue;\r\n }\r\n /** Get the value of a number property by name.\r\n * @returns the property's value if it exists and is a number, `undefined` otherwise.\r\n */\r\n public getNumber(name: PropertyName): number | undefined;\r\n /** Get the value of a number property by name.\r\n * @returns the property's value if it exists and is a number, otherwise the supplied default value.\r\n */\r\n public getNumber(name: PropertyName, defaultValue: number): number;\r\n public getNumber(name: PropertyName, defaultValue?: number): number | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"number\" ? out : defaultValue;\r\n }\r\n /** Get the value of a blob property by name.\r\n * @returns the property's value if it exists and is a blob, `undefined` otherwise.\r\n */\r\n public getBlob(name: PropertyName): Uint8Array | undefined;\r\n /** Get the value of a blob property by name.\r\n * @returns the property's value if it exists and is a blob, otherwise the supplied default value.\r\n */\r\n public getBlob(name: PropertyName, defaultValue: Uint8Array): Uint8Array;\r\n public getBlob(name: PropertyName, defaultValue?: Uint8Array): Uint8Array | undefined {\r\n const out = this.getProperty(name);\r\n return out instanceof Uint8Array ? out : defaultValue;\r\n }\r\n /** Get the value of an object property by name.\r\n * @returns the property's value if it exists and is an object, `undefined` otherwise.\r\n */\r\n public getObject(name: PropertyName): SettingsContainer | undefined;\r\n /** Get the value of an object property by name.\r\n * @returns the property's value if it exists and is an object, otherwise the supplied default value.\r\n */\r\n public getObject(name: PropertyName, defaultValue: SettingsContainer): SettingsContainer;\r\n public getObject(name: PropertyName, defaultValue?: SettingsContainer): SettingsContainer | undefined {\r\n const out = this.getProperty(name);\r\n return typeof out === \"object\" ? out as SettingsContainer : defaultValue;\r\n }\r\n\r\n /** call an iteration function for each property, optionally applying a filter */\r\n public forAllProperties(iter: PropertyIteration, filter?: PropertyFilter) {\r\n let sql = \"SELECT name FROM properties WHERE name IS NOT NULL\";\r\n if (filter?.sqlExpression)\r\n sql += ` AND ${filter.sqlExpression} `;\r\n if (filter?.value)\r\n sql += ` AND name ${filter.valueCompare ?? \"=\"} @val`;\r\n if (filter?.orderBy)\r\n sql += ` ORDER BY name ${filter.orderBy} `;\r\n\r\n this.withSqliteStatement(sql, (stmt) => {\r\n if (filter?.value)\r\n stmt.bindString(\"@val\", filter.value);\r\n\r\n while (stmt.nextRow()) {\r\n if (iter(stmt.getValueString(0)) === \"stop\")\r\n return;\r\n }\r\n });\r\n }\r\n\r\n /** Delete a single property from this PropertyDb. If the value does not exist, this method does nothing.\r\n * @note the database must be opened for write\r\n */\r\n public async deleteProperty(propName: PropertyName) {\r\n this.withSqliteStatement(\"DELETE from properties WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, propName);\r\n stmt.stepForWrite();\r\n });\r\n }\r\n /** Delete an array of properties from this PropertyDb. Any value that does not exist is ignored.\r\n * @note the database must be opened for write\r\n */\r\n public async deleteProperties(propNames: PropertyName[]) {\r\n propNames.forEach(async (name) => this.deleteProperty(name));\r\n }\r\n\r\n private validateName(name: PropertyName) {\r\n if (typeof name !== \"string\" || name.trim() !== name || name.length > 2 * 1024 || name.length < 2)\r\n throw new Error(`illegal property name[${name}]`);\r\n }\r\n\r\n /** Save a single property in this PropertyDb. If the property already exists, its value is overwritten.\r\n * @note the database must be opened for write\r\n */\r\n public async saveProperty(name: PropertyName, value: PropertyType) {\r\n this.validateName(name);\r\n this.withSqliteStatement(\"INSERT OR REPLACE INTO properties(name,type,value) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindString(1, name);\r\n switch (typeof value) {\r\n case \"string\":\r\n stmt.bindString(2, \"string\");\r\n stmt.bindString(3, value);\r\n break;\r\n case \"boolean\":\r\n stmt.bindString(2, \"boolean\");\r\n stmt.bindInteger(3, value ? 1 : 0);\r\n break;\r\n case \"number\":\r\n stmt.bindString(2, \"number\");\r\n stmt.bindDouble(3, value);\r\n break;\r\n case \"object\":\r\n if (value instanceof Uint8Array) {\r\n stmt.bindString(2, \"blob\");\r\n stmt.bindBlob(3, value);\r\n } else {\r\n stmt.bindString(2, \"object\");\r\n stmt.bindString(3, JSON.stringify(value));\r\n }\r\n break;\r\n default:\r\n throw new Error(\"illegal property value type\");\r\n }\r\n\r\n stmt.stepForWrite();\r\n });\r\n }\r\n\r\n /** Save an array of properties in this PropertyDb. If a property already exists, its value is overwritten.\r\n * @note the database must be opened for write\r\n */\r\n public async saveProperties(props: PropertyArray) {\r\n for (const prop of props)\r\n await this.saveProperty(prop.name, prop.value);\r\n }\r\n }\r\n\r\n const defaultDbName = \"PropertyDb\";\r\n\r\n export interface CreateNewContainerProps {\r\n scope: BlobContainer.Scope;\r\n metadata: Omit<BlobContainer.Metadata, \"containerType\">;\r\n }\r\n\r\n /**\r\n * Provides access to a cloud-based `PropertyDb` to hold a set of values of type `PropertyType`, each with a unique `PropertyName`.\r\n * `PropertyStore.PropertyDb`s that are stored in cloud containers require an access token that grants permission to read and/or write them.\r\n * All write operations will fail without an access token that grants write permission.\r\n *\r\n * The database is cached on a local drive so reads are fast and inexpensive, and may even be done offline after a prefetch.\r\n * However, that means that callers are responsible for synchronizing the local cache to ensure it includes changes\r\n * made by others, as appropriate (see [[synchronizeWithCloud]]).\r\n */\r\n export class CloudAccess extends CloudSqlite.DbAccess<PropertyDb> {\r\n public constructor(props: CloudSqlite.ContainerAccessProps) {\r\n super({ dbType: PropertyDb, props, dbName: defaultDbName });\r\n }\r\n\r\n /**\r\n * Initialize a cloud container for use as a PropertyStore. This method is called by [[createNewContainer]].\r\n * It is only necessary to convert an existing container to a PropertyStore container.\r\n * @note this deletes any existing content in the container.\r\n * @internal\r\n */\r\n public static async initializeDb(args: { props: CloudSqlite.ContainerProps }) {\r\n return super._initializeDb({ ...args, dbType: PropertyDb, dbName: defaultDbName });\r\n }\r\n\r\n /** Create and initialize a new BlobContainer to hold a PropertyStore\r\n * @note the current user must have administrator rights to create containers.\r\n */\r\n public static async createNewContainer(args: CreateNewContainerProps): Promise<CloudSqlite.ContainerProps> {\r\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: \"property-store\" } });\r\n await this.initializeDb({ props });\r\n return props;\r\n }\r\n }\r\n}\r\n"]}
|
package/lib/cjs/RpcBackend.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module RpcInterface
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.initializeRpcBackend =
|
|
10
|
+
exports.initializeRpcBackend = initializeRpcBackend;
|
|
11
11
|
const core_common_1 = require("@itwin/core-common");
|
|
12
12
|
const multipart_1 = require("./rpc/multipart");
|
|
13
13
|
const tracing_1 = require("./rpc/tracing");
|
|
@@ -29,5 +29,4 @@ function initializeRpcBackend(enableOpenTelemetry = false) {
|
|
|
29
29
|
core_common_1.WebAppRpcLogging.initializeBackend(new logging_1.WebAppRpcLoggingBackend());
|
|
30
30
|
initialized = true;
|
|
31
31
|
}
|
|
32
|
-
exports.initializeRpcBackend = initializeRpcBackend;
|
|
33
32
|
//# sourceMappingURL=RpcBackend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcBackend.js","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG
|
|
1
|
+
{"version":3,"file":"RpcBackend.js","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AAaH,oDAgBC;AA3BD,oDAAsF;AACtF,+CAAsG;AACtG,2CAAkD;AAClD,+CAA4D;AAC5D,+CAAiD;AACjD,iDAAkD;AAElD,4CAA4C;AAE5C,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,gBAAgB;AAChB,SAAgB,oBAAoB,CAAC,sBAA+B,KAAK;IACvE,IAAI,WAAW;QACb,OAAO;IAET,IAAA,2BAAiB,EAAC,mBAAmB,CAAC,CAAC;IAEvC,0BAAY,CAAC,QAAQ,CAAC,YAAY,GAAG,iCAAqB,CAAC;IAC3D,0BAAY,CAAC,QAAQ,CAAC,YAAY,GAAG,iCAAqB,CAAC;IAC3D,0BAAY,CAAC,QAAQ,CAAC,YAAY,GAAG,iCAAqB,CAAC;IAE3D,8BAAgB,CAAC,OAAO,CAAC,YAAY,GAAG,uBAAY,CAAC;IACrD,8BAAgB,CAAC,OAAO,CAAC,YAAY,GAAG,sBAAY,CAAC;IAErD,8BAAgB,CAAC,iBAAiB,CAAC,IAAI,iCAAuB,EAAE,CAAC,CAAC;IAElE,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport { RpcMultipart, WebAppRpcLogging, WebAppRpcRequest } from \"@itwin/core-common\";\r\nimport { appendToMultipartForm, createMultipartStream, parseMultipartRequest } from \"./rpc/multipart\";\r\nimport { initializeTracing } from \"./rpc/tracing\";\r\nimport { WebAppRpcLoggingBackend } from \"./rpc/web/logging\";\r\nimport { parseRequest } from \"./rpc/web/request\";\r\nimport { sendResponse } from \"./rpc/web/response\";\r\n\r\n/* eslint-disable deprecation/deprecation */\r\n\r\nlet initialized = false;\r\n/** @internal */\r\nexport function initializeRpcBackend(enableOpenTelemetry: boolean = false) {\r\n if (initialized)\r\n return;\r\n\r\n initializeTracing(enableOpenTelemetry);\r\n\r\n RpcMultipart.platform.createStream = createMultipartStream;\r\n RpcMultipart.platform.parseRequest = parseMultipartRequest;\r\n RpcMultipart.platform.appendToForm = appendToMultipartForm;\r\n\r\n WebAppRpcRequest.backend.sendResponse = sendResponse;\r\n WebAppRpcRequest.backend.parseRequest = parseRequest;\r\n\r\n WebAppRpcLogging.initializeBackend(new WebAppRpcLoggingBackend());\r\n\r\n initialized = true;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaSync.d.ts","sourceRoot":"","sources":["../../src/SchemaSync.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAY,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAe,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKhE,gBAAgB;AAChB,yBAAiB,UAAU,CAAC;IAG1B,kFAAkF;IAClF,MAAa,YAAa,SAAQ,iBAAiB;QACjD,SAAyB,SAAS,WAAW;kBAC1B,SAAS;KAC7B;IAMM,MAAM,YAAY,WAAY,QAAQ,cAAc,MAAM,SAKhE,CAAC;IA+BK,MAAM,gBAAgB,WAAkB,QAAQ,GAAG;QAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,QAAQ;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,
|
|
1
|
+
{"version":3,"file":"SchemaSync.d.ts","sourceRoot":"","sources":["../../src/SchemaSync.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAY,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAe,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKhE,gBAAgB;AAChB,yBAAiB,UAAU,CAAC;IAG1B,kFAAkF;IAClF,MAAa,YAAa,SAAQ,iBAAiB;QACjD,SAAyB,SAAS,WAAW;kBAC1B,SAAS;KAC7B;IAMM,MAAM,YAAY,WAAY,QAAQ,cAAc,MAAM,SAKhE,CAAC;IA+BK,MAAM,gBAAgB,WAAkB,QAAQ,GAAG;QAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,QAAQ;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,aAAa,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAOpO,CAAC;IAEK,MAAM,kBAAkB,WAAkB,QAAQ,GAAG;QAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,aAAa,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CASjK,CAAC;IAEK,MAAM,SAAS,WAAY,QAAQ,YAEzC,CAAC;IAEF,+DAA+D;IACxD,MAAM,IAAI,WAAkB,QAAQ,kBAS1C,CAAC;IAEK,MAAM,mBAAmB,QAAe;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,kBA6B3I,CAAC;IAEF,0EAA0E;IAC1E,MAAa,WAAY,SAAQ,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAC9C,KAAK,EAAE,WAAW,CAAC,oBAAoB;QAInD,MAAM;QAGb;;;;SAIC;eACmB,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,cAAc;KAGnE;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaSync.js","sourceRoot":"","sources":["../../src/SchemaSync.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module SQLiteDb\r\n */\r\n\r\nimport { CloudSqlite } from \"./CloudSqlite\";\r\nimport { VersionedSqliteDb } from \"./SQLiteDb\";\r\nimport { BriefcaseDb, IModelDb } from \"./IModelDb\";\r\nimport { DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelError, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { IModelNative } from \"./internal/NativePlatform\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\n\r\n/** @internal */\r\nexport namespace SchemaSync {\r\n const lockParams: CloudSqlite.ObtainLockParams = { retryDelayMs: 1000, nRetries: 30 };\r\n\r\n /** A CloudSqlite database for synchronizing schema changes across briefcases. */\r\n export class SchemaSyncDb extends VersionedSqliteDb {\r\n public override readonly myVersion = \"4.0.0\";\r\n protected override createDDL() { }\r\n }\r\n\r\n const syncProperty = { namespace: \"itwinjs\", name: \"SchemaSync\" };\r\n const defaultDbName = \"SchemaSyncDb\" as const;\r\n const testSyncCachePropKey = \"test.schema_sync.cache_name\" as const;\r\n // for tests only\r\n export const setTestCache = (iModel: IModelDb, cacheName?: string) => {\r\n if (cacheName)\r\n iModel[_nativeDb].saveLocalValue(testSyncCachePropKey, cacheName);\r\n else\r\n iModel[_nativeDb].deleteLocalValue(testSyncCachePropKey);\r\n };\r\n\r\n const getCloudAccess = async (arg: IModelDb | { readonly fileName: LocalFileName }) => {\r\n let nativeDb: IModelJsNative.DgnDb | undefined;\r\n const argIsIModelDb = arg instanceof IModelDb;\r\n if (argIsIModelDb) {\r\n nativeDb = arg[_nativeDb];\r\n } else {\r\n nativeDb = new IModelNative.platform.DgnDb();\r\n nativeDb.openIModel(arg.fileName, OpenMode.Readonly);\r\n }\r\n\r\n const propsString = nativeDb.queryFileProperty(syncProperty, true) as string | undefined;\r\n if (!propsString)\r\n throw new Error(\"iModel does not have a SchemaSyncDb\");\r\n try {\r\n const props = JSON.parse(propsString) as CloudSqlite.ContainerProps;\r\n const accessToken = await CloudSqlite.requestToken(props);\r\n const access = new CloudAccess({ ...props, accessToken });\r\n Object.assign(access.lockParams, lockParams);\r\n const testSyncCache = nativeDb.queryLocalValue(testSyncCachePropKey);\r\n if (testSyncCache)\r\n access.setCache(CloudSqlite.CloudCaches.getCache({ cacheName: testSyncCache }));\r\n return access;\r\n } finally {\r\n if (!argIsIModelDb) {\r\n nativeDb.closeFile();\r\n }\r\n }\r\n };\r\n\r\n export const withLockedAccess = async (iModel: IModelDb | { readonly fileName: LocalFileName }, args: { operationName: string, openMode?: OpenMode, user?: string }, operation: (access: CloudAccess) => Promise<void>): Promise<void> => {\r\n const access = await getCloudAccess(iModel);\r\n try {\r\n await access.withLockedDb(args, async () => operation(access));\r\n } finally {\r\n access.close();\r\n }\r\n };\r\n\r\n export const withReadonlyAccess = async (iModel: IModelDb | { readonly fileName: LocalFileName }, operation: (access: CloudAccess) => Promise<void>): Promise<void> => {\r\n const access = await getCloudAccess(iModel);\r\n access.synchronizeWithCloud();\r\n access.openForRead();\r\n try {\r\n await operation(access);\r\n } finally {\r\n access.close();\r\n }\r\n };\r\n\r\n export const isEnabled = (iModel: IModelDb) => {\r\n return iModel[_nativeDb].schemaSyncEnabled();\r\n };\r\n\r\n /** Synchronize local briefcase schemas with cloud container */\r\n export const pull = async (iModel: IModelDb) => {\r\n if (iModel[_nativeDb].schemaSyncEnabled() && !iModel.isReadonly) {\r\n await SchemaSync.withReadonlyAccess(iModel, async (syncAccess) => {\r\n const schemaSyncDbUri = syncAccess.getUri();\r\n iModel.clearCaches();\r\n iModel[_nativeDb].schemaSyncPull(schemaSyncDbUri);\r\n iModel.saveChanges(\"schema synchronized with cloud container\");\r\n });\r\n }\r\n };\r\n\r\n export const initializeForIModel = async (arg: { iModel: IModelDb, containerProps: CloudSqlite.ContainerProps, overrideContainer?: boolean }) => {\r\n const props = { baseUri: arg.containerProps.baseUri, containerId: arg.containerProps.containerId, storageType: arg.containerProps.storageType }; // sanitize to only known properties\r\n const iModel = arg.iModel;\r\n const briefcase = iModel instanceof BriefcaseDb ? iModel : undefined;\r\n await iModel.acquireSchemaLock();\r\n if (briefcase) {\r\n if (briefcase.txns.hasLocalChanges) {\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"Enabling SchemaSync for iModel failed. There are unsaved or un-pushed local changes.\");\r\n }\r\n await briefcase.pullChanges();\r\n }\r\n try {\r\n iModel.saveFileProperty(syncProperty, JSON.stringify(props));\r\n await withLockedAccess(arg.iModel, { operationName: \"initialize schemaSync\", openMode: OpenMode.Readonly }, async (syncAccess) => {\r\n iModel[_nativeDb].schemaSyncInit(syncAccess.getUri(), props.containerId, arg.overrideContainer ?? false);\r\n iModel.saveChanges(`Enable SchemaSync (container id: ${props.containerId})`);\r\n });\r\n } catch (err) {\r\n throw err;\r\n } finally {\r\n iModel.abandonChanges();\r\n }\r\n\r\n if (briefcase) {\r\n if (arg.overrideContainer)\r\n await briefcase.pushChanges({ description: `Overriding SchemaSync for iModel with container-id: ${props.containerId}` });\r\n else\r\n await briefcase.pushChanges({ description: `Enable SchemaSync for iModel with container-id: ${props.containerId}` });\r\n }\r\n };\r\n\r\n /** Provides access to a cloud-based `SchemaSyncDb` to hold ECSchemas. */\r\n export class CloudAccess extends CloudSqlite.DbAccess<SchemaSyncDb> {\r\n public constructor(props: CloudSqlite.ContainerAccessProps) {\r\n super({ dbType: SchemaSyncDb, props, dbName: defaultDbName });\r\n }\r\n\r\n public getUri() {\r\n return `${this.getCloudDb()[_nativeDb].getFilePath()}?vfs=${this.container.cache?.name}&writable=${this.container.isWriteable ? 1 : 0}`;\r\n }\r\n /**\r\n * Initialize a cloud container for use as a SchemaSync. The container must first be created via its storage supplier api (e.g. Azure, or AWS).\r\n * A valid sasToken that grants write access must be supplied. This function creates and uploads an empty ChannelDb into the container.\r\n * @note this deletes any existing content in the container.\r\n */\r\n public static async initializeDb(props: CloudSqlite.ContainerProps) {\r\n return super._initializeDb({ props, dbType: SchemaSyncDb, dbName: defaultDbName });\r\n }\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"SchemaSync.js","sourceRoot":"","sources":["../../src/SchemaSync.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module SQLiteDb\r\n */\r\n\r\nimport { CloudSqlite } from \"./CloudSqlite\";\r\nimport { VersionedSqliteDb } from \"./SQLiteDb\";\r\nimport { BriefcaseDb, IModelDb } from \"./IModelDb\";\r\nimport { DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelError, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { IModelNative } from \"./internal/NativePlatform\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\n\r\n/** @internal */\r\nexport namespace SchemaSync {\r\n const lockParams: CloudSqlite.ObtainLockParams = { retryDelayMs: 1000, nRetries: 30 };\r\n\r\n /** A CloudSqlite database for synchronizing schema changes across briefcases. */\r\n export class SchemaSyncDb extends VersionedSqliteDb {\r\n public override readonly myVersion = \"4.0.0\";\r\n protected override createDDL() { }\r\n }\r\n\r\n const syncProperty = { namespace: \"itwinjs\", name: \"SchemaSync\" };\r\n const defaultDbName = \"SchemaSyncDb\";\r\n const testSyncCachePropKey = \"test.schema_sync.cache_name\";\r\n // for tests only\r\n export const setTestCache = (iModel: IModelDb, cacheName?: string) => {\r\n if (cacheName)\r\n iModel[_nativeDb].saveLocalValue(testSyncCachePropKey, cacheName);\r\n else\r\n iModel[_nativeDb].deleteLocalValue(testSyncCachePropKey);\r\n };\r\n\r\n const getCloudAccess = async (arg: IModelDb | { readonly fileName: LocalFileName }) => {\r\n let nativeDb: IModelJsNative.DgnDb | undefined;\r\n const argIsIModelDb = arg instanceof IModelDb;\r\n if (argIsIModelDb) {\r\n nativeDb = arg[_nativeDb];\r\n } else {\r\n nativeDb = new IModelNative.platform.DgnDb();\r\n nativeDb.openIModel(arg.fileName, OpenMode.Readonly);\r\n }\r\n\r\n const propsString = nativeDb.queryFileProperty(syncProperty, true) as string | undefined;\r\n if (!propsString)\r\n throw new Error(\"iModel does not have a SchemaSyncDb\");\r\n try {\r\n const props = JSON.parse(propsString) as CloudSqlite.ContainerProps;\r\n const accessToken = await CloudSqlite.requestToken(props);\r\n const access = new CloudAccess({ ...props, accessToken });\r\n Object.assign(access.lockParams, lockParams);\r\n const testSyncCache = nativeDb.queryLocalValue(testSyncCachePropKey);\r\n if (testSyncCache)\r\n access.setCache(CloudSqlite.CloudCaches.getCache({ cacheName: testSyncCache }));\r\n return access;\r\n } finally {\r\n if (!argIsIModelDb) {\r\n nativeDb.closeFile();\r\n }\r\n }\r\n };\r\n\r\n export const withLockedAccess = async (iModel: IModelDb | { readonly fileName: LocalFileName }, args: { operationName: string, openMode?: OpenMode, user?: string }, operation: (access: CloudAccess) => Promise<void>): Promise<void> => {\r\n const access = await getCloudAccess(iModel);\r\n try {\r\n await access.withLockedDb(args, async () => operation(access));\r\n } finally {\r\n access.close();\r\n }\r\n };\r\n\r\n export const withReadonlyAccess = async (iModel: IModelDb | { readonly fileName: LocalFileName }, operation: (access: CloudAccess) => Promise<void>): Promise<void> => {\r\n const access = await getCloudAccess(iModel);\r\n access.synchronizeWithCloud();\r\n access.openForRead();\r\n try {\r\n await operation(access);\r\n } finally {\r\n access.close();\r\n }\r\n };\r\n\r\n export const isEnabled = (iModel: IModelDb) => {\r\n return iModel[_nativeDb].schemaSyncEnabled();\r\n };\r\n\r\n /** Synchronize local briefcase schemas with cloud container */\r\n export const pull = async (iModel: IModelDb) => {\r\n if (iModel[_nativeDb].schemaSyncEnabled() && !iModel.isReadonly) {\r\n await SchemaSync.withReadonlyAccess(iModel, async (syncAccess) => {\r\n const schemaSyncDbUri = syncAccess.getUri();\r\n iModel.clearCaches();\r\n iModel[_nativeDb].schemaSyncPull(schemaSyncDbUri);\r\n iModel.saveChanges(\"schema synchronized with cloud container\");\r\n });\r\n }\r\n };\r\n\r\n export const initializeForIModel = async (arg: { iModel: IModelDb, containerProps: CloudSqlite.ContainerProps, overrideContainer?: boolean }) => {\r\n const props = { baseUri: arg.containerProps.baseUri, containerId: arg.containerProps.containerId, storageType: arg.containerProps.storageType }; // sanitize to only known properties\r\n const iModel = arg.iModel;\r\n const briefcase = iModel instanceof BriefcaseDb ? iModel : undefined;\r\n await iModel.acquireSchemaLock();\r\n if (briefcase) {\r\n if (briefcase.txns.hasLocalChanges) {\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, \"Enabling SchemaSync for iModel failed. There are unsaved or un-pushed local changes.\");\r\n }\r\n await briefcase.pullChanges();\r\n }\r\n try {\r\n iModel.saveFileProperty(syncProperty, JSON.stringify(props));\r\n await withLockedAccess(arg.iModel, { operationName: \"initialize schemaSync\", openMode: OpenMode.Readonly }, async (syncAccess) => {\r\n iModel[_nativeDb].schemaSyncInit(syncAccess.getUri(), props.containerId, arg.overrideContainer ?? false);\r\n iModel.saveChanges(`Enable SchemaSync (container id: ${props.containerId})`);\r\n });\r\n } catch (err) {\r\n throw err;\r\n } finally {\r\n iModel.abandonChanges();\r\n }\r\n\r\n if (briefcase) {\r\n if (arg.overrideContainer)\r\n await briefcase.pushChanges({ description: `Overriding SchemaSync for iModel with container-id: ${props.containerId}` });\r\n else\r\n await briefcase.pushChanges({ description: `Enable SchemaSync for iModel with container-id: ${props.containerId}` });\r\n }\r\n };\r\n\r\n /** Provides access to a cloud-based `SchemaSyncDb` to hold ECSchemas. */\r\n export class CloudAccess extends CloudSqlite.DbAccess<SchemaSyncDb> {\r\n public constructor(props: CloudSqlite.ContainerAccessProps) {\r\n super({ dbType: SchemaSyncDb, props, dbName: defaultDbName });\r\n }\r\n\r\n public getUri() {\r\n return `${this.getCloudDb()[_nativeDb].getFilePath()}?vfs=${this.container.cache?.name}&writable=${this.container.isWriteable ? 1 : 0}`;\r\n }\r\n /**\r\n * Initialize a cloud container for use as a SchemaSync. The container must first be created via its storage supplier api (e.g. Azure, or AWS).\r\n * A valid sasToken that grants write access must be supplied. This function creates and uploads an empty ChannelDb into the container.\r\n * @note this deletes any existing content in the container.\r\n */\r\n public static async initializeDb(props: CloudSqlite.ContainerProps) {\r\n return super._initializeDb({ props, dbType: SchemaSyncDb, dbName: defaultDbName });\r\n }\r\n }\r\n}\r\n\r\n"]}
|