UNPKG

@leisoft/aas-client

Version:

TypeScript / JavaScript AAS metamodel and client library by Leisoft for both browser and Node.js.

1 lines 125 kB
{"version":3,"sources":["../src/Descriptors/ProtocolInformation.ts","../src/Descriptors/ServiceDescription.ts","../src/Metamodel/Enums/AasSubmodelElements.ts","../src/Metamodel/Enums/AssetKind.ts","../src/Metamodel/Enums/DataTypeDefXsd.ts","../src/Metamodel/Enums/DataTypeIec61360.ts","../src/Metamodel/Enums/Direction.ts","../src/Metamodel/Enums/EntityType.ts","../src/Metamodel/Enums/KeyTypes.ts","../src/Metamodel/Enums/ModellingKind.ts","../src/Metamodel/Enums/ModelType.ts","../src/Metamodel/Enums/QualifierKind.ts","../src/Metamodel/Enums/ReferenceTypes.ts","../src/Metamodel/Enums/StateOfEvent.ts","../src/Rest/Client/AasRequestError.ts","../src/Utils/Restutils.ts","../src/Rest/Client/ClientBase.ts","../src/Rest/Client/AasRegistryClient.ts","../src/Rest/Client/AasRepoClient.ts","../src/Rest/Client/ConceptDescriptionClient.ts","../src/Rest/Client/DiscoveryClient.ts","../src/Rest/Client/SubmodelRegistryClient.ts","../src/Rest/Client/SubmodelRepoClient.ts","../src/Rest/Interfaces/ExecutionState.ts","../src/Treemodel/SubmodelElementNode.ts","../src/Treemodel/SubmodelTree.ts","../src/Utils/AasUtils.ts","../src/Utils/IdShortPath.ts","../src/Utils/LeisoftAasId.ts"],"sourcesContent":["export type ProtocolInformation = {\n href: string;\n endpointProtocol?: string;\n endpointProtocolVersion?: Array<string>;\n subprotocol?: string;\n subprotocolBody?: string;\n subprotocolBodyEncoding?: string;\n securityAttributes?: Array<ProtocolInformationSecurityAttributes>;\n};\n\nexport type ProtocolInformationSecurityAttributes = {\n type: ProtocolInformationSecurityAttributeTypes;\n key: string;\n value: string;\n};\n\nexport enum ProtocolInformationSecurityAttributeTypes {\n NONE = 'NONE',\n RFCTLSA = 'RFC_TLSA',\n W3CDID = 'W3C_DID',\n}\n","export type ServiceDescription = {\n profiles?: Array<ServiceProfiles>;\n};\n\nexport enum ServiceProfiles {\n AssetAdministrationShellServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/AssetAdministrationShellServiceSpecification/SSP-001',\n AssetAdministrationShellServiceSpecificationSSP002 = 'https://admin-shell.io/aas/API/3/0/AssetAdministrationShellServiceSpecification/SSP-002',\n SubmodelServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/SubmodelServiceSpecification/SSP-001',\n SubmodelServiceSpecificationSSP002 = 'https://admin-shell.io/aas/API/3/0/SubmodelServiceSpecification/SSP-002',\n SubmodelServiceSpecificationSSP003 = 'https://admin-shell.io/aas/API/3/0/SubmodelServiceSpecification/SSP-003',\n AasxFileServerServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/AasxFileServerServiceSpecification/SSP-001',\n AssetAdministrationShellRegistryServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-001',\n AssetAdministrationShellRegistryServiceSpecificationSSP002 = 'https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-002',\n SubmodelRegistryServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-001',\n SubmodelRegistryServiceSpecificationSSP002 = 'https://admin-shell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-002',\n DiscoveryServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/DiscoveryServiceSpecification/SSP-001',\n AssetAdministrationShellRepositoryServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRepositoryServiceSpecification/SSP-001',\n AssetAdministrationShellRepositoryServiceSpecificationSSP002 = 'https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRepositoryServiceSpecification/SSP-002',\n SubmodelRepositoryServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/SubmodelRepositoryServiceSpecification/SSP-001',\n SubmodelRepositoryServiceSpecificationSSP002 = 'https://admin-shell.io/aas/API/3/0/SubmodelRepositoryServiceSpecification/SSP-002',\n SubmodelRepositoryServiceSpecificationSSP003 = 'https://admin-shell.io/aas/API/3/0/SubmodelRepositoryServiceSpecification/SSP-003',\n SubmodelRepositoryServiceSpecificationSSP004 = 'https://admin-shell.io/aas/API/3/0/SubmodelRepositoryServiceSpecification/SSP-004',\n ConceptDescriptionServiceSpecificationSSP001 = 'https://admin-shell.io/aas/API/3/0/ConceptDescriptionServiceSpecification/SSP-001',\n}\n","export enum AasSubmodelElements {\n AnnotatedRelationshipElement = 'AnnotatedRelationshipElement',\n BasicEventElement = 'BasicEventElement',\n Blob = 'Blob',\n Capability = 'Capability',\n DataElement = 'DataElement',\n Entity = 'Entity',\n EventElement = 'EventElement',\n File = 'File',\n MultiLanguageProperty = 'MultiLanguageProperty',\n Operation = 'Operation',\n Property = 'Property',\n Range = 'Range',\n ReferenceElement = 'ReferenceElement',\n RelationshipElement = 'RelationshipElement',\n SubmodelElement = 'SubmodelElement',\n SubmodelElementCollection = 'SubmodelElementCollection',\n SubmodelElementList = 'SubmodelElementList',\n}\n","export enum AssetKind {\n Instance = 'Instance',\n NotApplicable = 'NotApplicable',\n Type = 'Type',\n}\n","export enum DataTypeDefXsd {\n AnyURI = 'xs:anyURI',\n Base64Binary = 'xs:base64Binary',\n Boolean = 'xs:boolean',\n Byte = 'xs:byte',\n Date = 'xs:date',\n DateTime = 'xs:dateTime',\n Decimal = 'xs:decimal',\n Double = 'xs:double',\n Duration = 'xs:duration',\n Float = 'xs:float',\n GDay = 'xs:gDay',\n GMonth = 'xs:gMonth',\n GMonthDay = 'xs:gMonthDay',\n GYear = 'xs:gYear',\n GYearMonth = 'xs:gYearMonth',\n HexBinary = 'xs:hexBinary',\n Int = 'xs:int',\n Integer = 'xs:integer',\n Long = 'xs:long',\n NegativeInteger = 'xs:negativeInteger',\n NonNegativeInteger = 'xs:nonNegativeInteger',\n NonPositiveInteger = 'xs:nonPositiveInteger',\n PositiveInteger = 'xs:positiveInteger',\n Short = 'xs:short',\n String = 'xs:string',\n Time = 'xs:time',\n UnsignedByte = 'xs:unsignedByte',\n UnsignedInt = 'xs:unsignedInt',\n UnsignedLong = 'xs:unsignedLong',\n UnsignedShort = 'xs:unsignedShort',\n}\n","export enum DataTypeIec61360 {\n BLOB = 'BLOB',\n BOOLEAN = 'BOOLEAN',\n DATE = 'DATE',\n FILE = 'FILE',\n HTML = 'HTML',\n INTEGERCOUNT = 'INTEGER_COUNT',\n INTEGERCURRENCY = 'INTEGER_CURRENCY',\n INTEGERMEASURE = 'INTEGER_MEASURE',\n IRDI = 'IRDI',\n IRI = 'IRI',\n RATIONAL = 'RATIONAL',\n RATIONALMEASURE = 'RATIONAL_MEASURE',\n REALCOUNT = 'REAL_COUNT',\n REALCURRENCY = 'REAL_CURRENCY',\n REALMEASURE = 'REAL_MEASURE',\n STRING = 'STRING',\n STRINGTRANSLATABLE = 'STRING_TRANSLATABLE',\n TIME = 'TIME',\n TIMESTAMP = 'TIMESTAMP',\n}\n","export enum Direction {\n Input = 'input',\n Output = 'output',\n}\n","export enum EntityType {\n CoManagedEntity = 'CoManagedEntity',\n SelfManagedEntity = 'SelfManagedEntity',\n}\n","export enum KeyTypes {\n AnnotatedRelationshipElement = 'AnnotatedRelationshipElement',\n AssetAdministrationShell = 'AssetAdministrationShell',\n BasicEventElement = 'BasicEventElement',\n Blob = 'Blob',\n Capability = 'Capability',\n ConceptDescription = 'ConceptDescription',\n DataElement = 'DataElement',\n Entity = 'Entity',\n EventElement = 'EventElement',\n File = 'File',\n FragmentReference = 'FragmentReference',\n GlobalReference = 'GlobalReference',\n Identifiable = 'Identifiable',\n MultiLanguageProperty = 'MultiLanguageProperty',\n Operation = 'Operation',\n Property = 'Property',\n Range = 'Range',\n Referable = 'Referable',\n ReferenceElement = 'ReferenceElement',\n RelationshipElement = 'RelationshipElement',\n Submodel = 'Submodel',\n SubmodelElement = 'SubmodelElement',\n SubmodelElementCollection = 'SubmodelElementCollection',\n SubmodelElementList = 'SubmodelElementList',\n}\n","export enum ModellingKind {\n Instance = 'Instance',\n Template = 'Template',\n}\n","export enum ModelType {\n AnnotatedRelationshipElement = 'AnnotatedRelationshipElement',\n AssetAdministrationShell = 'AssetAdministrationShell',\n BasicEventElement = 'BasicEventElement',\n Blob = 'Blob',\n Capability = 'Capability',\n ConceptDescription = 'ConceptDescription',\n DataSpecificationIec61360 = 'DataSpecificationIec61360',\n Entity = 'Entity',\n File = 'File',\n MultiLanguageProperty = 'MultiLanguageProperty',\n Operation = 'Operation',\n Property = 'Property',\n Range = 'Range',\n ReferenceElement = 'ReferenceElement',\n RelationshipElement = 'RelationshipElement',\n Submodel = 'Submodel',\n SubmodelElementCollection = 'SubmodelElementCollection',\n SubmodelElementList = 'SubmodelElementList',\n}\n","export enum QualifierKind {\n ConceptQualifier = 'ConceptQualifier',\n TemplateQualifier = 'TemplateQualifier',\n ValueQualifier = 'ValueQualifier',\n}\n","export enum ReferenceTypes {\n ExternalReference = 'ExternalReference',\n ModelReference = 'ModelReference',\n}\n","export enum StateOfEvent {\n Off = 'off',\n On = 'on',\n}\n","import type { Message } from '../Interfaces/Message';\n\nexport class AasRequestError extends Error {\n constructor(\n public readonly request: Request,\n public readonly response: Response,\n public readonly messages?: Message[],\n ) {\n super(`Request to AAS API at ${request.url} failed with status ${response.status}`);\n }\n}\n","import type { Reference } from '../Metamodel/SupportTypes/Reference';\nimport type { SpecificAssetId } from '../Metamodel/SupportTypes/SpecificAssetId';\nimport type { PagingParams } from '../Rest/Interfaces/PagingParams';\nimport type { SerializationModifiers } from '../Rest/Interfaces/SerializationModifiers';\nimport { AasRequestError } from '../Rest/Client/AasRequestError';\n\nexport const assignSearchParams = (\n params: URLSearchParams,\n assign: Record<string, string | string[] | undefined>,\n): void => {\n for (const key in assign) {\n const val = assign[key];\n if (Array.isArray(val)) {\n val.forEach(v => params.append(key, v));\n }\n else if (typeof val === 'string') {\n params.set(key, val);\n }\n }\n};\n\nexport const assignPagingParams = (\n params: URLSearchParams,\n pagingParams?: PagingParams,\n): void => {\n if (pagingParams) {\n const paging = {\n ...pagingParams,\n limit: pagingParams.limit ? String(pagingParams.limit) : undefined,\n };\n assignSearchParams(params, paging);\n }\n};\n\nexport const assignSerializationModifiers = (\n params: URLSearchParams,\n serializationModifiers?: SerializationModifiers,\n): void => {\n if (serializationModifiers) {\n assignSearchParams(params, serializationModifiers);\n }\n};\n\nexport const base64Url = (str: string) => {\n const base64 = btoa(str);\n return base64\n .replaceAll('+', '-')\n .replaceAll('/', '_')\n .replaceAll('=', '');\n};\n\nexport const encodeSpecificAssetId = (id: SpecificAssetId): string => {\n const json = JSON.stringify(id);\n return base64Url(json);\n};\n\nexport const encodeReference = (ref: Reference): string => {\n const json = JSON.stringify(ref);\n return base64Url(json);\n};\n\nexport const assignSemanticId = (\n params: URLSearchParams,\n semanticId?: Reference,\n): void => {\n if (semanticId) {\n const encoded = encodeReference(semanticId);\n const assign = {\n semanticId: encoded,\n };\n assignSearchParams(params, assign);\n }\n};\n\nexport const assertValidAasResponse = async <T>(\n request: Request,\n response: Response,\n converserionType: 'json' | 'blob' | 'text' | 'void' = 'json',\n): Promise<T> => {\n const status = response.status;\n if (status > 299) {\n let messages;\n try {\n messages = await response.json();\n }\n catch {\n messages = undefined;\n }\n throw new AasRequestError(request, response, messages);\n }\n let result;\n switch (converserionType) {\n case 'json':\n result = await response.json();\n break;\n case 'blob':\n result = await response.blob();\n break;\n case 'text':\n result = await response.text();\n break;\n default:\n result = undefined;\n }\n return result as T;\n};\n\nexport const assignAssetParams = (\n params: URLSearchParams,\n assetIds?: SpecificAssetId[],\n idShort?: string,\n): void => {\n const encoded = assetIds?.map(encodeSpecificAssetId);\n const assign = {\n assetIds: encoded,\n idShort,\n };\n assignSearchParams(params, assign);\n};\n\nexport const assignReferences = (\n params: URLSearchParams,\n referencesMapping: Record<string, Reference | undefined>,\n) => {\n const assign: Record<string, string | string[] | undefined> = {};\n for (const key in referencesMapping) {\n const ref = referencesMapping[key];\n if (ref) {\n const encoded = encodeReference(ref);\n assign[key] = encoded;\n }\n }\n assignSearchParams(params, assign);\n};\n\n/**\n * Safely joins URL segments, ensuring that there are no double slashes or missing slashes.\n * @param args URL segments to join\n * @returns joined URL\n */\nexport function urljoin(...args: string[]): string {\n let url = '';\n for (const arg of args) {\n if (url === '') {\n url = arg;\n }\n else {\n if (url.endsWith('/')) {\n url = url.slice(0, -1);\n }\n if (arg.startsWith('/')) {\n url += arg;\n }\n else {\n url += `/${arg}`;\n }\n }\n }\n return url;\n}\n\nexport type HTTP_VERBS = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD';\n\nexport const headersLength = (headers: Headers): number => {\n let count = 0;\n headers.forEach(() => {\n count++;\n });\n return count;\n};\n\nexport const LEISOFT_DOMAIN = 'leisoft.de';\nexport const LEISOFT_WWW_DOMAIN = 'www.leisoft.de';\nexport const LEISOFT_API_DOMAIN = 'api.leisoft.de';\nexport const LEISOFT_CLIENT_DOMAIN = 'client.leisoft.de';\n\nexport const IDTA_DOMAIN = 'admin-shell.io';\n","import type { ServiceDescription } from '../../Descriptors/ServiceDescription';\nimport type { ClientConfigParams } from '../Interfaces/ConfigParams';\nimport type { HttpVerb } from '../Interfaces/Http';\nimport { assertValidAasResponse, headersLength } from '../../Utils/Restutils';\n\nexport abstract class ClientBase {\n public readonly baseUrl: URL;\n protected headers: Headers = new Headers();\n\n constructor(\n protected readonly configParams: ClientConfigParams,\n ) {\n const protocol = configParams.protocol ?? 'https';\n const port = configParams.port ? `:${configParams.port}` : '';\n const basePath = configParams.basePath\n ? `${configParams.basePath.replace(/\\/+$/, '')}/`\n : '';\n const url = `${protocol}://${configParams.host}${port}`;\n this.baseUrl = new URL(basePath, url);\n }\n\n public async request(\n method: HttpVerb,\n path: string,\n params?: URLSearchParams,\n body?: BodyInit,\n signal?: AbortSignal,\n ): Promise<[Request, Response]> {\n const url = new URL(path.replace(/^\\/+/, ''), this.baseUrl);\n url.search = params?.toString() ?? '';\n const headers = this.getHeaders();\n if (headersLength(this.headers) === 0) {\n // if no headers were set, then edit the default headers\n if (['get', 'delete'].includes(method)) {\n // get and delete requests should not have a body\n headers.delete('Content-Type');\n }\n if (['put', 'patch', 'delete'].includes(method)) {\n // put, patch and delete usually don't get a response body\n headers.delete('Accept');\n }\n // post by default usually has a body and gets a response body\n }\n const request = new Request(url, {\n headers,\n method,\n body,\n signal,\n });\n const response = await fetch(request);\n // reset the headers\n this.headers = new Headers();\n return [request, response];\n }\n\n protected getHeaders(): Headers {\n let headers: Headers;\n if (headersLength(this.headers) > 0) {\n // use the supplied headers\n headers = new Headers(this.headers);\n }\n else {\n // use default headers\n headers = new Headers({\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n });\n }\n const auth = this.configParams.auth;\n if (auth) {\n switch (auth.type) {\n case 'basic':\n {\n const credentials = btoa(`${auth.username}:${auth.password}`);\n headers.set('Authorization', `Basic ${credentials}`);\n break;\n }\n case 'token':\n headers.set('Authorization', `Bearer ${auth.token}`);\n break;\n case 'cert': // TODO: is this common\n headers.set('X-Client-Cert', auth.cert);\n break;\n default: // TODO: specific error\n throw new Error('Unsupported auth type');\n }\n }\n return headers;\n };\n\n public async getServiceDescription(\n signal?: AbortSignal,\n ): Promise<ServiceDescription> {\n const [request, response] = await this.request(\n 'get',\n '/description',\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n};\n","import type { AssetAdministrationShellDescriptor } from '../../Descriptors/AssetAdministrationShellDescriptor';\nimport type { AssetKind } from '../../Metamodel/Enums/AssetKind';\nimport type { PagedResult } from '../Interfaces/PagedResult';\nimport type { PagingParams } from '../Interfaces/PagingParams';\nimport { assertValidAasResponse, assignPagingParams, assignSearchParams } from '../../Utils/Restutils';\nimport { ClientBase } from './ClientBase';\n\nexport class AasRegistryClient extends ClientBase {\n public async getShellDescriptors(\n assetKind?: AssetKind,\n assetType?: string,\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<AssetAdministrationShellDescriptor>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n assetKind,\n assetType,\n });\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n '/shell-descriptors',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createShellDescriptor(\n descriptor: AssetAdministrationShellDescriptor,\n signal?: AbortSignal,\n ): Promise<AssetAdministrationShellDescriptor> {\n const [request, response] = await this.request(\n 'post',\n '/shell-descriptors',\n undefined,\n JSON.stringify(descriptor),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getShellDescriptor(\n id: string,\n signal?: AbortSignal,\n ): Promise<AssetAdministrationShellDescriptor> {\n const [request, response] = await this.request(\n 'get',\n `/shell-descriptors/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async replaceShellDescriptor(\n id: string,\n descriptor: AssetAdministrationShellDescriptor,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'put',\n `/shell-descriptors/${id}`,\n undefined,\n JSON.stringify(descriptor),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async deleteShellDescriptor(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/shell-descriptors/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n}\n","import type { AssetAdministrationShell } from '../../Metamodel/AssetAdministrationShell';\nimport type { AssetInformation } from '../../Metamodel/SupportTypes/AssetInformation';\nimport type { Reference } from '../../Metamodel/SupportTypes/Reference';\nimport type { SpecificAssetId } from '../../Metamodel/SupportTypes/SpecificAssetId';\nimport type { PagedResult } from '../Interfaces/PagedResult';\nimport type { PagingParams } from '../Interfaces/PagingParams';\nimport { assertValidAasResponse, assignAssetParams, assignPagingParams, base64Url } from '../../Utils/Restutils';\nimport { ClientBase } from './ClientBase';\n\nexport class AasRepoClient extends ClientBase {\n public async getShells(\n assetIds?: SpecificAssetId[],\n idShort?: string,\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<AssetAdministrationShell>> {\n const params = new URLSearchParams();\n assignAssetParams(params, assetIds, idShort);\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n '/shells',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createShell(\n shell: AssetAdministrationShell,\n signal?: AbortSignal,\n ): Promise<AssetAdministrationShell> {\n const [request, response] = await this.request(\n 'post',\n '/shells',\n undefined,\n JSON.stringify(shell),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getShell(\n id: string,\n signal?: AbortSignal,\n ): Promise<AssetAdministrationShell> {\n const [request, response] = await this.request(\n 'get',\n `/shells/${base64Url(id)}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async deleteShell(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/shells/${base64Url(id)}`,\n undefined,\n undefined,\n signal,\n );\n await assertValidAasResponse(request, response, 'void');\n }\n\n public async replaceShell(\n id: string,\n shell: AssetAdministrationShell,\n signal?: AbortSignal,\n ): Promise<AssetAdministrationShell> {\n const [request, response] = await this.request(\n 'put',\n `/shells/${base64Url(id)}`,\n undefined,\n JSON.stringify(shell),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getShellReferences(\n assetIds?: SpecificAssetId[],\n idShort?: string,\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<Reference>> {\n const params = new URLSearchParams();\n assignAssetParams(params, assetIds, idShort);\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n '/shells/$reference',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getShellReference(\n id: string,\n signal?: AbortSignal,\n ): Promise<Reference> {\n const [request, response] = await this.request(\n 'get',\n `/shells/${base64Url(id)}/$reference`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getAssetInformation(\n id: string,\n signal?: AbortSignal,\n ): Promise<AssetInformation> {\n const [request, response] = await this.request(\n 'get',\n `/shells/${base64Url(id)}/asset-information`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async replaceAssetInformation(\n id: string,\n assetInformation: AssetInformation,\n signal?: AbortSignal,\n ): Promise<AssetInformation> {\n const [request, response] = await this.request(\n 'put',\n `/shells/${base64Url(id)}/asset-information`,\n undefined,\n JSON.stringify(assetInformation),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getShellThumbnail(\n id: string,\n signal?: AbortSignal,\n ): Promise<Blob> {\n this.headers.set(\n 'Accept',\n 'application/octet-stream, image/*, image/svg+xml',\n );\n const [request, response] = await this.request(\n 'get',\n `/shells/${base64Url(id)}/thumbnail`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'blob');\n }\n\n public async replaceShellThumbnail(\n id: string,\n thumbnail: Blob,\n signal?: AbortSignal,\n ): Promise<void> {\n if (thumbnail.type) {\n this.headers.set('Content-Type', thumbnail.type);\n }\n else {\n // Fallback to a default Content-Type if the Blob type is not set\n this.headers.set('Content-Type', 'application/octet-stream');\n }\n const [request, response] = await this.request(\n 'put',\n `/shells/${base64Url(id)}/thumbnail`,\n undefined,\n thumbnail,\n signal,\n );\n await assertValidAasResponse(request, response, 'void');\n }\n\n public async deleteShellThumbnail(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/shells/${base64Url(id)}/thumbnail`,\n undefined,\n undefined,\n signal,\n );\n await assertValidAasResponse(request, response, 'void');\n }\n\n public async getShellSubmodelRefs(\n id: string,\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<Reference>> {\n const params = new URLSearchParams();\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n `/shells/${base64Url(id)}/submodel-refs`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createShellSubmodelRef(\n id: string,\n submodelRef: Reference,\n signal?: AbortSignal,\n ): Promise<Reference> {\n const [request, response] = await this.request(\n 'post',\n `/shells/${base64Url(id)}/submodel-refs`,\n undefined,\n JSON.stringify(submodelRef),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async deleteShellSubmodelRef(\n id: string,\n submodelRefId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/shells/${base64Url(id)}/submodel-refs/${submodelRefId}`,\n undefined,\n undefined,\n signal,\n );\n await assertValidAasResponse(request, response, 'void');\n }\n};\n","import type { ConceptDescription } from '../../Metamodel/ConceptDescription';\nimport type { Reference } from '../../Metamodel/SupportTypes/Reference';\nimport type { PagedResult } from '../Interfaces/PagedResult';\nimport type { PagingParams } from '../Interfaces/PagingParams';\nimport { assertValidAasResponse, assignPagingParams, assignReferences, assignSearchParams } from '../../Utils/Restutils';\nimport { ClientBase } from './ClientBase';\n\nexport class ConceptDescriptionClient extends ClientBase {\n public async getConceptDescriptions(\n idShort?: string,\n isCaseOf?: Reference,\n dataSpecificationRef?: Reference,\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<ConceptDescription>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n idShort,\n });\n assignReferences(params, {\n isCaseOf,\n dataSpecificationRef,\n });\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n '/concept-descriptions',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createConceptDescription(\n conceptDescription: ConceptDescription,\n signal?: AbortSignal,\n ): Promise<ConceptDescription> {\n const [request, response] = await this.request(\n 'post',\n '/concept-descriptions',\n undefined,\n JSON.stringify(conceptDescription),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getConceptDescription(\n id: string,\n signal?: AbortSignal,\n ): Promise<ConceptDescription> {\n const [request, response] = await this.request(\n 'get',\n `/concept-descriptions/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async replaceConceptDescription(\n id: string,\n conceptDescription: ConceptDescription,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'put',\n `/concept-descriptions/${id}`,\n undefined,\n JSON.stringify(conceptDescription),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async deleteConceptDescription(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/concept-descriptions/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n}\n","import type { SpecificAssetId } from '../../Metamodel/SupportTypes/SpecificAssetId';\nimport type { PagedResult } from '../Interfaces/PagedResult';\nimport type { PagingParams } from '../Interfaces/PagingParams';\nimport { assertValidAasResponse, assignAssetParams, assignPagingParams } from '../../Utils/Restutils';\nimport { ClientBase } from './ClientBase';\n\nexport class DiscoveryClient extends ClientBase {\n public async lookupShells(\n assetIds?: SpecificAssetId[],\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<string>> {\n const params = new URLSearchParams();\n assignAssetParams(params, assetIds);\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n '/lookup/shells',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async lookupAssetIds(\n id: string,\n signal?: AbortSignal,\n ): Promise<SpecificAssetId[]> {\n const [request, response] = await this.request(\n 'get',\n `/lookup/shells/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createAssetLink(\n id: string,\n assetIds: SpecificAssetId[],\n signal?: AbortSignal,\n ): Promise<SpecificAssetId[]> {\n const [request, response] = await this.request(\n 'post',\n `/lookup/shells/${id}`,\n undefined,\n JSON.stringify(assetIds),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async deleteAssetLink(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/lookup/shells/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n}\n","import type { SubmodelDescriptor } from '../../Descriptors/SubmodelDescriptor';\nimport type { PagedResult } from '../Interfaces/PagedResult';\nimport type { PagingParams } from '../Interfaces/PagingParams';\nimport { assertValidAasResponse, assignPagingParams } from '../../Utils/Restutils';\nimport { ClientBase } from './ClientBase';\n\nexport class SubmodelRegistryClient extends ClientBase {\n public async getSubmodelDescriptors(\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<SubmodelDescriptor>> {\n const params = new URLSearchParams();\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n '/submodel-descriptors',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createSubmodelDescriptor(\n descriptor: SubmodelDescriptor,\n signal?: AbortSignal,\n ): Promise<SubmodelDescriptor> {\n const [request, response] = await this.request(\n 'post',\n '/submodel-descriptors',\n undefined,\n JSON.stringify(descriptor),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelDescriptor(\n id: string,\n signal?: AbortSignal,\n ): Promise<SubmodelDescriptor> {\n const [request, response] = await this.request(\n 'get',\n `/submodel-descriptors/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async replaceSubmodelDescriptor(\n id: string,\n descriptor: SubmodelDescriptor,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'put',\n `/submodel-descriptors/${id}`,\n undefined,\n JSON.stringify(descriptor),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async deleteSubmodelDescriptor(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/submodel-descriptors/${id}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n}\n","import type { SubmodelElementMetadata } from '../../Metadata/SubmodelElementMetadata';\nimport type { SubmodelMetadata } from '../../Metadata/SubmodelMetadata';\nimport type { Submodel } from '../../Metamodel/Submodel';\nimport type { SubmodelElement } from '../../Metamodel/SubmodelElements/SubmodelElement';\nimport type { Reference } from '../../Metamodel/SupportTypes/Reference';\nimport type { OperationRequestValue } from '../../ValueOnly/OperationRequestValue';\nimport type { OperationResultValue } from '../../ValueOnly/OperationResultValue';\nimport type { SubmodelElementValue } from '../../ValueOnly/SubmodelElementValue';\nimport type { ValueOnly } from '../../ValueOnly/ValueOnly';\nimport type { BaseOperationResult } from '../Interfaces/BaseOperationResult';\nimport type { OperationRequest } from '../Interfaces/OperationRequest';\nimport type { OperationResult } from '../Interfaces/OperationResult';\nimport type { PagedResult } from '../Interfaces/PagedResult';\nimport type { PagingParams } from '../Interfaces/PagingParams';\nimport type { SerializationModifiers } from '../Interfaces/SerializationModifiers';\nimport { assertValidAasResponse, assignPagingParams, assignSearchParams, assignSemanticId, assignSerializationModifiers, base64Url } from '../../Utils/Restutils';\nimport { ClientBase } from './ClientBase';\n\nexport class SubmodelRepoClient extends ClientBase {\n public async getSubmodels(\n semanticId?: Reference,\n idShort?: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<Submodel>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n idShort,\n });\n assignSemanticId(params, semanticId);\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n '/submodels',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createSubmodel(\n submodel: Submodel,\n signal?: AbortSignal,\n ): Promise<Submodel> {\n const [request, response] = await this.request(\n 'post',\n '/submodels',\n undefined,\n JSON.stringify(submodel),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelsMetadata(\n semanticId?: Reference,\n idShort?: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<SubmodelMetadata>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n idShort,\n });\n assignSemanticId(params, semanticId);\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n '/submodels/$metadata',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelsValue(\n semanticId?: Reference,\n idShort?: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<ValueOnly>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n idShort,\n });\n assignSemanticId(params, semanticId);\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n '/submodels/$value',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelReferences(\n semanticId?: Reference,\n idShort?: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<Reference>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n idShort,\n });\n assignSemanticId(params, semanticId);\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n '/submodels/$reference',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelsPaths(\n semanticId?: Reference,\n idShort?: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<string[]>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n idShort,\n });\n assignSemanticId(params, semanticId);\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n '/submodels/$path',\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodel(\n id: string,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<Submodel> {\n const params = new URLSearchParams();\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(id)}`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async replaceSubmodel(\n id: string,\n submodel: Submodel,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'put',\n `/submodels/${base64Url(id)}`,\n undefined,\n JSON.stringify(submodel),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async updateSubmodel(\n id: string,\n submodel: Submodel,\n level?: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'patch',\n `/submodels/${base64Url(id)}`,\n params,\n JSON.stringify(submodel),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async deleteSubmodel(\n id: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/submodels/${base64Url(id)}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async getSubmodelMetadata(\n id: string,\n level?: string,\n signal?: AbortSignal,\n ): Promise<SubmodelMetadata> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(id)}/$metadata`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async updateSubmodelMetadata(\n id: string,\n metadata: SubmodelMetadata,\n level?: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'patch',\n `/submodels/${base64Url(id)}`,\n params,\n JSON.stringify(metadata),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async getSubmodelValue(\n id: string,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<ValueOnly> {\n const params = new URLSearchParams();\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(id)}/$value`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelReference(\n id: string,\n signal?: AbortSignal,\n ): Promise<Reference> {\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(id)}/$reference`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelPaths(\n id: string,\n level?: string,\n signal?: AbortSignal,\n ): Promise<string[]> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(id)}/$path`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelElements(\n submodelId: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<SubmodelElement>> {\n const params = new URLSearchParams();\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createSubmodelElement(\n submodelId: string,\n element: SubmodelElement,\n signal?: AbortSignal,\n ): Promise<SubmodelElement> {\n const [request, response] = await this.request(\n 'post',\n `/submodels/${base64Url(submodelId)}/submodel-elements`,\n undefined,\n JSON.stringify(element),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelElementsMetadata(\n submodelId: string,\n pagingParams?: PagingParams,\n level?: string,\n signal?: AbortSignal,\n ): Promise<PagedResult<SubmodelElementMetadata>> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n assignPagingParams(params, pagingParams);\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements/$metadata`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelElementsValue(\n submodelId: string,\n pagingParams?: PagingParams,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<PagedResult<SubmodelElementValue>> {\n const params = new URLSearchParams();\n assignPagingParams(params, pagingParams);\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements/$value`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelElementReferences(\n submodelId: string,\n pagingParams?: PagingParams,\n signal?: AbortSignal,\n ): Promise<PagedResult<Reference>> {\n const params = new URLSearchParams();\n assignPagingParams(params, pagingParams);\n assignSearchParams(params, {\n level: 'core', // only core is allowed for Content=Reference\n });\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements/$reference`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelElementsPaths(\n submodelId: string,\n pagingParams?: PagingParams,\n level?: string,\n signal?: AbortSignal,\n ): Promise<PagedResult<string[]>> {\n const params = new URLSearchParams();\n assignPagingParams(params, pagingParams);\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements/$path`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async getSubmodelElement(\n submodelId: string,\n idShortPath: string,\n serializationModifiers?: SerializationModifiers,\n signal?: AbortSignal,\n ): Promise<SubmodelElement> {\n const params = new URLSearchParams();\n assignSerializationModifiers(params, serializationModifiers);\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements/${idShortPath}`,\n params,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async createSubmodelElementAtPath(\n submodelId: string,\n idShortPath: string,\n element: SubmodelElement,\n signal?: AbortSignal,\n ): Promise<SubmodelElement> {\n const [request, response] = await this.request(\n 'post',\n `/submodels/${base64Url(submodelId)}/submodel-elements/${idShortPath}`,\n undefined,\n JSON.stringify(element),\n signal,\n );\n return await assertValidAasResponse(request, response);\n }\n\n public async replaceSubmodelElement(\n submodelId: string,\n idShortPath: string,\n element: SubmodelElement,\n level?: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'put',\n `/submodels/${base64Url(submodelId)}/submodel-elements/${idShortPath}`,\n params,\n JSON.stringify(element),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async updateSubmodelElement(\n submodelId: string,\n idShortPath: string,\n element: SubmodelElement,\n level?: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'patch',\n `/submodels/${base64Url(submodelId)}/submodel-elements/${idShortPath}`,\n params,\n JSON.stringify(element),\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async deleteSubmodelElement(\n submodelId: string,\n idShortPath: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const [request, response] = await this.request(\n 'delete',\n `/submodels/${base64Url(submodelId)}/submodel-elements/${idShortPath}`,\n undefined,\n undefined,\n signal,\n );\n return await assertValidAasResponse(request, response, 'void');\n }\n\n public async getSubmodelElementMetadata(\n submodelId: string,\n idShortPath: string,\n level?: string,\n signal?: AbortSignal,\n ): Promise<SubmodelElementMetadata> {\n const params = new URLSearchParams();\n assignSearchParams(params, {\n level,\n });\n const [request, response] = await this.request(\n 'get',\n `/submodels/${base64Url(submodelId)}/submodel-elements/${idShortPath}/$metadata`,\n params,\n undefined,\n