@twin.org/auditable-item-graph-service 0.10.1-next.1 → 0.10.1-next.3

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.
@@ -4,6 +4,7 @@ import { HealthCategory, HealthStatus } from "@twin.org/api-models";
4
4
  import { AuditableItemGraphAuditMode, AuditableItemGraphContexts, AuditableItemGraphDataTypes, AuditableItemGraphMetricIds, AuditableItemGraphMetrics, AuditableItemGraphTopics, AuditableItemGraphTypes, VerifyDepth } from "@twin.org/auditable-item-graph-models";
5
5
  import { ContextIdHelper, ContextIdKeys, ContextIdStore } from "@twin.org/context";
6
6
  import { ArrayHelper, BaseError, Coerce, ComponentFactory, Converter, GeneralError, Guards, Is, JsonHelper, Mutex, NotFoundError, ObjectHelper, RandomHelper, StringHelper, Urn, Validation } from "@twin.org/core";
7
+ import { Blake2b } from "@twin.org/crypto";
7
8
  import { DataTypeHelper } from "@twin.org/data-core";
8
9
  import { JsonLdDataTypes, JsonLdHelper, JsonLdProcessor } from "@twin.org/data-json-ld";
9
10
  import { ComparisonOperator, LogicalOperator, SortDirection } from "@twin.org/entity";
@@ -32,11 +33,6 @@ export class AuditableItemGraphService {
32
33
  * The namespace for the service edge.
33
34
  */
34
35
  static NAMESPACE_EDGE = "edge";
35
- /**
36
- * The number of vertices returned by a query when the caller gives no limit.
37
- * @internal
38
- */
39
- static _DEFAULT_PAGE_SIZE = 40;
40
36
  /**
41
37
  * The index type for the id of the vertex itself.
42
38
  * @internal
@@ -725,41 +721,28 @@ export class AuditableItemGraphService {
725
721
  if (!propertiesToReturn.includes("id")) {
726
722
  propertiesToReturn.unshift("id");
727
723
  }
728
- // Every id, alias and resource type match is held in the index storage, which carries
729
- // the ordering dates so it can page its own matches by key set. Nothing is drained into
730
- // memory, so a term matching a very large number of entries costs one page.
731
- const indexPredicates = [];
724
+ // Every id, alias and resource type match is held in the index storage. Each filter is
725
+ // one dimension, satisfied by any one of the entries of a vertex, and a vertex has to
726
+ // satisfy every dimension it was given.
727
+ const indexDimensions = [];
732
728
  if (hasIdFilter) {
733
729
  const comparison = idExact ? ComparisonOperator.Equals : ComparisonOperator.Includes;
734
730
  const term = idOrAlias.toLowerCase();
731
+ const idPredicates = [];
735
732
  if (idMode === "id" || idMode === "both") {
736
- indexPredicates.push(this.indexTypeValueCondition(AuditableItemGraphService._INDEX_TYPE_VERTEX, comparison, term));
733
+ idPredicates.push(this.indexTypeValueCondition(AuditableItemGraphService._INDEX_TYPE_VERTEX, comparison, term));
737
734
  }
738
735
  if (idMode === "alias" || idMode === "both") {
739
- indexPredicates.push(this.indexTypeValueCondition(AuditableItemGraphService._INDEX_TYPE_ALIAS, comparison, term));
736
+ idPredicates.push(this.indexTypeValueCondition(AuditableItemGraphService._INDEX_TYPE_ALIAS, comparison, term));
740
737
  }
738
+ indexDimensions.push(this.anyOfConditions(idPredicates));
741
739
  }
742
- else if (hasResourceTypes) {
743
- for (const resourceType of resourceTypes) {
744
- indexPredicates.push(this.indexTypeValueCondition(AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE, ComparisonOperator.Equals, resourceType.toLowerCase()));
745
- }
740
+ if (hasResourceTypes) {
741
+ indexDimensions.push(this.indexTypeValueCondition(AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE, ComparisonOperator.In, resourceTypes.map(resourceType => resourceType.toLowerCase())));
746
742
  }
747
- if (indexPredicates.length > 0) {
748
- const indexPage = await this.queryIndexVertexIdPage(indexPredicates, orderProperty, orderDirection, this.decodeCursor("i", cursor), limit);
749
- let pageVertexIds = indexPage.vertexIds;
750
- // An OR over the index gives the union, so when an id or alias filter is combined
751
- // with resource types the page is narrowed to the intersection here.
752
- if (hasIdFilter && hasResourceTypes) {
753
- pageVertexIds = await this.filterVertexIdsByResourceTypes(pageVertexIds, resourceTypes.map(resourceType => resourceType.toLowerCase()));
754
- }
755
- const indexEntities = await this.fetchVerticesInOrder(pageVertexIds, propertiesToReturn, conditions);
756
- return await this.buildVertexList(indexEntities, indexPage.hasMore
757
- ? this.encodeCursor({
758
- s: "i",
759
- d: indexPage.keySet?.d,
760
- i: indexPage.keySet?.i
761
- })
762
- : undefined);
743
+ if (indexDimensions.length > 0) {
744
+ const indexPage = await this.queryIndexVertices(indexDimensions, orderProperty, orderDirection, propertiesToReturn, conditions, cursor, limit);
745
+ return await this.buildVertexList(indexPage.entities, indexPage.cursor);
763
746
  }
764
747
  const finalConditions = Is.empty(conditions)
765
748
  ? { logicalOperator: LogicalOperator.And, conditions: [] }
@@ -775,10 +758,8 @@ export class AuditableItemGraphService {
775
758
  property: "id",
776
759
  sortDirection: SortDirection.Ascending
777
760
  }
778
- ], propertiesToReturn, this.decodeCursor("v", cursor)?.c, limit);
779
- return await this.buildVertexList(results.entities, Is.stringValue(results.cursor)
780
- ? this.encodeCursor({ s: "v", c: results.cursor })
781
- : undefined);
761
+ ], propertiesToReturn, cursor, limit);
762
+ return await this.buildVertexList(results.entities, results.cursor);
782
763
  }
783
764
  catch (error) {
784
765
  throw new GeneralError(AuditableItemGraphService.CLASS_NAME, "queryingFailed", undefined, error);
@@ -1681,13 +1662,16 @@ export class AuditableItemGraphService {
1681
1662
  }
1682
1663
  for (const [key, entry] of required) {
1683
1664
  if (!retainedKeys.has(key)) {
1684
- writeEntries.push({
1685
- id: Converter.bytesToHex(RandomHelper.generate(16)),
1665
+ const writeEntry = {
1686
1666
  vertexId: vertex.id,
1687
1667
  type: entry.type,
1688
1668
  value: entry.value,
1689
1669
  dateCreated: vertex.dateCreated,
1690
1670
  dateModified: indexDateModified
1671
+ };
1672
+ writeEntries.push({
1673
+ id: Converter.bytesToHex(Blake2b.sum256(ObjectHelper.toBytes(JsonHelper.canonicalize(writeEntry)))),
1674
+ ...writeEntry
1691
1675
  });
1692
1676
  }
1693
1677
  }
@@ -1728,60 +1712,11 @@ export class AuditableItemGraphService {
1728
1712
  cursor
1729
1713
  };
1730
1714
  }
1731
- /**
1732
- * Encode a storage cursor into the opaque cursor handed back to callers.
1733
- * Every cursor this service returns is in this format, so a cursor which does not decode
1734
- * is invalid rather than a cursor from somewhere else.
1735
- * @param payload The position to encode.
1736
- * @param payload.s The strategy the position belongs to, i for index paged, v for vertex paged.
1737
- * @param payload.d The ordering date of the last vertex returned, index strategy only.
1738
- * @param payload.i The id of the last vertex returned, index strategy only.
1739
- * @param payload.c The storage connector cursor, vertex strategy only.
1740
- * @returns The encoded cursor, or undefined when there is no further page.
1741
- * @internal
1742
- */
1743
- encodeCursor(payload) {
1744
- return Converter.bytesToBase64(ObjectHelper.toBytes(payload));
1745
- }
1746
- /**
1747
- * Decode a cursor produced by encodeCursor.
1748
- * @param strategy The strategy the current query is using.
1749
- * @param cursor The cursor supplied by the caller.
1750
- * @returns The decoded payload, or undefined when no cursor was supplied.
1751
- * @throws GeneralError If the cursor is malformed or belongs to a different strategy.
1752
- * @internal
1753
- */
1754
- decodeCursor(strategy, cursor) {
1755
- if (!Is.stringValue(cursor)) {
1756
- return undefined;
1757
- }
1758
- let decoded;
1759
- if (Is.stringBase64(cursor)) {
1760
- try {
1761
- decoded = ObjectHelper.fromBytes(Converter.base64ToBytes(cursor));
1762
- }
1763
- catch (error) {
1764
- // Base64 which is not an encoded cursor is still only an invalid cursor, so every
1765
- // malformed cursor reports the same failure rather than leaking a parse error.
1766
- throw new GeneralError(AuditableItemGraphService.CLASS_NAME, "invalidCursor", undefined, error);
1767
- }
1768
- }
1769
- // A cursor from a different strategy cannot be applied to this query, and silently
1770
- // restarting from the first page would loop a caller which keeps following the cursor.
1771
- const populated = decoded?.s === strategy &&
1772
- (strategy === "v"
1773
- ? Is.stringValue(decoded.c)
1774
- : Is.stringValue(decoded.d) && Is.stringValue(decoded.i));
1775
- if (!populated) {
1776
- throw new GeneralError(AuditableItemGraphService.CLASS_NAME, "invalidCursor");
1777
- }
1778
- return decoded;
1779
- }
1780
1715
  /**
1781
1716
  * Build the condition matching one index type and value.
1782
1717
  * @param type The index type to match.
1783
1718
  * @param comparison The comparison to apply to the value.
1784
- * @param value The index value to match, already lower cased.
1719
+ * @param value The index value or values to match, already lower cased.
1785
1720
  * @returns The condition.
1786
1721
  * @internal
1787
1722
  */
@@ -1795,170 +1730,57 @@ export class AuditableItemGraphService {
1795
1730
  };
1796
1731
  }
1797
1732
  /**
1798
- * Build the condition which resumes an index scan after a position.
1799
- * Every entry for a vertex carries the same date and vertex id, so a position on that pair
1800
- * steps past all the remaining entries of the vertex it names.
1801
- * @param orderProperty The index date property being ordered by.
1802
- * @param orderDirection The direction being ordered in.
1803
- * @param lastDate The date of the last vertex returned.
1804
- * @param lastVertexId The id of the last vertex returned.
1805
- * @returns The condition.
1733
+ * Combine conditions so that matching any one of them is enough.
1734
+ * @param conditions The conditions to combine.
1735
+ * @returns The single condition when only one was given, otherwise their union.
1806
1736
  * @internal
1807
1737
  */
1808
- indexKeySetCondition(orderProperty, orderDirection, lastDate, lastVertexId) {
1809
- const dateComparison = orderDirection === SortDirection.Ascending
1810
- ? ComparisonOperator.GreaterThan
1811
- : ComparisonOperator.LessThan;
1812
- return {
1813
- logicalOperator: LogicalOperator.Or,
1814
- conditions: [
1815
- { property: orderProperty, comparison: dateComparison, value: lastDate },
1816
- {
1817
- logicalOperator: LogicalOperator.And,
1818
- conditions: [
1819
- { property: orderProperty, comparison: ComparisonOperator.Equals, value: lastDate },
1820
- {
1821
- property: "vertexId",
1822
- comparison: ComparisonOperator.GreaterThan,
1823
- value: lastVertexId
1824
- }
1825
- ]
1826
- }
1827
- ]
1828
- };
1738
+ anyOfConditions(conditions) {
1739
+ return conditions.length === 1
1740
+ ? conditions[0]
1741
+ : { logicalOperator: LogicalOperator.Or, conditions };
1829
1742
  }
1830
1743
  /**
1831
- * Read one page of distinct vertex ids from the index storage using a key set, so a broad
1832
- * match is never drained into memory however many entries it has.
1833
- * @param predicates The type and value conditions to match, combined with OR.
1744
+ * Read one page of vertices whose index entries satisfy every dimension. The entries of a
1745
+ * vertex are grouped so it appears once however many of them match, its vertex is joined to
1746
+ * the page so no second read is needed, and the connector pages the groups with its own cursor.
1747
+ * @param dimensions The index conditions, a vertex has to satisfy every one of them.
1834
1748
  * @param orderProperty The index date property to order by.
1835
1749
  * @param orderDirection The direction to order in.
1836
- * @param keySet The position returned by the previous page.
1837
- * @param keySet.d The ordering date of the last vertex returned.
1838
- * @param keySet.i The id of the last vertex returned.
1839
- * @param limit The maximum number of distinct vertices to return.
1840
- * @returns The vertex ids in order, the position to resume from, and whether more remain.
1750
+ * @param propertiesToReturn The vertex properties to return.
1751
+ * @param conditions Additional conditions the vertices must match.
1752
+ * @param cursor The cursor returned by the previous page.
1753
+ * @param limit The maximum number of vertices to return.
1754
+ * @returns The vertices in order and the cursor for the next page.
1841
1755
  * @internal
1842
1756
  */
1843
- async queryIndexVertexIdPage(predicates, orderProperty, orderDirection, keySet, limit) {
1844
- const pageSize = limit ?? AuditableItemGraphService._DEFAULT_PAGE_SIZE;
1845
- const match = predicates.length === 1
1846
- ? predicates[0]
1847
- : { logicalOperator: LogicalOperator.Or, conditions: predicates };
1848
- const vertexIds = [];
1849
- const positions = [];
1850
- const seen = new Set();
1851
- let scan = keySet;
1852
- let exhausted = false;
1853
- // One extra vertex is collected to tell whether a further page exists. Each pass either
1854
- // adds a vertex or exhausts the match, so this runs at most pageSize + 1 times.
1855
- while (vertexIds.length <= pageSize && !exhausted) {
1856
- const conditions = [match];
1857
- if (Is.stringValue(scan?.d) && Is.stringValue(scan?.i)) {
1858
- conditions.push(this.indexKeySetCondition(orderProperty, orderDirection, scan.d, scan.i));
1859
- }
1860
- const results = await this._vertexIndexStorage.query({ logicalOperator: LogicalOperator.And, conditions }, [
1757
+ async queryIndexVertices(dimensions, orderProperty, orderDirection, propertiesToReturn, conditions, cursor, limit) {
1758
+ // An entry only ever satisfies one dimension, so the entries of every dimension have to
1759
+ // survive into the group for the group conditions to find them there, which is why the
1760
+ // conditions are their union and the dimensions are applied across the group.
1761
+ const results = await this._vertexIndexStorage.queryJoin(this._vertexStorage, {
1762
+ property: "vertexId",
1763
+ joinProperty: "id",
1764
+ groupProperty: "vertexId",
1765
+ conditions: this.anyOfConditions(dimensions),
1766
+ groupConditions: dimensions.length > 1 ? dimensions : undefined,
1767
+ sortProperties: [
1861
1768
  { property: orderProperty, sortDirection: orderDirection },
1862
1769
  { property: "vertexId", sortDirection: SortDirection.Ascending }
1863
- ], ["vertexId", orderProperty], undefined, pageSize + 1);
1864
- if (results.entities.length === 0) {
1865
- exhausted = true;
1866
- }
1867
- for (const entity of results.entities) {
1868
- const entityDate = entity[orderProperty];
1869
- if (Is.stringValue(entity.vertexId) && Is.stringValue(entityDate)) {
1870
- const position = { d: entityDate, i: entity.vertexId };
1871
- scan = position;
1872
- if (!seen.has(entity.vertexId) && vertexIds.length <= pageSize) {
1873
- seen.add(entity.vertexId);
1874
- vertexIds.push(entity.vertexId);
1875
- positions.push(position);
1876
- }
1877
- }
1878
- }
1879
- }
1880
- let hasMore = false;
1881
- if (vertexIds.length > pageSize) {
1882
- vertexIds.length = pageSize;
1883
- positions.length = pageSize;
1884
- hasMore = true;
1885
- }
1770
+ ],
1771
+ properties: ["vertexId"],
1772
+ joinConditions: conditions,
1773
+ joinRequired: true,
1774
+ joinProperties: propertiesToReturn,
1775
+ cursor,
1776
+ limit
1777
+ });
1778
+ // The join is required, so every group which survived carries its vertex.
1886
1779
  return {
1887
- vertexIds,
1888
- keySet: positions.length > 0 ? positions[positions.length - 1] : undefined,
1889
- hasMore
1780
+ entities: results.entities.map(entity => entity.joined[0]),
1781
+ cursor: results.cursor
1890
1782
  };
1891
1783
  }
1892
- /**
1893
- * Narrow a page of vertex ids to those which also carry one of the resource types.
1894
- * @param vertexIds The candidate vertex ids.
1895
- * @param resourceTypes The resource types to match, already lower cased.
1896
- * @returns The matching vertex ids, keeping the incoming order.
1897
- * @internal
1898
- */
1899
- async filterVertexIdsByResourceTypes(vertexIds, resourceTypes) {
1900
- if (vertexIds.length === 0) {
1901
- return [];
1902
- }
1903
- const results = await this._vertexIndexStorage.query({
1904
- logicalOperator: LogicalOperator.And,
1905
- conditions: [
1906
- {
1907
- property: "type",
1908
- comparison: ComparisonOperator.Equals,
1909
- value: AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE
1910
- },
1911
- { property: "value", comparison: ComparisonOperator.In, value: resourceTypes },
1912
- { property: "vertexId", comparison: ComparisonOperator.In, value: vertexIds }
1913
- ]
1914
- }, undefined, ["vertexId"], undefined, vertexIds.length * resourceTypes.length);
1915
- const matched = new Set();
1916
- for (const entity of results.entities) {
1917
- if (Is.stringValue(entity.vertexId)) {
1918
- matched.add(entity.vertexId);
1919
- }
1920
- }
1921
- return vertexIds.filter(vertexId => matched.has(vertexId));
1922
- }
1923
- /**
1924
- * Read the vertices for a page of ids, keeping the order the ids were given in.
1925
- * @param vertexIds The vertex ids to read.
1926
- * @param propertiesToReturn The vertex properties to return.
1927
- * @param conditions Additional conditions the vertices must match.
1928
- * @returns The vertices which exist and match, in the order of the ids.
1929
- * @internal
1930
- */
1931
- async fetchVerticesInOrder(vertexIds, propertiesToReturn, conditions) {
1932
- if (vertexIds.length === 0) {
1933
- return [];
1934
- }
1935
- const idCondition = {
1936
- property: "id",
1937
- comparison: ComparisonOperator.In,
1938
- value: vertexIds
1939
- };
1940
- const results = await this._vertexStorage.query(Is.empty(conditions)
1941
- ? idCondition
1942
- : {
1943
- logicalOperator: LogicalOperator.And,
1944
- conditions: [idCondition, conditions]
1945
- }, undefined, propertiesToReturn, undefined, vertexIds.length);
1946
- // An In lookup has no guaranteed order, so the index ordering is reapplied here.
1947
- const vertexById = new Map();
1948
- for (const entity of results.entities) {
1949
- if (Is.stringValue(entity.id)) {
1950
- vertexById.set(entity.id, entity);
1951
- }
1952
- }
1953
- const ordered = [];
1954
- for (const vertexId of vertexIds) {
1955
- const entity = vertexById.get(vertexId);
1956
- if (!Is.empty(entity)) {
1957
- ordered.push(entity);
1958
- }
1959
- }
1960
- return ordered;
1961
- }
1962
1784
  /**
1963
1785
  * Query all the pages of the vertex index storage which match the conditions.
1964
1786
  * @param conditions The conditions to match.
@@ -1 +1 @@
1
- {"version":3,"file":"auditableItemGraphService.js","sourceRoot":"","sources":["../../src/auditableItemGraphService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHealthCategory,\n\tHealthStatus,\n\ttype HealthApplicationCallback,\n\ttype IHealth,\n\ttype IHealthProviderComponent\n} from \"@twin.org/api-models\";\nimport {\n\tAuditableItemGraphAuditMode,\n\tAuditableItemGraphContexts,\n\tAuditableItemGraphDataTypes,\n\tAuditableItemGraphMetricIds,\n\tAuditableItemGraphMetrics,\n\tAuditableItemGraphTopics,\n\tAuditableItemGraphTypes,\n\tVerifyDepth,\n\ttype IAuditableItemGraphAlias,\n\ttype IAuditableItemGraphChangeset,\n\ttype IAuditableItemGraphChangesetList,\n\ttype IAuditableItemGraphComponent,\n\ttype IAuditableItemGraphEdge,\n\ttype IAuditableItemGraphEventBusVertexCreated,\n\ttype IAuditableItemGraphEventBusVertexUpdated,\n\ttype IAuditableItemGraphListPatch,\n\ttype IAuditableItemGraphPartialVertex,\n\ttype IAuditableItemGraphResource,\n\ttype IAuditableItemGraphVertex,\n\ttype IAuditableItemGraphVertexList,\n\ttype IAuditableItemGraphVertexVersionList\n} from \"@twin.org/auditable-item-graph-models\";\nimport { ContextIdHelper, ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tBaseError,\n\tCoerce,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tMutex,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tStringHelper,\n\tUrn,\n\tValidation,\n\ttype IPatchOperation,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { DataTypeHelper } from \"@twin.org/data-core\";\nimport {\n\tJsonLdDataTypes,\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tComparisonOperator,\n\tLogicalOperator,\n\tSortDirection,\n\ttype EntityCondition,\n\ttype IComparator\n} from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IEventBusComponent } from \"@twin.org/event-bus-models\";\nimport {\n\tImmutableProofContexts,\n\tImmutableProofFailure,\n\tImmutableProofTypes,\n\ttype IImmutableProofComponent,\n\ttype IImmutableProofVerification\n} from \"@twin.org/immutable-proof-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport type { AuditableItemGraphAlias } from \"./entities/auditableItemGraphAlias.js\";\nimport type { AuditableItemGraphChangeset } from \"./entities/auditableItemGraphChangeset.js\";\nimport type { AuditableItemGraphEdge } from \"./entities/auditableItemGraphEdge.js\";\nimport type { AuditableItemGraphResource } from \"./entities/auditableItemGraphResource.js\";\nimport type { AuditableItemGraphVertex } from \"./entities/auditableItemGraphVertex.js\";\nimport type { AuditableItemGraphVertexIndex } from \"./entities/auditableItemGraphVertexIndex.js\";\nimport type { IAuditableItemGraphServiceConstructorOptions } from \"./models/IAuditableItemGraphServiceConstructorOptions.js\";\nimport type { IAuditableItemGraphServiceContext } from \"./models/IAuditableItemGraphServiceContext.js\";\n\n/**\n * Class for performing auditable item graph operations.\n */\nexport class AuditableItemGraphService\n\timplements IAuditableItemGraphComponent, IHealthProviderComponent\n{\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<AuditableItemGraphService>();\n\n\t/**\n\t * The namespace for the service.\n\t * @internal\n\t */\n\tpublic static readonly NAMESPACE: string = \"aig\";\n\n\t/**\n\t * The namespace for the service changeset.\n\t */\n\tpublic static readonly NAMESPACE_CHANGESET: string = \"changeset\";\n\n\t/**\n\t * The namespace for the service edge.\n\t */\n\tpublic static readonly NAMESPACE_EDGE: string = \"edge\";\n\n\t/**\n\t * The number of vertices returned by a query when the caller gives no limit.\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_PAGE_SIZE: number = 40;\n\n\t/**\n\t * The index type for the id of the vertex itself.\n\t * @internal\n\t */\n\tprivate static readonly _INDEX_TYPE_VERTEX: string = \"vertex\";\n\n\t/**\n\t * The index type for vertex aliases.\n\t * @internal\n\t */\n\tprivate static readonly _INDEX_TYPE_ALIAS: string = \"alias\";\n\n\t/**\n\t * The index type for vertex resource types.\n\t * @internal\n\t */\n\tprivate static readonly _INDEX_TYPE_RESOURCE_TYPE: string = \"resourceType\";\n\n\t/**\n\t * The keys to pick when creating the proof for the stream.\n\t * @internal\n\t */\n\tprivate static readonly _PROOF_KEYS_CHANGESET: (keyof AuditableItemGraphChangeset)[] = [\n\t\t\"id\",\n\t\t\"vertexId\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\",\n\t\t\"patches\"\n\t];\n\n\t/**\n\t * The immutable proof component.\n\t * @internal\n\t */\n\tprivate readonly _immutableProofComponent: IImmutableProofComponent;\n\n\t/**\n\t * The entity storage for vertices.\n\t * @internal\n\t */\n\tprivate readonly _vertexStorage: IEntityStorageConnector<AuditableItemGraphVertex>;\n\n\t/**\n\t * The entity storage for vertex indices.\n\t * @internal\n\t */\n\tprivate readonly _vertexIndexStorage: IEntityStorageConnector<AuditableItemGraphVertexIndex>;\n\n\t/**\n\t * The entity storage for changesets.\n\t * @internal\n\t */\n\tprivate readonly _changesetStorage: IEntityStorageConnector<AuditableItemGraphChangeset>;\n\n\t/**\n\t * The event bus component.\n\t * @internal\n\t */\n\tprivate readonly _eventBusComponent?: IEventBusComponent;\n\n\t/**\n\t * The telemetry component.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * The timeout in milliseconds when acquiring a mutex lock.\n\t * @internal\n\t */\n\tprivate readonly _mutexTimeoutMs?: number;\n\n\t/**\n\t * Create a new instance of AuditableItemGraphService.\n\t * @param options The dependencies for the auditable item graph connector.\n\t */\n\tconstructor(options?: IAuditableItemGraphServiceConstructorOptions) {\n\t\tthis._immutableProofComponent = ComponentFactory.get(\n\t\t\toptions?.immutableProofComponentType ?? \"immutable-proof\"\n\t\t);\n\n\t\tthis._vertexStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.vertexEntityStorageType ?? nameofKebabCase<AuditableItemGraphVertex>()\n\t\t);\n\n\t\tthis._vertexIndexStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.vertexIndexEntityStorageType ?? nameofKebabCase<AuditableItemGraphVertexIndex>()\n\t\t);\n\n\t\tthis._changesetStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.changesetEntityStorageType ?? nameofKebabCase<AuditableItemGraphChangeset>()\n\t\t);\n\n\t\tthis._eventBusComponent = ComponentFactory.getIfExists<IEventBusComponent>(\n\t\t\toptions?.eventBusComponentType\n\t\t);\n\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\n\t\tthis._mutexTimeoutMs = Coerce.integer(options?.config?.mutexTimeoutMs);\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tAuditableItemGraphDataTypes.registerTypes();\n\t\tJsonLdDataTypes.registerTypes();\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn AuditableItemGraphService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Runs a set/get/remove cycle against the vertex entity storage using the organisation identity\n\t * from the current context.\n\t * @param callback The callback to invoke when a deferred health result is ready.\n\t * @returns The health status of the service.\n\t */\n\tpublic async healthApplication(\n\t\tcallback: HealthApplicationCallback\n\t): Promise<IHealth[] | undefined> {\n\t\tconst contextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\tconst orgId = contextIds[ContextIdKeys.Organization];\n\n\t\tif (!Is.stringValue(orgId)) {\n\t\t\treturn [];\n\t\t}\n\n\t\ttry {\n\t\t\tconst healthVertex = {\n\t\t\t\tid: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\torganizationIdentity: orgId,\n\t\t\t\tdateCreated: new Date().toISOString()\n\t\t\t};\n\t\t\tawait this._vertexStorage.set(healthVertex);\n\t\t\tawait this._vertexStorage.get(healthVertex.id);\n\t\t\tawait this._vertexStorage.remove(healthVertex.id);\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: AuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\tdescription: \"healthDescription\"\n\t\t\t\t}\n\t\t\t];\n\t\t} catch (error) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: AuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"getVertexFailed\",\n\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t}\n\n\t/**\n\t * Register all AIG metrics with the telemetry component.\n\t * @returns A promise that resolves when all metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, AuditableItemGraphMetrics);\n\t}\n\n\t/**\n\t * Create a new graph vertex.\n\t * @param vertex The vertex to create.\n\t * @param vertex.auditMode How the mutations of the vertex are recorded, defaults to audited.\n\t * @param vertex.annotationObject The annotation object for the vertex as JSON-LD.\n\t * @param vertex.aliases Alternative aliases that can be used to identify the vertex.\n\t * @param vertex.resources The resources attached to the vertex.\n\t * @param vertex.edges The edges connected to the vertex.\n\t * @returns The id of the new graph item.\n\t */\n\tpublic async create(vertex: Omit<IAuditableItemGraphVertex, \"id\">): Promise<string> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\t\tif (Is.notEmpty(vertex.auditMode)) {\n\t\t\tGuards.arrayOneOf(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex.auditMode),\n\t\t\t\tvertex.auditMode,\n\t\t\t\tObject.values(AuditableItemGraphAuditMode)\n\t\t\t);\n\t\t}\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\ttry {\n\t\t\tconst id = RandomHelper.generateUuidV7(\"compact\");\n\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(vertex),\n\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t{\n\t\t\t\t\t...vertex,\n\t\t\t\t\tid\n\t\t\t\t},\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst ownerOrganizationId =\n\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];\n\n\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\torganizationIdentity: ownerOrganizationId,\n\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t};\n\n\t\t\tconst vertexModel: AuditableItemGraphVertex = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: contextIds[ContextIdKeys.Organization],\n\t\t\t\tdateCreated: context.now\n\t\t\t};\n\t\t\tconst originalEntity = ObjectHelper.clone(vertexModel);\n\n\t\t\tvertexModel.auditMode = vertex.auditMode;\n\t\t\tvertexModel.annotationObject = vertex.annotationObject;\n\n\t\t\tawait this.updateAliasList(context, vertexModel, vertex.aliases);\n\t\t\tawait this.updateResourceList(context, vertexModel, vertex.resources);\n\t\t\tawait this.updateEdgeList(context, vertexModel, vertex.edges);\n\n\t\t\t// Bypass vertices keep no changeset history, so there is no baseline version to record.\n\t\t\tif (vertex.auditMode !== AuditableItemGraphAuditMode.Bypass) {\n\t\t\t\tawait this.addChangeset(context, originalEntity, vertexModel, true, 0);\n\n\t\t\t\tvertexModel.version = 0;\n\t\t\t}\n\n\t\t\tawait this._vertexStorage.set(vertexModel);\n\t\t\tawait this.syncVertexIndexes(vertexModel);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesCreated\n\t\t\t);\n\n\t\t\tconst fullId = new Urn(AuditableItemGraphService.NAMESPACE, id).toString();\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexCreated>(\n\t\t\t\tAuditableItemGraphTopics.VertexCreated,\n\t\t\t\t{ id: fullId }\n\t\t\t);\n\n\t\t\treturn fullId;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"createFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update a graph vertex (PUT - full replacement of vertex state).\n\t * Concurrent updates for the same vertex are serialized via `Mutex` on the vertex id.\n\t * @param vertex The vertex to update.\n\t * @returns A promise that resolves when the vertex has been updated.\n\t * @throws GeneralError If a bypass vertex is being switched back to audited.\n\t */\n\tpublic async update(vertex: IAuditableItemGraphVertex): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(vertex.id), vertex.id);\n\t\tif (Is.notEmpty(vertex.auditMode)) {\n\t\t\tGuards.arrayOneOf(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex.auditMode),\n\t\t\t\tvertex.auditMode,\n\t\t\t\tObject.values(AuditableItemGraphAuditMode)\n\t\t\t);\n\t\t}\n\n\t\tconst vertexId = this.parseVertexId(vertex.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\t\tawait DataTypeHelper.validate(\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t\tvertex,\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tvertex.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\t\tconst ownerOrganizationId =\n\t\t\t\t\tvertexEntity.organizationIdentity ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.Organization];\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\torganizationIdentity: ownerOrganizationId,\n\t\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t\t};\n\n\t\t\t\tconst auditModeTransition = this.resolveAuditModeTransition(vertexEntity, vertex.auditMode);\n\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tnewEntity.annotationObject = vertex.annotationObject;\n\t\t\t\tawait this.updateAliasList(context, newEntity, vertex.aliases);\n\t\t\t\tawait this.updateResourceList(context, newEntity, vertex.resources);\n\t\t\t\tawait this.updateEdgeList(context, newEntity, vertex.edges);\n\n\t\t\t\tawait this.persistVertexChanges(\n\t\t\t\t\tcontext,\n\t\t\t\t\tvertexId,\n\t\t\t\t\tvertex.id,\n\t\t\t\t\toriginalEntity,\n\t\t\t\t\tnewEntity,\n\t\t\t\t\tauditModeTransition\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Partially update a graph vertex (PATCH - explicit list patches; only defined properties applied).\n\t * Serialized with `update` via `Mutex` on the same vertex id within this instance.\n\t * @param partial The partial vertex update.\n\t * @returns A promise that resolves when the partial update has been applied.\n\t * @throws GeneralError If a bypass vertex is being switched back to audited.\n\t */\n\tpublic async updatePartial(partial: IAuditableItemGraphPartialVertex): Promise<void> {\n\t\tGuards.object<IAuditableItemGraphPartialVertex>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(partial),\n\t\t\tpartial\n\t\t);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(partial.id), partial.id);\n\t\tif (Is.notEmpty(partial.auditMode)) {\n\t\t\tGuards.arrayOneOf(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(partial.auditMode),\n\t\t\t\tpartial.auditMode,\n\t\t\t\tObject.values(AuditableItemGraphAuditMode)\n\t\t\t);\n\t\t}\n\n\t\tconst vertexId = this.parseVertexId(partial.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tpartial.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (partial.annotationObject !== undefined && Is.object(partial.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(partial.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(partial.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\t\tconst ownerOrganizationId =\n\t\t\t\t\tvertexEntity.organizationIdentity ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.Organization];\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\torganizationIdentity: ownerOrganizationId,\n\t\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t\t};\n\n\t\t\t\tconst auditModeTransition = this.resolveAuditModeTransition(\n\t\t\t\t\tvertexEntity,\n\t\t\t\t\tpartial.auditMode\n\t\t\t\t);\n\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tif (partial.annotationObject !== undefined) {\n\t\t\t\t\tnewEntity.annotationObject = partial.annotationObject;\n\t\t\t\t}\n\t\t\t\tif (partial.aliasPatches !== undefined) {\n\t\t\t\t\tconst aliasPatch = this.validateListPatch<IAuditableItemGraphAlias>(\n\t\t\t\t\t\tnameof(partial.aliasPatches),\n\t\t\t\t\t\tpartial.aliasPatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyAliasPatch(context, newEntity, aliasPatch);\n\t\t\t\t}\n\t\t\t\tif (partial.resourcePatches !== undefined) {\n\t\t\t\t\tconst resourcePatch = this.validateListPatch<IAuditableItemGraphResource>(\n\t\t\t\t\t\tnameof(partial.resourcePatches),\n\t\t\t\t\t\tpartial.resourcePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyResourcePatch(context, newEntity, resourcePatch);\n\t\t\t\t}\n\t\t\t\tif (partial.edgePatches !== undefined) {\n\t\t\t\t\tconst edgePatch = this.validateListPatch<IAuditableItemGraphEdge>(\n\t\t\t\t\t\tnameof(partial.edgePatches),\n\t\t\t\t\t\tpartial.edgePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyEdgePatch(context, newEntity, edgePatch);\n\t\t\t\t}\n\n\t\t\t\tawait this.persistVertexChanges(\n\t\t\t\t\tcontext,\n\t\t\t\t\tvertexId,\n\t\t\t\t\tpartial.id,\n\t\t\t\t\toriginalEntity,\n\t\t\t\t\tnewEntity,\n\t\t\t\t\tauditModeTransition\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeDeleted Whether to include deleted/updated aliases, resource, edges, defaults to false.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\n\t\t\t// Bypass vertices have no changesets to verify, so verification is never reported for them.\n\t\t\tconst verifySignatureDepth = this.isBypass(vertexEntity)\n\t\t\t\t? VerifyDepth.None\n\t\t\t\t: (options?.verifySignatureDepth ?? VerifyDepth.None);\n\n\t\t\tlet verified: boolean | undefined;\n\n\t\t\tif (\n\t\t\t\tverifySignatureDepth === VerifyDepth.Current ||\n\t\t\t\tverifySignatureDepth === VerifyDepth.All\n\t\t\t) {\n\t\t\t\tconst verifyResult = await this.verifyChangesets(vertexModel, verifySignatureDepth);\n\t\t\t\tverified = verifyResult.verified;\n\t\t\t\tvertexModel[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tif (!(options?.includeDeleted ?? false)) {\n\t\t\t\tif (Is.arrayValue(vertexModel.aliases)) {\n\t\t\t\t\tvertexModel.aliases = vertexModel.aliases.filter(a => Is.undefined(a.dateDeleted));\n\t\t\t\t\tif (vertexModel.aliases.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.aliases;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.resources)) {\n\t\t\t\t\tvertexModel.resources = vertexModel.resources.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.resources.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.resources;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.edges)) {\n\t\t\t\t\tvertexModel.edges = vertexModel.edges.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.edges.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.edges;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tvertexModel.verified = verified;\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset list.\n\t * @param id The id of the vertex to get.\n\t * @param cursor The optional cursor to get next chunk.\n\t * @param limit Limit the number of entities to return.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangesets(\n\t\tid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangesetList;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\t// Bypass vertices maintain no changeset history.\n\t\t\tconst chunk = this.isBypass(vertexEntity)\n\t\t\t\t? { changesets: [], verified: true, cursor: undefined }\n\t\t\t\t: await this.verifyChangesetChunk(\n\t\t\t\t\t\tvertexId,\n\t\t\t\t\t\toptions?.verifySignatureDepth ?? VerifyDepth.None,\n\t\t\t\t\t\tcursor,\n\t\t\t\t\t\tlimit\n\t\t\t\t\t);\n\n\t\t\tif (\n\t\t\t\t!this.isBypass(vertexEntity) &&\n\t\t\t\t(options?.verifySignatureDepth ?? VerifyDepth.None) !== VerifyDepth.None\n\t\t\t) {\n\t\t\t\tif (chunk.verified) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst changesetList: IAuditableItemGraphChangesetList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.ChangesetList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: chunk.changesets\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetList, changesetList[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tchangesets: result,\n\t\t\t\tcursor: chunk.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangeset(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphChangeset> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst namespaceSpecificParts = urnParsed.namespaceSpecificParts();\n\t\t\tconst vertexId = namespaceSpecificParts[0];\n\t\t\tconst changesetId = namespaceSpecificParts[2];\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\t// Bypass vertices maintain no changeset history.\n\t\t\tif (this.isBypass(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"changesetNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetEntity = await this._changesetStorage.get(changesetId);\n\t\t\tif (Is.empty(changesetEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"changesetNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetModel = this.changesetEntityToJsonLd(vertexId, changesetEntity);\n\n\t\t\tconst verifySignatureDepth = options?.verifySignatureDepth ?? VerifyDepth.None;\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tchangesetModel[\"@context\"]?.push(ImmutableProofContexts.Context);\n\t\t\t\tchangesetModel.verification = await this.verifyChangesetSignature(changesetModel);\n\t\t\t\tif (changesetModel.verification?.verified) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfailureReason: changesetModel.verification?.failure\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetModel, changesetModel[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex at a specific version.\n\t * @param id The id of the vertex.\n\t * @param version The version number to retrieve.\n\t * @returns The vertex reconstructed at that version.\n\t * @throws NotFoundError if the vertex or version is not found, a bypass vertex never has versions.\n\t */\n\tpublic async getVersion(id: string, version: number): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\t\tGuards.integer(AuditableItemGraphService.CLASS_NAME, nameof(version), version);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\t// Bypass vertices maintain no version chain.\n\t\t\tif (this.isBypass(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"versionNotFound\",\n\t\t\t\t\tversion.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst currentVersion = vertexEntity.version ?? 0;\n\t\t\tif (version > currentVersion || version < 0) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"versionNotFound\",\n\t\t\t\t\tversion.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Short circuit if requesting the current version to avoid unnecessary changeset retrieval and patching\n\t\t\tif (version === currentVersion) {\n\t\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\t\t\t\tvertexModel.version = version;\n\t\t\t\treturn await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"], {\n\t\t\t\t\tcompactArrays: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst changesets = await this.internalGetChangesets(vertexId, [\"patches\"], {\n\t\t\t\tmaxVersion: version\n\t\t\t});\n\n\t\t\tlet entityState: AuditableItemGraphVertex = {\n\t\t\t\tid: vertexEntity.id,\n\t\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\t\torganizationIdentity: vertexEntity.organizationIdentity\n\t\t\t};\n\t\t\tfor (const changeset of changesets) {\n\t\t\t\tentityState = JsonHelper.patch(entityState, changeset.patches);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(entityState);\n\t\t\tvertexModel.version = version;\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get all versions of a graph vertex.\n\t * @param id The id of the vertex.\n\t * @param options Additional options for the operation.\n\t * @param options.after Only return versions created after this ISO 8601 timestamp (exclusive).\n\t * @param options.before Only return versions created before this ISO 8601 timestamp (exclusive).\n\t * @returns The list of vertex versions, a bypass vertex returns a single baseline entry for its\n\t * current state when that falls within the requested range.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getVersions(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tafter?: string;\n\t\t\tbefore?: string;\n\t\t}\n\t): Promise<IAuditableItemGraphVertexVersionList> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst beforeDate = Coerce.dateTime(options?.before);\n\t\t\tconst afterDate = Coerce.dateTime(options?.after);\n\n\t\t\tconst versions = this.isBypass(vertexEntity)\n\t\t\t\t? this.bypassVersions(vertexEntity, afterDate, beforeDate)\n\t\t\t\t: await this.auditedVersions(vertexId, afterDate, beforeDate);\n\n\t\t\tconst versionList: IAuditableItemGraphVertexVersionList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexVersionList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: versions\n\t\t\t};\n\n\t\t\treturn await JsonLdProcessor.compact(versionList, versionList[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the proof for an item.\n\t * @param id The id of the vertex to remove the proof from.\n\t * @returns A promise that resolves when the proof has been removed from all changesets.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeProof(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst vertexId = this.parseVertexId(id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });\n\n\t\ttry {\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tlet changesetsResult;\n\t\t\tdo {\n\t\t\t\tchangesetsResult = await this._changesetStorage.query(\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\tvalue: vertexId,\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tundefined,\n\t\t\t\t\tchangesetsResult?.cursor\n\t\t\t\t);\n\n\t\t\t\tfor (const changeset of changesetsResult.entities) {\n\t\t\t\t\tif (Is.stringValue(changeset.proofId)) {\n\t\t\t\t\t\tawait this._immutableProofComponent.removeNotarization(changeset.proofId);\n\t\t\t\t\t\tdelete changeset.proofId;\n\t\t\t\t\t\tawait this._changesetStorage.set(changeset as AuditableItemGraphChangeset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(changesetsResult.cursor));\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"removeProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Query the graph for vertices.\n\t * @param options The query options.\n\t * @param options.id The optional id to look for.\n\t * @param options.idMode Look in id, alias or both, defaults to both.\n\t * @param options.idExact Find only exact matches, default to false meaning partial matching.\n\t * @param options.resourceTypes Include vertices with specific resource types.\n\t * @param conditions Conditions to use in the query.\n\t * @param orderBy The order for the results, defaults to created.\n\t * @param orderByDirection The direction for the order, defaults to desc.\n\t * @param properties The properties to return, if not provided defaults to id, created, aliases and object.\n\t * @param cursor The cursor to request the next chunk of entities.\n\t * @param limit The maximum number of entities to return, a page can contain fewer so follow\n\t * the cursor until it is absent to read them all.\n\t * @returns The entities, which can be partial if a limited keys list was provided.\n\t */\n\tpublic async query(\n\t\toptions?: {\n\t\t\tid?: string;\n\t\t\tidMode?: \"id\" | \"alias\" | \"both\";\n\t\t\tidExact?: boolean;\n\t\t\tresourceTypes?: string[];\n\t\t},\n\t\tconditions?: EntityCondition<IAuditableItemGraphVertex>,\n\t\torderBy?: keyof Pick<IAuditableItemGraphVertex, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tproperties?: (keyof IAuditableItemGraphVertex)[],\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemGraphVertexList;\n\t\tcursor?: string;\n\t}> {\n\t\ttry {\n\t\t\tconst propertiesToReturn: (keyof IAuditableItemGraphVertex)[] = properties ?? [\n\t\t\t\t\"id\",\n\t\t\t\t\"dateCreated\",\n\t\t\t\t\"dateModified\",\n\t\t\t\t\"aliases\",\n\t\t\t\t\"annotationObject\"\n\t\t\t];\n\n\t\t\tconst orderProperty = orderBy ?? \"dateCreated\";\n\t\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\t\t\tconst idExact = options?.idExact ?? false;\n\t\t\tconst idOrAlias = options?.id;\n\t\t\tconst idMode = options?.idMode ?? \"both\";\n\t\t\tconst resourceTypes = options?.resourceTypes;\n\t\t\tconst hasIdFilter = Is.stringValue(idOrAlias);\n\t\t\tconst hasResourceTypes = Is.arrayValue(resourceTypes);\n\n\t\t\tif (!propertiesToReturn.includes(\"id\")) {\n\t\t\t\tpropertiesToReturn.unshift(\"id\");\n\t\t\t}\n\n\t\t\t// Every id, alias and resource type match is held in the index storage, which carries\n\t\t\t// the ordering dates so it can page its own matches by key set. Nothing is drained into\n\t\t\t// memory, so a term matching a very large number of entries costs one page.\n\t\t\tconst indexPredicates: EntityCondition<AuditableItemGraphVertexIndex>[] = [];\n\n\t\t\tif (hasIdFilter) {\n\t\t\t\tconst comparison = idExact ? ComparisonOperator.Equals : ComparisonOperator.Includes;\n\t\t\t\tconst term = idOrAlias.toLowerCase();\n\t\t\t\tif (idMode === \"id\" || idMode === \"both\") {\n\t\t\t\t\tindexPredicates.push(\n\t\t\t\t\t\tthis.indexTypeValueCondition(\n\t\t\t\t\t\t\tAuditableItemGraphService._INDEX_TYPE_VERTEX,\n\t\t\t\t\t\t\tcomparison,\n\t\t\t\t\t\t\tterm\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (idMode === \"alias\" || idMode === \"both\") {\n\t\t\t\t\tindexPredicates.push(\n\t\t\t\t\t\tthis.indexTypeValueCondition(\n\t\t\t\t\t\t\tAuditableItemGraphService._INDEX_TYPE_ALIAS,\n\t\t\t\t\t\t\tcomparison,\n\t\t\t\t\t\t\tterm\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (hasResourceTypes) {\n\t\t\t\tfor (const resourceType of resourceTypes) {\n\t\t\t\t\tindexPredicates.push(\n\t\t\t\t\t\tthis.indexTypeValueCondition(\n\t\t\t\t\t\t\tAuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE,\n\t\t\t\t\t\t\tComparisonOperator.Equals,\n\t\t\t\t\t\t\tresourceType.toLowerCase()\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (indexPredicates.length > 0) {\n\t\t\t\tconst indexPage = await this.queryIndexVertexIdPage(\n\t\t\t\t\tindexPredicates,\n\t\t\t\t\torderProperty,\n\t\t\t\t\torderDirection,\n\t\t\t\t\tthis.decodeCursor(\"i\", cursor),\n\t\t\t\t\tlimit\n\t\t\t\t);\n\n\t\t\t\tlet pageVertexIds = indexPage.vertexIds;\n\n\t\t\t\t// An OR over the index gives the union, so when an id or alias filter is combined\n\t\t\t\t// with resource types the page is narrowed to the intersection here.\n\t\t\t\tif (hasIdFilter && hasResourceTypes) {\n\t\t\t\t\tpageVertexIds = await this.filterVertexIdsByResourceTypes(\n\t\t\t\t\t\tpageVertexIds,\n\t\t\t\t\t\tresourceTypes.map(resourceType => resourceType.toLowerCase())\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst indexEntities = await this.fetchVerticesInOrder(\n\t\t\t\t\tpageVertexIds,\n\t\t\t\t\tpropertiesToReturn as (keyof AuditableItemGraphVertex)[],\n\t\t\t\t\tconditions\n\t\t\t\t);\n\n\t\t\t\treturn await this.buildVertexList(\n\t\t\t\t\tindexEntities,\n\t\t\t\t\tindexPage.hasMore\n\t\t\t\t\t\t? this.encodeCursor({\n\t\t\t\t\t\t\t\ts: \"i\",\n\t\t\t\t\t\t\t\td: indexPage.keySet?.d,\n\t\t\t\t\t\t\t\ti: indexPage.keySet?.i\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst finalConditions: EntityCondition<IAuditableItemGraphVertex> = Is.empty(conditions)\n\t\t\t\t? { logicalOperator: LogicalOperator.And, conditions: [] }\n\t\t\t\t: conditions;\n\n\t\t\t// With no id, alias or resource type filter there is nothing for the index to answer,\n\t\t\t// so the vertex storage is queried directly and paged by its own cursor.\n\t\t\tconst results = await this._vertexStorage.query(\n\t\t\t\tfinalConditions,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: orderProperty,\n\t\t\t\t\t\tsortDirection: orderDirection\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tpropertiesToReturn as (keyof AuditableItemGraphVertex)[],\n\t\t\t\tthis.decodeCursor(\"v\", cursor)?.c,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\treturn await this.buildVertexList(\n\t\t\t\tresults.entities,\n\t\t\t\tIs.stringValue(results.cursor)\n\t\t\t\t\t? this.encodeCursor({ s: \"v\", c: results.cursor })\n\t\t\t\t\t: undefined\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"queryingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Parse and validate a vertex URN; return the compact storage id.\n\t * @param id The vertex URN.\n\t * @returns The compact vertex id.\n\t * @throws GeneralError If the namespace does not match the expected namespace.\n\t * @internal\n\t */\n\tprivate parseVertexId(id: string): string {\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\treturn urnParsed.namespaceSpecific(0);\n\t}\n\n\t/**\n\t * Validate that a PATCH sub-list value is a list patch object, not a bare array.\n\t * @param propertyName The property name for error reporting.\n\t * @param patch The patch value.\n\t * @returns The validated list patch.\n\t * @throws GeneralError If the patch value is a bare array instead of a list patch object.\n\t * @internal\n\t */\n\tprivate validateListPatch<TItem>(\n\t\tpropertyName: string,\n\t\tpatch: unknown\n\t): IAuditableItemGraphListPatch<TItem> {\n\t\tif (Is.array(patch)) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"listPatchInvalidFormat\", {\n\t\t\t\tproperty: propertyName\n\t\t\t});\n\t\t}\n\n\t\tGuards.object<IAuditableItemGraphListPatch<TItem>>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tpropertyName,\n\t\t\tpatch\n\t\t);\n\n\t\treturn patch;\n\t}\n\n\t/**\n\t * Resolve the audit mode for an update, bypass is terminal so it can not return to audited.\n\t * @param vertexEntity The stored vertex entity.\n\t * @param requestedMode The audit mode requested by the caller, when absent the stored mode is kept.\n\t * @returns The audit mode to apply and whether the existing history must be compacted.\n\t * @throws GeneralError If a bypass vertex is being switched back to audited.\n\t * @internal\n\t */\n\tprivate resolveAuditModeTransition(\n\t\tvertexEntity: AuditableItemGraphVertex,\n\t\trequestedMode?: AuditableItemGraphAuditMode\n\t): { auditMode: AuditableItemGraphAuditMode; compactHistory: boolean } {\n\t\tconst currentMode = vertexEntity.auditMode ?? AuditableItemGraphAuditMode.Audited;\n\n\t\tif (Is.empty(requestedMode)) {\n\t\t\treturn { auditMode: currentMode, compactHistory: false };\n\t\t}\n\n\t\tif (\n\t\t\tcurrentMode === AuditableItemGraphAuditMode.Bypass &&\n\t\t\trequestedMode === AuditableItemGraphAuditMode.Audited\n\t\t) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"auditModeTransitionNotAllowed\",\n\t\t\t\t{\n\t\t\t\t\tcurrentMode,\n\t\t\t\t\trequestedMode\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tauditMode: requestedMode,\n\t\t\tcompactHistory:\n\t\t\t\tcurrentMode === AuditableItemGraphAuditMode.Audited &&\n\t\t\t\trequestedMode === AuditableItemGraphAuditMode.Bypass\n\t\t};\n\t}\n\n\t/**\n\t * Discard the changeset history for a vertex along with any proofs the changesets reference.\n\t * @param vertexId The compact vertex id.\n\t * @returns A promise that resolves when the history and its proofs have been removed.\n\t * @internal\n\t */\n\tprivate async compactVertexHistory(vertexId: string): Promise<void> {\n\t\tconst changesets = await this.internalGetChangesets(vertexId, [\"proofId\"]);\n\n\t\tfor (const changeset of changesets) {\n\t\t\tawait this._changesetStorage.remove(changeset.id);\n\t\t\tif (Is.stringValue(changeset.proofId)) {\n\t\t\t\tawait this._immutableProofComponent.remove(changeset.proofId);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Persist vertex changes after update or partial update.\n\t * @param context The context for the operation.\n\t * @param vertexId The compact vertex id.\n\t * @param vertexUrn The vertex URN for events.\n\t * @param originalEntity The entity before changes.\n\t * @param newEntity The entity after changes.\n\t * @param auditModeTransition The audit mode to apply and whether the history must be compacted.\n\t * @param auditModeTransition.auditMode The audit mode to apply.\n\t * @param auditModeTransition.compactHistory Whether the existing history must be discarded.\n\t * @returns A promise that resolves when the changes have been persisted and events published.\n\t * @internal\n\t */\n\tprivate async persistVertexChanges(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertexId: string,\n\t\tvertexUrn: string,\n\t\toriginalEntity: AuditableItemGraphVertex,\n\t\tnewEntity: AuditableItemGraphVertex,\n\t\tauditModeTransition: { auditMode: AuditableItemGraphAuditMode; compactHistory: boolean }\n\t): Promise<void> {\n\t\tif (auditModeTransition.auditMode === AuditableItemGraphAuditMode.Bypass) {\n\t\t\tawait this.persistBypassChanges(\n\t\t\t\tcontext,\n\t\t\t\tvertexId,\n\t\t\t\tvertexUrn,\n\t\t\t\toriginalEntity,\n\t\t\t\tnewEntity,\n\t\t\t\tauditModeTransition.compactHistory\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextVersion = Is.empty(originalEntity.version)\n\t\t\t? (await this.internalGetChangesets(vertexId, [])).length\n\t\t\t: originalEntity.version + 1;\n\t\tconst patches = await this.addChangeset(context, originalEntity, newEntity, false, nextVersion);\n\t\tif (patches.length > 0) {\n\t\t\tnewEntity.dateModified = context.now;\n\t\t\tnewEntity.version = nextVersion;\n\n\t\t\tawait this._vertexStorage.set(newEntity);\n\t\t\tawait this.syncVertexIndexes(newEntity);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t\t{\n\t\t\t\t\tpatchCount: patches.length\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t\t{ id: vertexUrn, patches }\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Persist vertex changes for a bypass vertex, overwriting the stored state with no changeset.\n\t * @param context The context for the operation.\n\t * @param vertexId The compact vertex id.\n\t * @param vertexUrn The vertex URN for events.\n\t * @param originalEntity The entity before changes.\n\t * @param newEntity The entity after changes.\n\t * @param compactHistory Whether the vertex is switching from audited and must discard its history.\n\t * @returns A promise that resolves when the changes have been persisted and events published.\n\t * @internal\n\t */\n\tprivate async persistBypassChanges(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertexId: string,\n\t\tvertexUrn: string,\n\t\toriginalEntity: AuditableItemGraphVertex,\n\t\tnewEntity: AuditableItemGraphVertex,\n\t\tcompactHistory: boolean\n\t): Promise<void> {\n\t\tnewEntity.auditMode = AuditableItemGraphAuditMode.Bypass;\n\t\tdelete newEntity.version;\n\n\t\tconst patches = JsonHelper.diff(originalEntity, newEntity);\n\t\tif (patches.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (compactHistory) {\n\t\t\tawait this.compactVertexHistory(vertexId);\n\t\t}\n\n\t\tnewEntity.dateModified = context.now;\n\n\t\tawait this._vertexStorage.set(newEntity);\n\t\tawait this.syncVertexIndexes(newEntity);\n\n\t\tawait MetricHelper.metricIncrement(\n\t\t\tthis._telemetryComponent,\n\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t{\n\t\t\t\tpatchCount: patches.length\n\t\t\t}\n\t\t);\n\n\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t{ id: vertexUrn, patches }\n\t\t);\n\t}\n\n\t/**\n\t * Whether the vertex records its mutations in place with no audit trail.\n\t * @param vertexEntity The stored vertex entity.\n\t * @returns True if the vertex is in bypass mode.\n\t * @internal\n\t */\n\tprivate isBypass(vertexEntity: AuditableItemGraphVertex): boolean {\n\t\treturn vertexEntity.auditMode === AuditableItemGraphAuditMode.Bypass;\n\t}\n\n\t/**\n\t * Map the vertex entity to JSON-LD.\n\t * @param vertexEntity The vertex entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate vertexEntityToJsonLd(vertexEntity: AuditableItemGraphVertex): IAuditableItemGraphVertex {\n\t\tconst model: IAuditableItemGraphVertex = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Vertex,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, vertexEntity.id).toString(),\n\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\tdateModified: vertexEntity.dateModified,\n\t\t\torganizationIdentity: vertexEntity.organizationIdentity,\n\t\t\tauditMode: vertexEntity.auditMode,\n\t\t\tannotationObject: vertexEntity.annotationObject\n\t\t};\n\n\t\tif (Is.arrayValue(vertexEntity.aliases)) {\n\t\t\tmodel.aliases ??= [];\n\t\t\tfor (const aliasEntity of vertexEntity.aliases) {\n\t\t\t\tconst aliasModel: IAuditableItemGraphAlias = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\tid: aliasEntity.id,\n\t\t\t\t\taliasFormat: aliasEntity.aliasFormat,\n\t\t\t\t\tdateCreated: aliasEntity.dateCreated,\n\t\t\t\t\tdateModified: aliasEntity.dateModified,\n\t\t\t\t\tdateDeleted: aliasEntity.dateDeleted,\n\t\t\t\t\tannotationObject: aliasEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.aliases.push(aliasModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.resources)) {\n\t\t\tmodel.resources ??= [];\n\t\t\tfor (const resourceEntity of vertexEntity.resources) {\n\t\t\t\tconst resourceModel: IAuditableItemGraphResource = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\tid: resourceEntity.id,\n\t\t\t\t\tdateCreated: resourceEntity.dateCreated,\n\t\t\t\t\tdateModified: resourceEntity.dateModified,\n\t\t\t\t\tdateDeleted: resourceEntity.dateDeleted,\n\t\t\t\t\tresourceObject: resourceEntity.resourceObject\n\t\t\t\t};\n\t\t\t\tmodel.resources.push(resourceModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.edges)) {\n\t\t\tmodel.edges ??= [];\n\t\t\tfor (const edgeEntity of vertexEntity.edges) {\n\t\t\t\tconst edgeModel: IAuditableItemGraphEdge = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\tid: this.fullEdgeId(vertexEntity.id, edgeEntity.id),\n\t\t\t\t\ttargetId: edgeEntity.targetId,\n\t\t\t\t\tdateCreated: edgeEntity.dateCreated,\n\t\t\t\t\tdateModified: edgeEntity.dateModified,\n\t\t\t\t\tdateDeleted: edgeEntity.dateDeleted,\n\t\t\t\t\tedgeRelationships: edgeEntity.edgeRelationships,\n\t\t\t\t\tannotationObject: edgeEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.edges.push(edgeModel);\n\t\t\t}\n\t\t}\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Map the changeset entity to a JSON-LD.\n\t * @param vertexId The id of the vertex the changeset belongs to.\n\t * @param changesetEntity The changeset entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate changesetEntityToJsonLd(\n\t\tvertexId: string,\n\t\tchangesetEntity: AuditableItemGraphChangeset\n\t): IAuditableItemGraphChangeset {\n\t\tconst model: IAuditableItemGraphChangeset = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Changeset,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\t\tvertexId,\n\t\t\t\tAuditableItemGraphService.NAMESPACE_CHANGESET,\n\t\t\t\tchangesetEntity.id\n\t\t\t]).toString(),\n\t\t\tdateCreated: changesetEntity.dateCreated,\n\t\t\tuserIdentity: changesetEntity.userIdentity,\n\t\t\tpatches: changesetEntity.patches.map(p => ({\n\t\t\t\t\"@context\": [\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t],\n\t\t\t\ttype: AuditableItemGraphTypes.PatchOperation,\n\t\t\t\tpatchOperation: p.op,\n\t\t\t\tpatchPath: p.path,\n\t\t\t\tpatchFrom: p.from,\n\t\t\t\tpatchValue: p.value\n\t\t\t})),\n\t\t\tproofId: changesetEntity.proofId,\n\t\t\tversion: changesetEntity.version\n\t\t};\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Fetch all changesets for a vertex in ascending date order.\n\t * @param vertexId The internal vertex id.\n\t * @param properties The additional changeset properties to retrieve, the id and dateCreated sort\n\t * keys are always included. Only the requested properties are populated on the returned\n\t * entities, so the large patches payload is only transferred when a caller reads it.\n\t * @param options Optional filtering options.\n\t * @param options.before Only fetch changesets created strictly before this ISO 8601 timestamp.\n\t * @param options.maxVersion Only fetch changesets with version <= this value.\n\t * @returns All changeset entities sorted ascending by dateCreated.\n\t * @internal\n\t */\n\tprivate async internalGetChangesets(\n\t\tvertexId: string,\n\t\tproperties: (keyof AuditableItemGraphChangeset)[],\n\t\toptions?: { before?: string; maxVersion?: number }\n\t): Promise<AuditableItemGraphChangeset[]> {\n\t\tconst all: AuditableItemGraphChangeset[] = [];\n\t\tlet cursor: string | undefined;\n\n\t\tconst propertiesToReturn: (keyof AuditableItemGraphChangeset)[] = [\"id\", \"dateCreated\"];\n\t\tfor (const property of properties) {\n\t\t\tif (!propertiesToReturn.includes(property)) {\n\t\t\t\tpropertiesToReturn.push(property);\n\t\t\t}\n\t\t}\n\n\t\tconst conditions: IComparator[] = [\n\t\t\t{ property: \"vertexId\", value: vertexId, comparison: ComparisonOperator.Equals }\n\t\t];\n\t\tif (Is.stringValue(options?.before)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\tvalue: options.before,\n\t\t\t\tcomparison: ComparisonOperator.LessThan\n\t\t\t});\n\t\t}\n\t\tif (!Is.empty(options?.maxVersion)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"version\",\n\t\t\t\tvalue: options.maxVersion,\n\t\t\t\tcomparison: ComparisonOperator.LessThanOrEqual\n\t\t\t});\n\t\t}\n\n\t\tdo {\n\t\t\tconst result = await this._changesetStorage.query(\n\t\t\t\t{ conditions, logicalOperator: LogicalOperator.And },\n\t\t\t\t[{ property: \"dateCreated\", sortDirection: SortDirection.Ascending }],\n\t\t\t\tpropertiesToReturn,\n\t\t\t\tcursor\n\t\t\t);\n\t\t\tall.push(...(result.entities as AuditableItemGraphChangeset[]));\n\t\t\tcursor = result.cursor;\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn all;\n\t}\n\n\t/**\n\t * Build the version list for an audited vertex from its changesets.\n\t * @param vertexId The compact vertex id.\n\t * @param afterDate Only include versions created after this date, exclusive.\n\t * @param beforeDate Only include versions created before this date, exclusive.\n\t * @returns The matching versions in ascending order.\n\t * @internal\n\t */\n\tprivate async auditedVersions(\n\t\tvertexId: string,\n\t\tafterDate?: Date,\n\t\tbeforeDate?: Date\n\t): Promise<{ version: number; dateCreated: string }[]> {\n\t\tconst allChangesets = await this.internalGetChangesets(vertexId, [\"version\"], {\n\t\t\tbefore: beforeDate?.toISOString()\n\t\t});\n\n\t\tconst versions: { version: number; dateCreated: string }[] = [];\n\t\tfor (const changeset of allChangesets) {\n\t\t\tconst changesetDate = Coerce.dateTime(changeset.dateCreated);\n\t\t\tconst afterExcluded =\n\t\t\t\t!Is.empty(afterDate) && !Is.empty(changesetDate) && changesetDate <= afterDate;\n\n\t\t\tif (!afterExcluded) {\n\t\t\t\tversions.push({\n\t\t\t\t\tversion: changeset.version ?? 0,\n\t\t\t\t\tdateCreated: changeset.dateCreated\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn versions;\n\t}\n\n\t/**\n\t * Build the version list for a bypass vertex, which only exposes its current state as\n\t * a single baseline entry numbered zero.\n\t * @param vertexEntity The stored vertex entity.\n\t * @param afterDate Only include the state when it was modified after this date, exclusive.\n\t * @param beforeDate Only include the state when it was modified before this date, exclusive.\n\t * @returns The baseline entry when the state falls within the range, otherwise empty.\n\t * @internal\n\t */\n\tprivate bypassVersions(\n\t\tvertexEntity: AuditableItemGraphVertex,\n\t\tafterDate?: Date,\n\t\tbeforeDate?: Date\n\t): { version: number; dateCreated: string }[] {\n\t\tconst stateDate = vertexEntity.dateModified ?? vertexEntity.dateCreated;\n\t\tconst stateDateTime = Coerce.dateTime(stateDate);\n\n\t\tif (!Is.empty(stateDateTime)) {\n\t\t\tif (!Is.empty(beforeDate) && stateDateTime >= beforeDate) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tif (!Is.empty(afterDate) && stateDateTime <= afterDate) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\treturn [{ version: 0, dateCreated: stateDate }];\n\t}\n\n\t/**\n\t * Replace the aliases of a vertex model (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param aliases The new active alias set.\n\t * @returns A promise that resolves when the alias list has been replaced.\n\t * @internal\n\t */\n\tprivate async updateAliasList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\taliases?: IAuditableItemGraphAlias[]\n\t): Promise<void> {\n\t\tconst active = vertex.aliases?.filter(a => Is.empty(a.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const alias of active) {\n\t\t\t\tif (!aliases?.find(a => a.id === alias.id)) {\n\t\t\t\t\talias.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.AliasesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(aliases)) {\n\t\t\tfor (const alias of aliases) {\n\t\t\t\tawait this.updateAlias(context, vertex, alias);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply alias patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The alias patch.\n\t * @returns A promise that resolves when the alias patch has been applied.\n\t * @internal\n\t */\n\tprivate async applyAliasPatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphAlias>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst alias = vertex.aliases?.find(a => a.id === removeId && Is.empty(a.dateDeleted));\n\t\t\t\tif (!Is.empty(alias)) {\n\t\t\t\t\talias.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.AliasesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(patch.add)) {\n\t\t\tfor (const alias of patch.add) {\n\t\t\t\tawait this.updateAlias(context, vertex, alias);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update an alias in the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param alias The alias.\n\t * @returns A promise that resolves when the alias has been added or updated.\n\t * @internal\n\t */\n\tprivate async updateAlias(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\talias: IAuditableItemGraphAlias\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(alias), alias);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(alias.id), alias.id);\n\n\t\tif (alias.unique ?? false) {\n\t\t\tconst existingVertices = await this.findMatchingVertices(vertex.id, alias.id);\n\t\t\tif (existingVertices) {\n\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"aliasNotUnique\", {\n\t\t\t\t\taliasId: alias.id\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (Is.object(alias.annotationObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(alias.annotationObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(alias.annotationObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing alias with the same id.\n\t\tconst existing = vertex.aliases?.find(a => a.id === alias.id);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.aliases ??= [];\n\n\t\t\tconst model: AuditableItemGraphAlias = {\n\t\t\t\tid: alias.id,\n\t\t\t\taliasFormat: alias.aliasFormat,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: alias.annotationObject,\n\t\t\t\tunique: alias.unique\n\t\t\t};\n\n\t\t\tvertex.aliases.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.AliasesAdded\n\t\t\t);\n\t\t} else if (\n\t\t\texisting.aliasFormat !== alias.aliasFormat ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, alias.annotationObject, false) ||\n\t\t\texisting.unique !== alias.unique\n\t\t) {\n\t\t\t// Existing alias found, update the annotationObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.aliasFormat = alias.aliasFormat;\n\t\t\texisting.annotationObject = alias.annotationObject;\n\t\t\texisting.unique = alias.unique;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.AliasesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Replace the resources of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resources The new active resource set.\n\t * @returns A promise that resolves when the resource list has been replaced.\n\t * @internal\n\t */\n\tprivate async updateResourceList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresources?: IAuditableItemGraphResource[]\n\t): Promise<void> {\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst id = this.getResourceId(resources[i]);\n\t\t\t\tif (Is.empty(id)) {\n\t\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"resourceIdMissing\", {\n\t\t\t\t\t\tindex: i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst active = vertex.resources?.filter(r => Is.empty(r.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const resource of active) {\n\t\t\t\tif (!resources?.find(a => this.getResourceId(a) === this.getResourceId(resource))) {\n\t\t\t\t\tresource.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.ResourcesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (const resource of resources) {\n\t\t\t\tawait this.updateResource(context, vertex, resource);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply resource patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The resource patch.\n\t * @returns A promise that resolves when the resource patch has been applied.\n\t * @internal\n\t */\n\tprivate async applyResourcePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphResource>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst resource = vertex.resources?.find(\n\t\t\t\t\tr => this.getResourceId(r) === removeId && Is.empty(r.dateDeleted)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(resource)) {\n\t\t\t\t\tresource.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.ResourcesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(patch.add)) {\n\t\t\tfor (const resource of patch.add) {\n\t\t\t\tawait this.updateResource(context, vertex, resource);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add a resource to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resource The resource.\n\t * @returns A promise that resolves when the resource has been added or updated.\n\t * @internal\n\t */\n\tprivate async updateResource(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresource: IAuditableItemGraphResource\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(resource), resource);\n\n\t\tif (Is.object(resource.resourceObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(resource.resourceObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(resource.resourceObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing resource with the same id.\n\t\tconst existing = vertex.resources?.find(\n\t\t\tr => this.getResourceId(r) === this.getResourceId(resource)\n\t\t);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.resources ??= [];\n\n\t\t\tconst model: AuditableItemGraphResource = {\n\t\t\t\tid: resource.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tresourceObject: resource.resourceObject\n\t\t\t};\n\n\t\t\tvertex.resources.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ResourcesAdded\n\t\t\t);\n\t\t} else if (!ObjectHelper.equal(existing.resourceObject, resource.resourceObject, false)) {\n\t\t\t// Existing resource found, update the resourceObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.resourceObject = resource.resourceObject;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ResourcesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Replace the edges of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edges The new active edge set.\n\t * @returns A promise that resolves when the edge list has been replaced.\n\t * @internal\n\t */\n\tprivate async updateEdgeList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedges?: IAuditableItemGraphEdge[]\n\t): Promise<void> {\n\t\t// `active` shares element refs with `vertex.edges` (the cloned newEntity); mutating `edge` below is intended.\n\t\tconst active = vertex.edges?.filter(e => Is.empty(e.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const edge of active) {\n\t\t\t\tif (\n\t\t\t\t\t!edges?.find(\n\t\t\t\t\t\te =>\n\t\t\t\t\t\t\tthis.edgeMatchesStoredEdge(e, edge.id) ||\n\t\t\t\t\t\t\tthis.edgeMatchesActiveEdgeByRelationship(e, edge)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tedge.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.EdgesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(edges)) {\n\t\t\tfor (const edge of edges) {\n\t\t\t\tawait this.updateEdge(context, vertex, edge);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply edge patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The edge patch.\n\t * @returns A promise that resolves when the edge patch has been applied.\n\t * @internal\n\t */\n\tprivate async applyEdgePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphEdge>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst edge = vertex.edges?.find(\n\t\t\t\t\te => Is.empty(e.dateDeleted) && this.edgeRemoveIdMatches(e.id, removeId)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(edge)) {\n\t\t\t\t\tedge.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.EdgesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(patch.add)) {\n\t\t\tfor (const edge of patch.add) {\n\t\t\t\tawait this.updateEdge(context, vertex, edge);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add an edge to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edge The edge.\n\t * @returns A promise that resolves when the edge has been added or updated.\n\t * @internal\n\t */\n\tprivate async updateEdge(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedge: IAuditableItemGraphEdge\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(edge), edge);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(edge.targetId), edge.targetId);\n\t\tGuards.arrayValue(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.edgeRelationships),\n\t\t\tedge.edgeRelationships\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tif (edge.targetId === vertex.id) {\n\t\t\tvalidationFailures.push({\n\t\t\t\tproperty: \"id\",\n\t\t\t\treason: `validation.${StringHelper.camelCase(AuditableItemGraphService.CLASS_NAME)}.edgeIdSameAsVertexId`,\n\t\t\t\tproperties: {\n\t\t\t\t\ttargetId: edge.targetId\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (Is.object(edge.annotationObject)) {\n\t\t\tawait JsonLdHelper.validate(edge.annotationObject, validationFailures);\n\t\t}\n\t\tValidation.asValidationError(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.annotationObject),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tlet findId = Is.stringValue(edge.id) ? this.reduceEdgeId(edge.id) : undefined;\n\t\tif (Is.empty(findId)) {\n\t\t\tconst existingActive = vertex.edges?.find(\n\t\t\t\te =>\n\t\t\t\t\tIs.empty(e.dateDeleted) &&\n\t\t\t\t\te.targetId === edge.targetId &&\n\t\t\t\t\tArrayHelper.matches(e.edgeRelationships, edge.edgeRelationships)\n\t\t\t);\n\t\t\tfindId = existingActive?.id ?? RandomHelper.generateUuidV7(\"compact\");\n\t\t}\n\n\t\t// Try to find an existing edge with the same id.\n\t\tconst existing = vertex.edges?.find(r => r.id === findId);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.edges ??= [];\n\n\t\t\tconst model: AuditableItemGraphEdge = {\n\t\t\t\tid: findId,\n\t\t\t\ttargetId: edge.targetId,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: edge.annotationObject,\n\t\t\t\tedgeRelationships: edge.edgeRelationships\n\t\t\t};\n\n\t\t\tvertex.edges.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.EdgesAdded\n\t\t\t);\n\t\t} else if (\n\t\t\texisting.targetId !== edge.targetId ||\n\t\t\t!ArrayHelper.matches(existing.edgeRelationships, edge.edgeRelationships) ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, edge.annotationObject, false)\n\t\t) {\n\t\t\t// Existing edge found, update the properties.\n\t\t\texisting.targetId = edge.targetId;\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.edgeRelationships = edge.edgeRelationships;\n\t\t\texisting.annotationObject = edge.annotationObject;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.EdgesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a changeset to the vertex and generate the associated verifications.\n\t * @param context The context for the operation.\n\t * @param original The original vertex.\n\t * @param updated The updated vertex.\n\t * @param isNew Whether this is a new item.\n\t * @param version The version number of the vertex after this changeset.\n\t * @returns True if there were changes.\n\t * @internal\n\t */\n\tprivate async addChangeset(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\toriginal: AuditableItemGraphVertex,\n\t\tupdated: AuditableItemGraphVertex,\n\t\tisNew: boolean,\n\t\tversion: number\n\t): Promise<IPatchOperation[]> {\n\t\tconst patches = JsonHelper.diff(original, updated);\n\n\t\t// If there is a diff set or this is the first time the item is created.\n\t\tif (patches.length > 0 || isNew) {\n\t\t\tconst changesetEntity: AuditableItemGraphChangeset = {\n\t\t\t\tid: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\tvertexId: updated.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tuserIdentity: context.userIdentity,\n\t\t\t\tpatches,\n\t\t\t\tversion\n\t\t\t};\n\n\t\t\t// Create the JSON-LD object we want to use for the proof\n\t\t\t// this is a subset of fixed properties from the changeset object.\n\t\t\tconst reducedChangesetJsonLd = this.changesetEntityToJsonLd(\n\t\t\t\toriginal.id,\n\t\t\t\tObjectHelper.pick(changesetEntity, AuditableItemGraphService._PROOF_KEYS_CHANGESET)\n\t\t\t);\n\n\t\t\t// Create the proof for the changeset object only when the vertex has\n\t\t\t// an owning organisation. Vertices created by inbound unauthenticated\n\t\t\t// activities (e.g. DSP push via skipAuth inbox) have no org context at\n\t\t\t// creation time and must not require a proof until a local org claims\n\t\t\t// ownership through an authenticated interaction.\n\t\t\tif (Is.stringValue(updated.organizationIdentity)) {\n\t\t\t\tchangesetEntity.proofId = await this._immutableProofComponent.create(\n\t\t\t\t\tJsonLdHelper.toNodeObject(reducedChangesetJsonLd)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Link the storage id to the changeset\n\t\t\tawait this._changesetStorage.set(changesetEntity);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ChangesetsCreated\n\t\t\t);\n\n\t\t\treturn patches;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Verify the changesets of a vertex.\n\t * @param vertex The vertex to verify.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @returns The verified flag and list of changesets.\n\t * @internal\n\t */\n\tprivate async verifyChangesets(\n\t\tvertex: IAuditableItemGraphVertex,\n\t\tverifySignatureDepth: VerifyDepth\n\t): Promise<{\n\t\tverified: boolean;\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\n\t\tlet verified = true;\n\n\t\tconst vertexIdUrn = Urn.fromValidString(vertex.id);\n\t\tconst vertexId = vertexIdUrn.namespaceSpecific();\n\t\tlet cursor;\n\n\t\tdo {\n\t\t\tconst chunk = await this.verifyChangesetChunk(vertexId, verifySignatureDepth, cursor);\n\t\t\tcursor = chunk.cursor;\n\t\t\tif (!chunk.verified) {\n\t\t\t\tverified = false;\n\t\t\t}\n\t\t\tchangesets.push(...chunk.changesets);\n\t\t} while (Is.stringValue(cursor));\n\n\t\tif (verified) {\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t);\n\t\t} else {\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tverified,\n\t\t\tchangesets\n\t\t};\n\t}\n\n\t/**\n\t * Verify a chunk of changesets for a vertex.\n\t * @param vertexId The id of the vertex to verify the changesets for.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @param cursor The cursor to request the next chunk of changesets.\n\t * @param limit The maximum number of changesets to verify in this chunk.\n\t * @returns The changesets and whether they were verified.\n\t * @internal\n\t */\n\tprivate async verifyChangesetChunk(\n\t\tvertexId: string,\n\t\tverifySignatureDepth: string,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t\tverified: boolean;\n\t\tcursor?: string;\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\t\tlet verified = true;\n\n\t\tconst changesetsResult = await this._changesetStorage.query(\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tvalue: vertexId,\n\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t},\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tconst storedChangesets = changesetsResult.entities as AuditableItemGraphChangeset[];\n\t\tif (Is.arrayValue(storedChangesets)) {\n\t\t\tfor (let i = 0; i < storedChangesets.length; i++) {\n\t\t\t\tconst storedChangeset = storedChangesets[i];\n\n\t\t\t\tconst storedChangesetJsonLd = this.changesetEntityToJsonLd(vertexId, storedChangeset);\n\t\t\t\tchangesets.push(storedChangesetJsonLd);\n\n\t\t\t\t// If we are verifying all signatures\n\t\t\t\t// or this is the last changeset (cursor is empty)\n\t\t\t\t// and the changeset has a proofId, then verify the proof.\n\t\t\t\tif (\n\t\t\t\t\tverifySignatureDepth === VerifyDepth.All ||\n\t\t\t\t\t(verifySignatureDepth === VerifyDepth.Current &&\n\t\t\t\t\t\t!Is.stringValue(changesetsResult.cursor) &&\n\t\t\t\t\t\ti === storedChangesets.length - 1)\n\t\t\t\t) {\n\t\t\t\t\tstoredChangesetJsonLd.verification =\n\t\t\t\t\t\tawait this.verifyChangesetSignature(storedChangesetJsonLd);\n\t\t\t\t\tif (storedChangesetJsonLd.verification?.verified !== true) {\n\t\t\t\t\t\tverified = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { changesets, verified, cursor: changesetsResult.cursor };\n\t}\n\n\t/**\n\t * Verify the signature of a changeset and add the verification result to the changeset JSON-LD.\n\t * @param storedChangeset The changeset to verify.\n\t * @returns Whether the changeset is verified.\n\t * @internal\n\t */\n\tprivate async verifyChangesetSignature(\n\t\tstoredChangeset: IAuditableItemGraphChangeset\n\t): Promise<IImmutableProofVerification | undefined> {\n\t\tlet verification: IImmutableProofVerification | undefined;\n\t\tif (!Is.stringValue(storedChangeset.proofId)) {\n\t\t\tverification = {\n\t\t\t\t\"@context\": ImmutableProofContexts.Context,\n\t\t\t\ttype: ImmutableProofTypes.ImmutableProofVerification,\n\t\t\t\tverified: false,\n\t\t\t\tfailure: ImmutableProofFailure.ProofMissing\n\t\t\t};\n\t\t} else {\n\t\t\t// Verify the proof for the changeset object\n\t\t\tverification = await this._immutableProofComponent.verify(storedChangeset.proofId);\n\t\t}\n\t\treturn verification;\n\t}\n\n\t/**\n\t * Get the resource id from a resource object.\n\t * @param resource The resource.\n\t * @param resource.id The id of the resource.\n\t * @param resource.resourceObject The resource object.\n\t * @returns The resource id if it can find one.\n\t * @internal\n\t */\n\tprivate getResourceId(resource: {\n\t\tid?: string;\n\t\tresourceObject?: IJsonLdNodeObject;\n\t}): string | undefined {\n\t\treturn (\n\t\t\tresource.id ??\n\t\t\tObjectHelper.extractProperty<string>(resource.resourceObject, [\"id\", \"@id\"], false)\n\t\t);\n\t}\n\n\t/**\n\t * Synchronise the index storage with the current state of a vertex.\n\t * @param vertex The vertex to synchronise the index entries for.\n\t * @returns A promise that resolves when the index entries match the vertex.\n\t * @internal\n\t */\n\tprivate async syncVertexIndexes(vertex: AuditableItemGraphVertex): Promise<void> {\n\t\tconst required = new Map<string, { type: string; value: string }>();\n\n\t\t// An entry always carries a modified date so a query ordered by it can be paged by the\n\t\t// same key set as the creation date, falling back to the creation date for a vertex which\n\t\t// has never been modified rather than leaving the column empty.\n\t\tconst indexDateModified = vertex.dateModified ?? vertex.dateCreated;\n\n\t\t// Every vertex carries an entry for its own id, so a query matching on the vertex id can\n\t\t// be answered from the index alone. Without it a vertex holding no aliases and no\n\t\t// resources would have no entries at all and could never be matched here.\n\t\tconst vertexIdValue = vertex.id.toLowerCase();\n\t\trequired.set(`${AuditableItemGraphService._INDEX_TYPE_VERTEX}|${vertexIdValue}`, {\n\t\t\ttype: AuditableItemGraphService._INDEX_TYPE_VERTEX,\n\t\t\tvalue: vertexIdValue\n\t\t});\n\n\t\t// Index values are case folded here, and every lookup folds its term to match, so the\n\t\t// comparisons stay case insensitive without relying on the column collation or on the\n\t\t// connector folding case itself. The vertex keeps the value exactly as supplied.\n\t\tfor (const alias of vertex.aliases ?? []) {\n\t\t\tif (Is.empty(alias.dateDeleted) && Is.stringValue(alias.id)) {\n\t\t\t\tconst value = alias.id.toLowerCase();\n\t\t\t\trequired.set(`${AuditableItemGraphService._INDEX_TYPE_ALIAS}|${value}`, {\n\t\t\t\t\ttype: AuditableItemGraphService._INDEX_TYPE_ALIAS,\n\t\t\t\t\tvalue\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (const resource of vertex.resources ?? []) {\n\t\t\tconst resourceType = ObjectHelper.extractProperty<string>(\n\t\t\t\tresource.resourceObject,\n\t\t\t\t[\"@type\", \"type\"],\n\t\t\t\tfalse\n\t\t\t);\n\n\t\t\tif (Is.stringValue(resourceType)) {\n\t\t\t\tconst value = resourceType.toLowerCase();\n\t\t\t\trequired.set(`${AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE}|${value}`, {\n\t\t\t\t\ttype: AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE,\n\t\t\t\t\tvalue\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst existing = await this.queryVertexIndexes(\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: vertex.id\n\t\t\t},\n\t\t\t[\"id\", \"type\", \"value\", \"dateCreated\", \"dateModified\"]\n\t\t);\n\n\t\t// Collapse by row id first. A paged read can return the same row on more than one page,\n\t\t// and without this a retained row could be queued for removal by its own duplicate.\n\t\tconst existingById = new Map<string, Partial<AuditableItemGraphVertexIndex>>();\n\t\tfor (const entry of existing) {\n\t\t\tif (Is.stringValue(entry.id)) {\n\t\t\t\texistingById.set(entry.id, entry);\n\t\t\t}\n\t\t}\n\n\t\tconst retainedKeys = new Set<string>();\n\t\tconst removeIds: string[] = [];\n\t\tconst writeEntries: AuditableItemGraphVertexIndex[] = [];\n\n\t\tfor (const [id, entry] of existingById) {\n\t\t\t// Entries which are no longer required, and any duplicates of a retained entry,\n\t\t\t// are removed so exactly one entry remains per index value.\n\t\t\tconst key = `${entry.type}|${entry.value}`;\n\t\t\tconst requiredEntry = required.get(key);\n\t\t\tif (!Is.empty(requiredEntry) && !retainedKeys.has(key)) {\n\t\t\t\tretainedKeys.add(key);\n\t\t\t\tif (entry.dateCreated !== vertex.dateCreated || entry.dateModified !== indexDateModified) {\n\t\t\t\t\t// Keep the row id so the copied dates are corrected in place rather than duplicated.\n\t\t\t\t\twriteEntries.push({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tvertexId: vertex.id,\n\t\t\t\t\t\ttype: requiredEntry.type,\n\t\t\t\t\t\tvalue: requiredEntry.value,\n\t\t\t\t\t\tdateCreated: vertex.dateCreated,\n\t\t\t\t\t\tdateModified: indexDateModified\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveIds.push(id);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, entry] of required) {\n\t\t\tif (!retainedKeys.has(key)) {\n\t\t\t\twriteEntries.push({\n\t\t\t\t\tid: Converter.bytesToHex(RandomHelper.generate(16)),\n\t\t\t\t\tvertexId: vertex.id,\n\t\t\t\t\ttype: entry.type,\n\t\t\t\t\tvalue: entry.value,\n\t\t\t\t\tdateCreated: vertex.dateCreated,\n\t\t\t\t\tdateModified: indexDateModified\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (removeIds.length > 0) {\n\t\t\tawait this._vertexIndexStorage.removeBatch(removeIds);\n\t\t}\n\n\t\tif (writeEntries.length > 0) {\n\t\t\tawait this._vertexIndexStorage.setBatch(writeEntries);\n\t\t}\n\t}\n\n\t/**\n\t * Build the JSON-LD vertex list returned by query, and record the query metric.\n\t * @param entities The vertex entities for the page.\n\t * @param cursor The already encoded cursor for the next page.\n\t * @returns The compacted vertex list and the cursor.\n\t * @internal\n\t */\n\tprivate async buildVertexList(\n\t\tentities: Partial<AuditableItemGraphVertex>[],\n\t\tcursor?: string\n\t): Promise<{ entries: IAuditableItemGraphVertexList; cursor?: string }> {\n\t\tconst models: IAuditableItemGraphVertex[] = entities.map(e =>\n\t\t\tthis.vertexEntityToJsonLd(e as AuditableItemGraphVertex)\n\t\t);\n\n\t\tconst vertexList: IAuditableItemGraphVertexList = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexList],\n\t\t\t[SchemaOrgTypes.ItemListElement]: models\n\t\t};\n\n\t\tconst result = await JsonLdProcessor.compact(vertexList, vertexList[\"@context\"], {\n\t\t\tcompactArrays: false\n\t\t});\n\n\t\tawait MetricHelper.metricIncrement(\n\t\t\tthis._telemetryComponent,\n\t\t\tAuditableItemGraphMetricIds.QueriesExecuted,\n\t\t\t{\n\t\t\t\tresultCount: models.length,\n\t\t\t\thasMore: Is.stringValue(cursor)\n\t\t\t}\n\t\t);\n\n\t\treturn {\n\t\t\tentries: result,\n\t\t\tcursor\n\t\t};\n\t}\n\n\t/**\n\t * Encode a storage cursor into the opaque cursor handed back to callers.\n\t * Every cursor this service returns is in this format, so a cursor which does not decode\n\t * is invalid rather than a cursor from somewhere else.\n\t * @param payload The position to encode.\n\t * @param payload.s The strategy the position belongs to, i for index paged, v for vertex paged.\n\t * @param payload.d The ordering date of the last vertex returned, index strategy only.\n\t * @param payload.i The id of the last vertex returned, index strategy only.\n\t * @param payload.c The storage connector cursor, vertex strategy only.\n\t * @returns The encoded cursor, or undefined when there is no further page.\n\t * @internal\n\t */\n\tprivate encodeCursor(payload: { s: \"i\" | \"v\"; d?: string; i?: string; c?: string }): string {\n\t\treturn Converter.bytesToBase64(ObjectHelper.toBytes(payload));\n\t}\n\n\t/**\n\t * Decode a cursor produced by encodeCursor.\n\t * @param strategy The strategy the current query is using.\n\t * @param cursor The cursor supplied by the caller.\n\t * @returns The decoded payload, or undefined when no cursor was supplied.\n\t * @throws GeneralError If the cursor is malformed or belongs to a different strategy.\n\t * @internal\n\t */\n\tprivate decodeCursor(\n\t\tstrategy: \"i\" | \"v\",\n\t\tcursor?: string\n\t): { d?: string; i?: string; c?: string } | undefined {\n\t\tif (!Is.stringValue(cursor)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet decoded: { s?: string; d?: string; i?: string; c?: string } | undefined;\n\t\tif (Is.stringBase64(cursor)) {\n\t\t\ttry {\n\t\t\t\tdecoded = ObjectHelper.fromBytes<{ s?: string; d?: string; i?: string; c?: string }>(\n\t\t\t\t\tConverter.base64ToBytes(cursor)\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\t// Base64 which is not an encoded cursor is still only an invalid cursor, so every\n\t\t\t\t// malformed cursor reports the same failure rather than leaking a parse error.\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"invalidCursor\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// A cursor from a different strategy cannot be applied to this query, and silently\n\t\t// restarting from the first page would loop a caller which keeps following the cursor.\n\t\tconst populated =\n\t\t\tdecoded?.s === strategy &&\n\t\t\t(strategy === \"v\"\n\t\t\t\t? Is.stringValue(decoded.c)\n\t\t\t\t: Is.stringValue(decoded.d) && Is.stringValue(decoded.i));\n\n\t\tif (!populated) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidCursor\");\n\t\t}\n\n\t\treturn decoded;\n\t}\n\n\t/**\n\t * Build the condition matching one index type and value.\n\t * @param type The index type to match.\n\t * @param comparison The comparison to apply to the value.\n\t * @param value The index value to match, already lower cased.\n\t * @returns The condition.\n\t * @internal\n\t */\n\tprivate indexTypeValueCondition(\n\t\ttype: string,\n\t\tcomparison: ComparisonOperator,\n\t\tvalue: string\n\t): EntityCondition<AuditableItemGraphVertexIndex> {\n\t\treturn {\n\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\tconditions: [\n\t\t\t\t{ property: \"type\", comparison: ComparisonOperator.Equals, value: type },\n\t\t\t\t{ property: \"value\", comparison, value }\n\t\t\t]\n\t\t};\n\t}\n\n\t/**\n\t * Build the condition which resumes an index scan after a position.\n\t * Every entry for a vertex carries the same date and vertex id, so a position on that pair\n\t * steps past all the remaining entries of the vertex it names.\n\t * @param orderProperty The index date property being ordered by.\n\t * @param orderDirection The direction being ordered in.\n\t * @param lastDate The date of the last vertex returned.\n\t * @param lastVertexId The id of the last vertex returned.\n\t * @returns The condition.\n\t * @internal\n\t */\n\tprivate indexKeySetCondition(\n\t\torderProperty: \"dateCreated\" | \"dateModified\",\n\t\torderDirection: SortDirection,\n\t\tlastDate: string,\n\t\tlastVertexId: string\n\t): EntityCondition<AuditableItemGraphVertexIndex> {\n\t\tconst dateComparison =\n\t\t\torderDirection === SortDirection.Ascending\n\t\t\t\t? ComparisonOperator.GreaterThan\n\t\t\t\t: ComparisonOperator.LessThan;\n\n\t\treturn {\n\t\t\tlogicalOperator: LogicalOperator.Or,\n\t\t\tconditions: [\n\t\t\t\t{ property: orderProperty, comparison: dateComparison, value: lastDate },\n\t\t\t\t{\n\t\t\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\t\t\tconditions: [\n\t\t\t\t\t\t{ property: orderProperty, comparison: ComparisonOperator.Equals, value: lastDate },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.GreaterThan,\n\t\t\t\t\t\t\tvalue: lastVertexId\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\t}\n\n\t/**\n\t * Read one page of distinct vertex ids from the index storage using a key set, so a broad\n\t * match is never drained into memory however many entries it has.\n\t * @param predicates The type and value conditions to match, combined with OR.\n\t * @param orderProperty The index date property to order by.\n\t * @param orderDirection The direction to order in.\n\t * @param keySet The position returned by the previous page.\n\t * @param keySet.d The ordering date of the last vertex returned.\n\t * @param keySet.i The id of the last vertex returned.\n\t * @param limit The maximum number of distinct vertices to return.\n\t * @returns The vertex ids in order, the position to resume from, and whether more remain.\n\t * @internal\n\t */\n\tprivate async queryIndexVertexIdPage(\n\t\tpredicates: EntityCondition<AuditableItemGraphVertexIndex>[],\n\t\torderProperty: \"dateCreated\" | \"dateModified\",\n\t\torderDirection: SortDirection,\n\t\tkeySet?: { d?: string; i?: string },\n\t\tlimit?: number\n\t): Promise<{ vertexIds: string[]; keySet?: { d: string; i: string }; hasMore: boolean }> {\n\t\tconst pageSize = limit ?? AuditableItemGraphService._DEFAULT_PAGE_SIZE;\n\t\tconst match: EntityCondition<AuditableItemGraphVertexIndex> =\n\t\t\tpredicates.length === 1\n\t\t\t\t? predicates[0]\n\t\t\t\t: { logicalOperator: LogicalOperator.Or, conditions: predicates };\n\n\t\tconst vertexIds: string[] = [];\n\t\tconst positions: { d: string; i: string }[] = [];\n\t\tconst seen = new Set<string>();\n\t\tlet scan = keySet;\n\t\tlet exhausted = false;\n\n\t\t// One extra vertex is collected to tell whether a further page exists. Each pass either\n\t\t// adds a vertex or exhausts the match, so this runs at most pageSize + 1 times.\n\t\twhile (vertexIds.length <= pageSize && !exhausted) {\n\t\t\tconst conditions: EntityCondition<AuditableItemGraphVertexIndex>[] = [match];\n\n\t\t\tif (Is.stringValue(scan?.d) && Is.stringValue(scan?.i)) {\n\t\t\t\tconditions.push(this.indexKeySetCondition(orderProperty, orderDirection, scan.d, scan.i));\n\t\t\t}\n\n\t\t\tconst results = await this._vertexIndexStorage.query(\n\t\t\t\t{ logicalOperator: LogicalOperator.And, conditions },\n\t\t\t\t[\n\t\t\t\t\t{ property: orderProperty, sortDirection: orderDirection },\n\t\t\t\t\t{ property: \"vertexId\", sortDirection: SortDirection.Ascending }\n\t\t\t\t],\n\t\t\t\t[\"vertexId\", orderProperty],\n\t\t\t\tundefined,\n\t\t\t\tpageSize + 1\n\t\t\t);\n\n\t\t\tif (results.entities.length === 0) {\n\t\t\t\texhausted = true;\n\t\t\t}\n\n\t\t\tfor (const entity of results.entities) {\n\t\t\t\tconst entityDate = entity[orderProperty];\n\t\t\t\tif (Is.stringValue(entity.vertexId) && Is.stringValue(entityDate)) {\n\t\t\t\t\tconst position = { d: entityDate, i: entity.vertexId };\n\t\t\t\t\tscan = position;\n\t\t\t\t\tif (!seen.has(entity.vertexId) && vertexIds.length <= pageSize) {\n\t\t\t\t\t\tseen.add(entity.vertexId);\n\t\t\t\t\t\tvertexIds.push(entity.vertexId);\n\t\t\t\t\t\tpositions.push(position);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet hasMore = false;\n\t\tif (vertexIds.length > pageSize) {\n\t\t\tvertexIds.length = pageSize;\n\t\t\tpositions.length = pageSize;\n\t\t\thasMore = true;\n\t\t}\n\n\t\treturn {\n\t\t\tvertexIds,\n\t\t\tkeySet: positions.length > 0 ? positions[positions.length - 1] : undefined,\n\t\t\thasMore\n\t\t};\n\t}\n\n\t/**\n\t * Narrow a page of vertex ids to those which also carry one of the resource types.\n\t * @param vertexIds The candidate vertex ids.\n\t * @param resourceTypes The resource types to match, already lower cased.\n\t * @returns The matching vertex ids, keeping the incoming order.\n\t * @internal\n\t */\n\tprivate async filterVertexIdsByResourceTypes(\n\t\tvertexIds: string[],\n\t\tresourceTypes: string[]\n\t): Promise<string[]> {\n\t\tif (vertexIds.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst results = await this._vertexIndexStorage.query(\n\t\t\t{\n\t\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\t\tconditions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"type\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\t\tvalue: AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE\n\t\t\t\t\t},\n\t\t\t\t\t{ property: \"value\", comparison: ComparisonOperator.In, value: resourceTypes },\n\t\t\t\t\t{ property: \"vertexId\", comparison: ComparisonOperator.In, value: vertexIds }\n\t\t\t\t]\n\t\t\t},\n\t\t\tundefined,\n\t\t\t[\"vertexId\"],\n\t\t\tundefined,\n\t\t\tvertexIds.length * resourceTypes.length\n\t\t);\n\n\t\tconst matched = new Set<string>();\n\t\tfor (const entity of results.entities) {\n\t\t\tif (Is.stringValue(entity.vertexId)) {\n\t\t\t\tmatched.add(entity.vertexId);\n\t\t\t}\n\t\t}\n\n\t\treturn vertexIds.filter(vertexId => matched.has(vertexId));\n\t}\n\n\t/**\n\t * Read the vertices for a page of ids, keeping the order the ids were given in.\n\t * @param vertexIds The vertex ids to read.\n\t * @param propertiesToReturn The vertex properties to return.\n\t * @param conditions Additional conditions the vertices must match.\n\t * @returns The vertices which exist and match, in the order of the ids.\n\t * @internal\n\t */\n\tprivate async fetchVerticesInOrder(\n\t\tvertexIds: string[],\n\t\tpropertiesToReturn: (keyof AuditableItemGraphVertex)[],\n\t\tconditions?: EntityCondition<IAuditableItemGraphVertex>\n\t): Promise<Partial<AuditableItemGraphVertex>[]> {\n\t\tif (vertexIds.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst idCondition: EntityCondition<AuditableItemGraphVertex> = {\n\t\t\tproperty: \"id\",\n\t\t\tcomparison: ComparisonOperator.In,\n\t\t\tvalue: vertexIds\n\t\t};\n\n\t\tconst results = await this._vertexStorage.query(\n\t\t\tIs.empty(conditions)\n\t\t\t\t? idCondition\n\t\t\t\t: {\n\t\t\t\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\t\t\t\tconditions: [idCondition, conditions]\n\t\t\t\t\t},\n\t\t\tundefined,\n\t\t\tpropertiesToReturn,\n\t\t\tundefined,\n\t\t\tvertexIds.length\n\t\t);\n\n\t\t// An In lookup has no guaranteed order, so the index ordering is reapplied here.\n\t\tconst vertexById = new Map<string, Partial<AuditableItemGraphVertex>>();\n\t\tfor (const entity of results.entities) {\n\t\t\tif (Is.stringValue(entity.id)) {\n\t\t\t\tvertexById.set(entity.id, entity);\n\t\t\t}\n\t\t}\n\n\t\tconst ordered: Partial<AuditableItemGraphVertex>[] = [];\n\t\tfor (const vertexId of vertexIds) {\n\t\t\tconst entity = vertexById.get(vertexId);\n\t\t\tif (!Is.empty(entity)) {\n\t\t\t\tordered.push(entity);\n\t\t\t}\n\t\t}\n\n\t\treturn ordered;\n\t}\n\n\t/**\n\t * Query all the pages of the vertex index storage which match the conditions.\n\t * @param conditions The conditions to match.\n\t * @param properties The properties to return.\n\t * @returns The matching index entries.\n\t * @internal\n\t */\n\tprivate async queryVertexIndexes(\n\t\tconditions: EntityCondition<AuditableItemGraphVertexIndex>,\n\t\tproperties: (keyof AuditableItemGraphVertexIndex)[]\n\t): Promise<Partial<AuditableItemGraphVertexIndex>[]> {\n\t\tconst entities: Partial<AuditableItemGraphVertexIndex>[] = [];\n\t\tlet cursor: string | undefined;\n\n\t\tdo {\n\t\t\t// Paging needs a deterministic order or a row can be repeated or skipped between\n\t\t\t// pages, the entity declares no default sort so the primary key is used.\n\t\t\tconst results = await this._vertexIndexStorage.query(\n\t\t\t\tconditions,\n\t\t\t\t[{ property: \"id\", sortDirection: SortDirection.Ascending }],\n\t\t\t\tproperties,\n\t\t\t\tcursor\n\t\t\t);\n\t\t\tentities.push(...results.entities);\n\t\t\tcursor = results.cursor;\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn entities;\n\t}\n\n\t/**\n\t * Find vertices with matching aliases.\n\t * @param vertexId The id of the vertex to exclude from the search.\n\t * @param aliasId The alias id to try and find.\n\t * @returns True if any other vertices have matching aliases.\n\t * @internal\n\t */\n\tprivate async findMatchingVertices(vertexId: string, aliasId: string): Promise<boolean> {\n\t\tconst entities = await this.queryVertexIndexes(\n\t\t\t{\n\t\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\t\tconditions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"type\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\t\tvalue: AuditableItemGraphService._INDEX_TYPE_ALIAS\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"value\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\t\tvalue: aliasId.toLowerCase()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.NotEquals,\n\t\t\t\t\t\tvalue: vertexId\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t[\"vertexId\"]\n\t\t);\n\n\t\treturn entities.length > 0;\n\t}\n\n\t/**\n\t * Whether an incoming edge matches a stored edge id.\n\t * @param incoming The incoming edge.\n\t * @param storedEdgeId The compact stored edge id.\n\t * @returns True if the incoming edge matches the stored edge id.\n\t * @internal\n\t */\n\tprivate edgeMatchesStoredEdge(incoming: IAuditableItemGraphEdge, storedEdgeId: string): boolean {\n\t\treturn Is.stringValue(incoming.id) && this.reduceEdgeId(incoming.id) === storedEdgeId;\n\t}\n\n\t/**\n\t * Whether a PATCH remove id matches a stored compact edge id (full URN or compact).\n\t * @param storedEdgeId The compact stored edge id.\n\t * @param removeId The id from the patch remove list.\n\t * @returns True if the remove id identifies the stored edge.\n\t * @internal\n\t */\n\tprivate edgeRemoveIdMatches(storedEdgeId: string, removeId: string): boolean {\n\t\tif (storedEdgeId === removeId) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttry {\n\t\t\treturn this.reduceEdgeId(removeId) === storedEdgeId;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Whether an incoming id-less edge matches an active stored edge by target and relationships.\n\t * @param incoming The incoming edge.\n\t * @param stored The stored edge.\n\t * @returns True if they match.\n\t * @internal\n\t */\n\tprivate edgeMatchesActiveEdgeByRelationship(\n\t\tincoming: IAuditableItemGraphEdge,\n\t\tstored: AuditableItemGraphEdge\n\t): boolean {\n\t\treturn (\n\t\t\tIs.empty(incoming.id) &&\n\t\t\tIs.empty(stored.dateDeleted) &&\n\t\t\tincoming.targetId === stored.targetId &&\n\t\t\tArrayHelper.matches(incoming.edgeRelationships, stored.edgeRelationships)\n\t\t);\n\t}\n\n\t/**\n\t * Reduce the edge ID from a URN.\n\t * @param urn The URN to reduce.\n\t * @returns The edge ID.\n\t * @throws GeneralError if the URN is not valid or not an edge URN.\n\t * @internal\n\t */\n\tprivate reduceEdgeId(urn: string): string {\n\t\tconst urnParsed = Urn.fromValidString(urn);\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts().length !== 3) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts()[1] !== AuditableItemGraphService.NAMESPACE_EDGE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\treturn urnParsed.namespaceSpecificParts()[2];\n\t}\n\n\t/**\n\t * Create a full edge ID URN from a vertex ID and edge ID.\n\t * @param vertexId The vertex id the edge belongs to.\n\t * @param edgeId The edge id.\n\t * @returns The full edge ID URN.\n\t * @internal\n\t */\n\tprivate fullEdgeId(vertexId: string, edgeId: string): string {\n\t\treturn new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\tvertexId,\n\t\t\tAuditableItemGraphService.NAMESPACE_EDGE,\n\t\t\tedgeId\n\t\t]).toString();\n\t}\n}\n"]}
1
+ {"version":3,"file":"auditableItemGraphService.js","sourceRoot":"","sources":["../../src/auditableItemGraphService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHealthCategory,\n\tHealthStatus,\n\ttype HealthApplicationCallback,\n\ttype IHealth,\n\ttype IHealthProviderComponent\n} from \"@twin.org/api-models\";\nimport {\n\tAuditableItemGraphAuditMode,\n\tAuditableItemGraphContexts,\n\tAuditableItemGraphDataTypes,\n\tAuditableItemGraphMetricIds,\n\tAuditableItemGraphMetrics,\n\tAuditableItemGraphTopics,\n\tAuditableItemGraphTypes,\n\tVerifyDepth,\n\ttype IAuditableItemGraphAlias,\n\ttype IAuditableItemGraphChangeset,\n\ttype IAuditableItemGraphChangesetList,\n\ttype IAuditableItemGraphComponent,\n\ttype IAuditableItemGraphEdge,\n\ttype IAuditableItemGraphEventBusVertexCreated,\n\ttype IAuditableItemGraphEventBusVertexUpdated,\n\ttype IAuditableItemGraphListPatch,\n\ttype IAuditableItemGraphPartialVertex,\n\ttype IAuditableItemGraphResource,\n\ttype IAuditableItemGraphVertex,\n\ttype IAuditableItemGraphVertexList,\n\ttype IAuditableItemGraphVertexVersionList\n} from \"@twin.org/auditable-item-graph-models\";\nimport { ContextIdHelper, ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tBaseError,\n\tCoerce,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tMutex,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tStringHelper,\n\tUrn,\n\tValidation,\n\ttype IPatchOperation,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { Blake2b } from \"@twin.org/crypto\";\nimport { DataTypeHelper } from \"@twin.org/data-core\";\nimport {\n\tJsonLdDataTypes,\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tComparisonOperator,\n\tLogicalOperator,\n\tSortDirection,\n\ttype EntityCondition,\n\ttype IComparator\n} from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IEventBusComponent } from \"@twin.org/event-bus-models\";\nimport {\n\tImmutableProofContexts,\n\tImmutableProofFailure,\n\tImmutableProofTypes,\n\ttype IImmutableProofComponent,\n\ttype IImmutableProofVerification\n} from \"@twin.org/immutable-proof-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport type { AuditableItemGraphAlias } from \"./entities/auditableItemGraphAlias.js\";\nimport type { AuditableItemGraphChangeset } from \"./entities/auditableItemGraphChangeset.js\";\nimport type { AuditableItemGraphEdge } from \"./entities/auditableItemGraphEdge.js\";\nimport type { AuditableItemGraphResource } from \"./entities/auditableItemGraphResource.js\";\nimport type { AuditableItemGraphVertex } from \"./entities/auditableItemGraphVertex.js\";\nimport type { AuditableItemGraphVertexIndex } from \"./entities/auditableItemGraphVertexIndex.js\";\nimport type { IAuditableItemGraphServiceConstructorOptions } from \"./models/IAuditableItemGraphServiceConstructorOptions.js\";\nimport type { IAuditableItemGraphServiceContext } from \"./models/IAuditableItemGraphServiceContext.js\";\n\n/**\n * Class for performing auditable item graph operations.\n */\nexport class AuditableItemGraphService\n\timplements IAuditableItemGraphComponent, IHealthProviderComponent\n{\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<AuditableItemGraphService>();\n\n\t/**\n\t * The namespace for the service.\n\t * @internal\n\t */\n\tpublic static readonly NAMESPACE: string = \"aig\";\n\n\t/**\n\t * The namespace for the service changeset.\n\t */\n\tpublic static readonly NAMESPACE_CHANGESET: string = \"changeset\";\n\n\t/**\n\t * The namespace for the service edge.\n\t */\n\tpublic static readonly NAMESPACE_EDGE: string = \"edge\";\n\n\t/**\n\t * The index type for the id of the vertex itself.\n\t * @internal\n\t */\n\tprivate static readonly _INDEX_TYPE_VERTEX: string = \"vertex\";\n\n\t/**\n\t * The index type for vertex aliases.\n\t * @internal\n\t */\n\tprivate static readonly _INDEX_TYPE_ALIAS: string = \"alias\";\n\n\t/**\n\t * The index type for vertex resource types.\n\t * @internal\n\t */\n\tprivate static readonly _INDEX_TYPE_RESOURCE_TYPE: string = \"resourceType\";\n\n\t/**\n\t * The keys to pick when creating the proof for the stream.\n\t * @internal\n\t */\n\tprivate static readonly _PROOF_KEYS_CHANGESET: (keyof AuditableItemGraphChangeset)[] = [\n\t\t\"id\",\n\t\t\"vertexId\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\",\n\t\t\"patches\"\n\t];\n\n\t/**\n\t * The immutable proof component.\n\t * @internal\n\t */\n\tprivate readonly _immutableProofComponent: IImmutableProofComponent;\n\n\t/**\n\t * The entity storage for vertices.\n\t * @internal\n\t */\n\tprivate readonly _vertexStorage: IEntityStorageConnector<AuditableItemGraphVertex>;\n\n\t/**\n\t * The entity storage for vertex indices.\n\t * @internal\n\t */\n\tprivate readonly _vertexIndexStorage: IEntityStorageConnector<AuditableItemGraphVertexIndex>;\n\n\t/**\n\t * The entity storage for changesets.\n\t * @internal\n\t */\n\tprivate readonly _changesetStorage: IEntityStorageConnector<AuditableItemGraphChangeset>;\n\n\t/**\n\t * The event bus component.\n\t * @internal\n\t */\n\tprivate readonly _eventBusComponent?: IEventBusComponent;\n\n\t/**\n\t * The telemetry component.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * The timeout in milliseconds when acquiring a mutex lock.\n\t * @internal\n\t */\n\tprivate readonly _mutexTimeoutMs?: number;\n\n\t/**\n\t * Create a new instance of AuditableItemGraphService.\n\t * @param options The dependencies for the auditable item graph connector.\n\t */\n\tconstructor(options?: IAuditableItemGraphServiceConstructorOptions) {\n\t\tthis._immutableProofComponent = ComponentFactory.get(\n\t\t\toptions?.immutableProofComponentType ?? \"immutable-proof\"\n\t\t);\n\n\t\tthis._vertexStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.vertexEntityStorageType ?? nameofKebabCase<AuditableItemGraphVertex>()\n\t\t);\n\n\t\tthis._vertexIndexStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.vertexIndexEntityStorageType ?? nameofKebabCase<AuditableItemGraphVertexIndex>()\n\t\t);\n\n\t\tthis._changesetStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.changesetEntityStorageType ?? nameofKebabCase<AuditableItemGraphChangeset>()\n\t\t);\n\n\t\tthis._eventBusComponent = ComponentFactory.getIfExists<IEventBusComponent>(\n\t\t\toptions?.eventBusComponentType\n\t\t);\n\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\n\t\tthis._mutexTimeoutMs = Coerce.integer(options?.config?.mutexTimeoutMs);\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tAuditableItemGraphDataTypes.registerTypes();\n\t\tJsonLdDataTypes.registerTypes();\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn AuditableItemGraphService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Runs a set/get/remove cycle against the vertex entity storage using the organisation identity\n\t * from the current context.\n\t * @param callback The callback to invoke when a deferred health result is ready.\n\t * @returns The health status of the service.\n\t */\n\tpublic async healthApplication(\n\t\tcallback: HealthApplicationCallback\n\t): Promise<IHealth[] | undefined> {\n\t\tconst contextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\tconst orgId = contextIds[ContextIdKeys.Organization];\n\n\t\tif (!Is.stringValue(orgId)) {\n\t\t\treturn [];\n\t\t}\n\n\t\ttry {\n\t\t\tconst healthVertex = {\n\t\t\t\tid: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\torganizationIdentity: orgId,\n\t\t\t\tdateCreated: new Date().toISOString()\n\t\t\t};\n\t\t\tawait this._vertexStorage.set(healthVertex);\n\t\t\tawait this._vertexStorage.get(healthVertex.id);\n\t\t\tawait this._vertexStorage.remove(healthVertex.id);\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: AuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\tdescription: \"healthDescription\"\n\t\t\t\t}\n\t\t\t];\n\t\t} catch (error) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: AuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"getVertexFailed\",\n\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t}\n\n\t/**\n\t * Register all AIG metrics with the telemetry component.\n\t * @returns A promise that resolves when all metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, AuditableItemGraphMetrics);\n\t}\n\n\t/**\n\t * Create a new graph vertex.\n\t * @param vertex The vertex to create.\n\t * @param vertex.auditMode How the mutations of the vertex are recorded, defaults to audited.\n\t * @param vertex.annotationObject The annotation object for the vertex as JSON-LD.\n\t * @param vertex.aliases Alternative aliases that can be used to identify the vertex.\n\t * @param vertex.resources The resources attached to the vertex.\n\t * @param vertex.edges The edges connected to the vertex.\n\t * @returns The id of the new graph item.\n\t */\n\tpublic async create(vertex: Omit<IAuditableItemGraphVertex, \"id\">): Promise<string> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\t\tif (Is.notEmpty(vertex.auditMode)) {\n\t\t\tGuards.arrayOneOf(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex.auditMode),\n\t\t\t\tvertex.auditMode,\n\t\t\t\tObject.values(AuditableItemGraphAuditMode)\n\t\t\t);\n\t\t}\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\ttry {\n\t\t\tconst id = RandomHelper.generateUuidV7(\"compact\");\n\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(vertex),\n\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t{\n\t\t\t\t\t...vertex,\n\t\t\t\t\tid\n\t\t\t\t},\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst ownerOrganizationId =\n\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];\n\n\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\torganizationIdentity: ownerOrganizationId,\n\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t};\n\n\t\t\tconst vertexModel: AuditableItemGraphVertex = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: contextIds[ContextIdKeys.Organization],\n\t\t\t\tdateCreated: context.now\n\t\t\t};\n\t\t\tconst originalEntity = ObjectHelper.clone(vertexModel);\n\n\t\t\tvertexModel.auditMode = vertex.auditMode;\n\t\t\tvertexModel.annotationObject = vertex.annotationObject;\n\n\t\t\tawait this.updateAliasList(context, vertexModel, vertex.aliases);\n\t\t\tawait this.updateResourceList(context, vertexModel, vertex.resources);\n\t\t\tawait this.updateEdgeList(context, vertexModel, vertex.edges);\n\n\t\t\t// Bypass vertices keep no changeset history, so there is no baseline version to record.\n\t\t\tif (vertex.auditMode !== AuditableItemGraphAuditMode.Bypass) {\n\t\t\t\tawait this.addChangeset(context, originalEntity, vertexModel, true, 0);\n\n\t\t\t\tvertexModel.version = 0;\n\t\t\t}\n\n\t\t\tawait this._vertexStorage.set(vertexModel);\n\t\t\tawait this.syncVertexIndexes(vertexModel);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesCreated\n\t\t\t);\n\n\t\t\tconst fullId = new Urn(AuditableItemGraphService.NAMESPACE, id).toString();\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexCreated>(\n\t\t\t\tAuditableItemGraphTopics.VertexCreated,\n\t\t\t\t{ id: fullId }\n\t\t\t);\n\n\t\t\treturn fullId;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"createFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update a graph vertex (PUT - full replacement of vertex state).\n\t * Concurrent updates for the same vertex are serialized via `Mutex` on the vertex id.\n\t * @param vertex The vertex to update.\n\t * @returns A promise that resolves when the vertex has been updated.\n\t * @throws GeneralError If a bypass vertex is being switched back to audited.\n\t */\n\tpublic async update(vertex: IAuditableItemGraphVertex): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(vertex.id), vertex.id);\n\t\tif (Is.notEmpty(vertex.auditMode)) {\n\t\t\tGuards.arrayOneOf(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex.auditMode),\n\t\t\t\tvertex.auditMode,\n\t\t\t\tObject.values(AuditableItemGraphAuditMode)\n\t\t\t);\n\t\t}\n\n\t\tconst vertexId = this.parseVertexId(vertex.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\t\tawait DataTypeHelper.validate(\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t\tvertex,\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tvertex.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\t\tconst ownerOrganizationId =\n\t\t\t\t\tvertexEntity.organizationIdentity ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.Organization];\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\torganizationIdentity: ownerOrganizationId,\n\t\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t\t};\n\n\t\t\t\tconst auditModeTransition = this.resolveAuditModeTransition(vertexEntity, vertex.auditMode);\n\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tnewEntity.annotationObject = vertex.annotationObject;\n\t\t\t\tawait this.updateAliasList(context, newEntity, vertex.aliases);\n\t\t\t\tawait this.updateResourceList(context, newEntity, vertex.resources);\n\t\t\t\tawait this.updateEdgeList(context, newEntity, vertex.edges);\n\n\t\t\t\tawait this.persistVertexChanges(\n\t\t\t\t\tcontext,\n\t\t\t\t\tvertexId,\n\t\t\t\t\tvertex.id,\n\t\t\t\t\toriginalEntity,\n\t\t\t\t\tnewEntity,\n\t\t\t\t\tauditModeTransition\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Partially update a graph vertex (PATCH - explicit list patches; only defined properties applied).\n\t * Serialized with `update` via `Mutex` on the same vertex id within this instance.\n\t * @param partial The partial vertex update.\n\t * @returns A promise that resolves when the partial update has been applied.\n\t * @throws GeneralError If a bypass vertex is being switched back to audited.\n\t */\n\tpublic async updatePartial(partial: IAuditableItemGraphPartialVertex): Promise<void> {\n\t\tGuards.object<IAuditableItemGraphPartialVertex>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(partial),\n\t\t\tpartial\n\t\t);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(partial.id), partial.id);\n\t\tif (Is.notEmpty(partial.auditMode)) {\n\t\t\tGuards.arrayOneOf(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(partial.auditMode),\n\t\t\t\tpartial.auditMode,\n\t\t\t\tObject.values(AuditableItemGraphAuditMode)\n\t\t\t);\n\t\t}\n\n\t\tconst vertexId = this.parseVertexId(partial.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tpartial.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (partial.annotationObject !== undefined && Is.object(partial.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(partial.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(partial.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\t\tconst ownerOrganizationId =\n\t\t\t\t\tvertexEntity.organizationIdentity ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ??\n\t\t\t\t\tcontextIds?.[ContextIdKeys.Organization];\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\torganizationIdentity: ownerOrganizationId,\n\t\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t\t};\n\n\t\t\t\tconst auditModeTransition = this.resolveAuditModeTransition(\n\t\t\t\t\tvertexEntity,\n\t\t\t\t\tpartial.auditMode\n\t\t\t\t);\n\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tif (partial.annotationObject !== undefined) {\n\t\t\t\t\tnewEntity.annotationObject = partial.annotationObject;\n\t\t\t\t}\n\t\t\t\tif (partial.aliasPatches !== undefined) {\n\t\t\t\t\tconst aliasPatch = this.validateListPatch<IAuditableItemGraphAlias>(\n\t\t\t\t\t\tnameof(partial.aliasPatches),\n\t\t\t\t\t\tpartial.aliasPatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyAliasPatch(context, newEntity, aliasPatch);\n\t\t\t\t}\n\t\t\t\tif (partial.resourcePatches !== undefined) {\n\t\t\t\t\tconst resourcePatch = this.validateListPatch<IAuditableItemGraphResource>(\n\t\t\t\t\t\tnameof(partial.resourcePatches),\n\t\t\t\t\t\tpartial.resourcePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyResourcePatch(context, newEntity, resourcePatch);\n\t\t\t\t}\n\t\t\t\tif (partial.edgePatches !== undefined) {\n\t\t\t\t\tconst edgePatch = this.validateListPatch<IAuditableItemGraphEdge>(\n\t\t\t\t\t\tnameof(partial.edgePatches),\n\t\t\t\t\t\tpartial.edgePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyEdgePatch(context, newEntity, edgePatch);\n\t\t\t\t}\n\n\t\t\t\tawait this.persistVertexChanges(\n\t\t\t\t\tcontext,\n\t\t\t\t\tvertexId,\n\t\t\t\t\tpartial.id,\n\t\t\t\t\toriginalEntity,\n\t\t\t\t\tnewEntity,\n\t\t\t\t\tauditModeTransition\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeDeleted Whether to include deleted/updated aliases, resource, edges, defaults to false.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\n\t\t\t// Bypass vertices have no changesets to verify, so verification is never reported for them.\n\t\t\tconst verifySignatureDepth = this.isBypass(vertexEntity)\n\t\t\t\t? VerifyDepth.None\n\t\t\t\t: (options?.verifySignatureDepth ?? VerifyDepth.None);\n\n\t\t\tlet verified: boolean | undefined;\n\n\t\t\tif (\n\t\t\t\tverifySignatureDepth === VerifyDepth.Current ||\n\t\t\t\tverifySignatureDepth === VerifyDepth.All\n\t\t\t) {\n\t\t\t\tconst verifyResult = await this.verifyChangesets(vertexModel, verifySignatureDepth);\n\t\t\t\tverified = verifyResult.verified;\n\t\t\t\tvertexModel[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tif (!(options?.includeDeleted ?? false)) {\n\t\t\t\tif (Is.arrayValue(vertexModel.aliases)) {\n\t\t\t\t\tvertexModel.aliases = vertexModel.aliases.filter(a => Is.undefined(a.dateDeleted));\n\t\t\t\t\tif (vertexModel.aliases.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.aliases;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.resources)) {\n\t\t\t\t\tvertexModel.resources = vertexModel.resources.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.resources.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.resources;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.edges)) {\n\t\t\t\t\tvertexModel.edges = vertexModel.edges.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.edges.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.edges;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tvertexModel.verified = verified;\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset list.\n\t * @param id The id of the vertex to get.\n\t * @param cursor The optional cursor to get next chunk.\n\t * @param limit Limit the number of entities to return.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangesets(\n\t\tid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangesetList;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\t// Bypass vertices maintain no changeset history.\n\t\t\tconst chunk = this.isBypass(vertexEntity)\n\t\t\t\t? { changesets: [], verified: true, cursor: undefined }\n\t\t\t\t: await this.verifyChangesetChunk(\n\t\t\t\t\t\tvertexId,\n\t\t\t\t\t\toptions?.verifySignatureDepth ?? VerifyDepth.None,\n\t\t\t\t\t\tcursor,\n\t\t\t\t\t\tlimit\n\t\t\t\t\t);\n\n\t\t\tif (\n\t\t\t\t!this.isBypass(vertexEntity) &&\n\t\t\t\t(options?.verifySignatureDepth ?? VerifyDepth.None) !== VerifyDepth.None\n\t\t\t) {\n\t\t\t\tif (chunk.verified) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst changesetList: IAuditableItemGraphChangesetList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.ChangesetList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: chunk.changesets\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetList, changesetList[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tchangesets: result,\n\t\t\t\tcursor: chunk.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangeset(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphChangeset> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst namespaceSpecificParts = urnParsed.namespaceSpecificParts();\n\t\t\tconst vertexId = namespaceSpecificParts[0];\n\t\t\tconst changesetId = namespaceSpecificParts[2];\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\t// Bypass vertices maintain no changeset history.\n\t\t\tif (this.isBypass(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"changesetNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetEntity = await this._changesetStorage.get(changesetId);\n\t\t\tif (Is.empty(changesetEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"changesetNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetModel = this.changesetEntityToJsonLd(vertexId, changesetEntity);\n\n\t\t\tconst verifySignatureDepth = options?.verifySignatureDepth ?? VerifyDepth.None;\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tchangesetModel[\"@context\"]?.push(ImmutableProofContexts.Context);\n\t\t\t\tchangesetModel.verification = await this.verifyChangesetSignature(changesetModel);\n\t\t\t\tif (changesetModel.verification?.verified) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfailureReason: changesetModel.verification?.failure\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetModel, changesetModel[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex at a specific version.\n\t * @param id The id of the vertex.\n\t * @param version The version number to retrieve.\n\t * @returns The vertex reconstructed at that version.\n\t * @throws NotFoundError if the vertex or version is not found, a bypass vertex never has versions.\n\t */\n\tpublic async getVersion(id: string, version: number): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\t\tGuards.integer(AuditableItemGraphService.CLASS_NAME, nameof(version), version);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\t// Bypass vertices maintain no version chain.\n\t\t\tif (this.isBypass(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"versionNotFound\",\n\t\t\t\t\tversion.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst currentVersion = vertexEntity.version ?? 0;\n\t\t\tif (version > currentVersion || version < 0) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"versionNotFound\",\n\t\t\t\t\tversion.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Short circuit if requesting the current version to avoid unnecessary changeset retrieval and patching\n\t\t\tif (version === currentVersion) {\n\t\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\t\t\t\tvertexModel.version = version;\n\t\t\t\treturn await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"], {\n\t\t\t\t\tcompactArrays: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst changesets = await this.internalGetChangesets(vertexId, [\"patches\"], {\n\t\t\t\tmaxVersion: version\n\t\t\t});\n\n\t\t\tlet entityState: AuditableItemGraphVertex = {\n\t\t\t\tid: vertexEntity.id,\n\t\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\t\torganizationIdentity: vertexEntity.organizationIdentity\n\t\t\t};\n\t\t\tfor (const changeset of changesets) {\n\t\t\t\tentityState = JsonHelper.patch(entityState, changeset.patches);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(entityState);\n\t\t\tvertexModel.version = version;\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get all versions of a graph vertex.\n\t * @param id The id of the vertex.\n\t * @param options Additional options for the operation.\n\t * @param options.after Only return versions created after this ISO 8601 timestamp (exclusive).\n\t * @param options.before Only return versions created before this ISO 8601 timestamp (exclusive).\n\t * @returns The list of vertex versions, a bypass vertex returns a single baseline entry for its\n\t * current state when that falls within the requested range.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getVersions(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tafter?: string;\n\t\t\tbefore?: string;\n\t\t}\n\t): Promise<IAuditableItemGraphVertexVersionList> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst beforeDate = Coerce.dateTime(options?.before);\n\t\t\tconst afterDate = Coerce.dateTime(options?.after);\n\n\t\t\tconst versions = this.isBypass(vertexEntity)\n\t\t\t\t? this.bypassVersions(vertexEntity, afterDate, beforeDate)\n\t\t\t\t: await this.auditedVersions(vertexId, afterDate, beforeDate);\n\n\t\t\tconst versionList: IAuditableItemGraphVertexVersionList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexVersionList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: versions\n\t\t\t};\n\n\t\t\treturn await JsonLdProcessor.compact(versionList, versionList[\"@context\"], {\n\t\t\t\tcompactArrays: false\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the proof for an item.\n\t * @param id The id of the vertex to remove the proof from.\n\t * @returns A promise that resolves when the proof has been removed from all changesets.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeProof(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst vertexId = this.parseVertexId(id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });\n\n\t\ttry {\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tlet changesetsResult;\n\t\t\tdo {\n\t\t\t\tchangesetsResult = await this._changesetStorage.query(\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\tvalue: vertexId,\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tundefined,\n\t\t\t\t\tchangesetsResult?.cursor\n\t\t\t\t);\n\n\t\t\t\tfor (const changeset of changesetsResult.entities) {\n\t\t\t\t\tif (Is.stringValue(changeset.proofId)) {\n\t\t\t\t\t\tawait this._immutableProofComponent.removeNotarization(changeset.proofId);\n\t\t\t\t\t\tdelete changeset.proofId;\n\t\t\t\t\t\tawait this._changesetStorage.set(changeset as AuditableItemGraphChangeset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(changesetsResult.cursor));\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"removeProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Query the graph for vertices.\n\t * @param options The query options.\n\t * @param options.id The optional id to look for.\n\t * @param options.idMode Look in id, alias or both, defaults to both.\n\t * @param options.idExact Find only exact matches, default to false meaning partial matching.\n\t * @param options.resourceTypes Include vertices with specific resource types.\n\t * @param conditions Conditions to use in the query.\n\t * @param orderBy The order for the results, defaults to created.\n\t * @param orderByDirection The direction for the order, defaults to desc.\n\t * @param properties The properties to return, if not provided defaults to id, created, aliases and object.\n\t * @param cursor The cursor to request the next chunk of entities.\n\t * @param limit The maximum number of entities to return, a page can contain fewer so follow\n\t * the cursor until it is absent to read them all.\n\t * @returns The entities, which can be partial if a limited keys list was provided.\n\t */\n\tpublic async query(\n\t\toptions?: {\n\t\t\tid?: string;\n\t\t\tidMode?: \"id\" | \"alias\" | \"both\";\n\t\t\tidExact?: boolean;\n\t\t\tresourceTypes?: string[];\n\t\t},\n\t\tconditions?: EntityCondition<IAuditableItemGraphVertex>,\n\t\torderBy?: keyof Pick<IAuditableItemGraphVertex, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tproperties?: (keyof IAuditableItemGraphVertex)[],\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemGraphVertexList;\n\t\tcursor?: string;\n\t}> {\n\t\ttry {\n\t\t\tconst propertiesToReturn: (keyof IAuditableItemGraphVertex)[] = properties ?? [\n\t\t\t\t\"id\",\n\t\t\t\t\"dateCreated\",\n\t\t\t\t\"dateModified\",\n\t\t\t\t\"aliases\",\n\t\t\t\t\"annotationObject\"\n\t\t\t];\n\n\t\t\tconst orderProperty = orderBy ?? \"dateCreated\";\n\t\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\t\t\tconst idExact = options?.idExact ?? false;\n\t\t\tconst idOrAlias = options?.id;\n\t\t\tconst idMode = options?.idMode ?? \"both\";\n\t\t\tconst resourceTypes = options?.resourceTypes;\n\t\t\tconst hasIdFilter = Is.stringValue(idOrAlias);\n\t\t\tconst hasResourceTypes = Is.arrayValue(resourceTypes);\n\n\t\t\tif (!propertiesToReturn.includes(\"id\")) {\n\t\t\t\tpropertiesToReturn.unshift(\"id\");\n\t\t\t}\n\n\t\t\t// Every id, alias and resource type match is held in the index storage. Each filter is\n\t\t\t// one dimension, satisfied by any one of the entries of a vertex, and a vertex has to\n\t\t\t// satisfy every dimension it was given.\n\t\t\tconst indexDimensions: EntityCondition<AuditableItemGraphVertexIndex>[] = [];\n\n\t\t\tif (hasIdFilter) {\n\t\t\t\tconst comparison = idExact ? ComparisonOperator.Equals : ComparisonOperator.Includes;\n\t\t\t\tconst term = idOrAlias.toLowerCase();\n\t\t\t\tconst idPredicates: EntityCondition<AuditableItemGraphVertexIndex>[] = [];\n\n\t\t\t\tif (idMode === \"id\" || idMode === \"both\") {\n\t\t\t\t\tidPredicates.push(\n\t\t\t\t\t\tthis.indexTypeValueCondition(\n\t\t\t\t\t\t\tAuditableItemGraphService._INDEX_TYPE_VERTEX,\n\t\t\t\t\t\t\tcomparison,\n\t\t\t\t\t\t\tterm\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (idMode === \"alias\" || idMode === \"both\") {\n\t\t\t\t\tidPredicates.push(\n\t\t\t\t\t\tthis.indexTypeValueCondition(\n\t\t\t\t\t\t\tAuditableItemGraphService._INDEX_TYPE_ALIAS,\n\t\t\t\t\t\t\tcomparison,\n\t\t\t\t\t\t\tterm\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tindexDimensions.push(this.anyOfConditions(idPredicates));\n\t\t\t}\n\n\t\t\tif (hasResourceTypes) {\n\t\t\t\tindexDimensions.push(\n\t\t\t\t\tthis.indexTypeValueCondition(\n\t\t\t\t\t\tAuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE,\n\t\t\t\t\t\tComparisonOperator.In,\n\t\t\t\t\t\tresourceTypes.map(resourceType => resourceType.toLowerCase())\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (indexDimensions.length > 0) {\n\t\t\t\tconst indexPage = await this.queryIndexVertices(\n\t\t\t\t\tindexDimensions,\n\t\t\t\t\torderProperty,\n\t\t\t\t\torderDirection,\n\t\t\t\t\tpropertiesToReturn as (keyof AuditableItemGraphVertex)[],\n\t\t\t\t\tconditions,\n\t\t\t\t\tcursor,\n\t\t\t\t\tlimit\n\t\t\t\t);\n\n\t\t\t\treturn await this.buildVertexList(indexPage.entities, indexPage.cursor);\n\t\t\t}\n\n\t\t\tconst finalConditions: EntityCondition<IAuditableItemGraphVertex> = Is.empty(conditions)\n\t\t\t\t? { logicalOperator: LogicalOperator.And, conditions: [] }\n\t\t\t\t: conditions;\n\n\t\t\t// With no id, alias or resource type filter there is nothing for the index to answer,\n\t\t\t// so the vertex storage is queried directly and paged by its own cursor.\n\t\t\tconst results = await this._vertexStorage.query(\n\t\t\t\tfinalConditions,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: orderProperty,\n\t\t\t\t\t\tsortDirection: orderDirection\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tpropertiesToReturn as (keyof AuditableItemGraphVertex)[],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\treturn await this.buildVertexList(results.entities, results.cursor);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"queryingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Parse and validate a vertex URN; return the compact storage id.\n\t * @param id The vertex URN.\n\t * @returns The compact vertex id.\n\t * @throws GeneralError If the namespace does not match the expected namespace.\n\t * @internal\n\t */\n\tprivate parseVertexId(id: string): string {\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\treturn urnParsed.namespaceSpecific(0);\n\t}\n\n\t/**\n\t * Validate that a PATCH sub-list value is a list patch object, not a bare array.\n\t * @param propertyName The property name for error reporting.\n\t * @param patch The patch value.\n\t * @returns The validated list patch.\n\t * @throws GeneralError If the patch value is a bare array instead of a list patch object.\n\t * @internal\n\t */\n\tprivate validateListPatch<TItem>(\n\t\tpropertyName: string,\n\t\tpatch: unknown\n\t): IAuditableItemGraphListPatch<TItem> {\n\t\tif (Is.array(patch)) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"listPatchInvalidFormat\", {\n\t\t\t\tproperty: propertyName\n\t\t\t});\n\t\t}\n\n\t\tGuards.object<IAuditableItemGraphListPatch<TItem>>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tpropertyName,\n\t\t\tpatch\n\t\t);\n\n\t\treturn patch;\n\t}\n\n\t/**\n\t * Resolve the audit mode for an update, bypass is terminal so it can not return to audited.\n\t * @param vertexEntity The stored vertex entity.\n\t * @param requestedMode The audit mode requested by the caller, when absent the stored mode is kept.\n\t * @returns The audit mode to apply and whether the existing history must be compacted.\n\t * @throws GeneralError If a bypass vertex is being switched back to audited.\n\t * @internal\n\t */\n\tprivate resolveAuditModeTransition(\n\t\tvertexEntity: AuditableItemGraphVertex,\n\t\trequestedMode?: AuditableItemGraphAuditMode\n\t): { auditMode: AuditableItemGraphAuditMode; compactHistory: boolean } {\n\t\tconst currentMode = vertexEntity.auditMode ?? AuditableItemGraphAuditMode.Audited;\n\n\t\tif (Is.empty(requestedMode)) {\n\t\t\treturn { auditMode: currentMode, compactHistory: false };\n\t\t}\n\n\t\tif (\n\t\t\tcurrentMode === AuditableItemGraphAuditMode.Bypass &&\n\t\t\trequestedMode === AuditableItemGraphAuditMode.Audited\n\t\t) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"auditModeTransitionNotAllowed\",\n\t\t\t\t{\n\t\t\t\t\tcurrentMode,\n\t\t\t\t\trequestedMode\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tauditMode: requestedMode,\n\t\t\tcompactHistory:\n\t\t\t\tcurrentMode === AuditableItemGraphAuditMode.Audited &&\n\t\t\t\trequestedMode === AuditableItemGraphAuditMode.Bypass\n\t\t};\n\t}\n\n\t/**\n\t * Discard the changeset history for a vertex along with any proofs the changesets reference.\n\t * @param vertexId The compact vertex id.\n\t * @returns A promise that resolves when the history and its proofs have been removed.\n\t * @internal\n\t */\n\tprivate async compactVertexHistory(vertexId: string): Promise<void> {\n\t\tconst changesets = await this.internalGetChangesets(vertexId, [\"proofId\"]);\n\n\t\tfor (const changeset of changesets) {\n\t\t\tawait this._changesetStorage.remove(changeset.id);\n\t\t\tif (Is.stringValue(changeset.proofId)) {\n\t\t\t\tawait this._immutableProofComponent.remove(changeset.proofId);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Persist vertex changes after update or partial update.\n\t * @param context The context for the operation.\n\t * @param vertexId The compact vertex id.\n\t * @param vertexUrn The vertex URN for events.\n\t * @param originalEntity The entity before changes.\n\t * @param newEntity The entity after changes.\n\t * @param auditModeTransition The audit mode to apply and whether the history must be compacted.\n\t * @param auditModeTransition.auditMode The audit mode to apply.\n\t * @param auditModeTransition.compactHistory Whether the existing history must be discarded.\n\t * @returns A promise that resolves when the changes have been persisted and events published.\n\t * @internal\n\t */\n\tprivate async persistVertexChanges(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertexId: string,\n\t\tvertexUrn: string,\n\t\toriginalEntity: AuditableItemGraphVertex,\n\t\tnewEntity: AuditableItemGraphVertex,\n\t\tauditModeTransition: { auditMode: AuditableItemGraphAuditMode; compactHistory: boolean }\n\t): Promise<void> {\n\t\tif (auditModeTransition.auditMode === AuditableItemGraphAuditMode.Bypass) {\n\t\t\tawait this.persistBypassChanges(\n\t\t\t\tcontext,\n\t\t\t\tvertexId,\n\t\t\t\tvertexUrn,\n\t\t\t\toriginalEntity,\n\t\t\t\tnewEntity,\n\t\t\t\tauditModeTransition.compactHistory\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextVersion = Is.empty(originalEntity.version)\n\t\t\t? (await this.internalGetChangesets(vertexId, [])).length\n\t\t\t: originalEntity.version + 1;\n\t\tconst patches = await this.addChangeset(context, originalEntity, newEntity, false, nextVersion);\n\t\tif (patches.length > 0) {\n\t\t\tnewEntity.dateModified = context.now;\n\t\t\tnewEntity.version = nextVersion;\n\n\t\t\tawait this._vertexStorage.set(newEntity);\n\t\t\tawait this.syncVertexIndexes(newEntity);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t\t{\n\t\t\t\t\tpatchCount: patches.length\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t\t{ id: vertexUrn, patches }\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Persist vertex changes for a bypass vertex, overwriting the stored state with no changeset.\n\t * @param context The context for the operation.\n\t * @param vertexId The compact vertex id.\n\t * @param vertexUrn The vertex URN for events.\n\t * @param originalEntity The entity before changes.\n\t * @param newEntity The entity after changes.\n\t * @param compactHistory Whether the vertex is switching from audited and must discard its history.\n\t * @returns A promise that resolves when the changes have been persisted and events published.\n\t * @internal\n\t */\n\tprivate async persistBypassChanges(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertexId: string,\n\t\tvertexUrn: string,\n\t\toriginalEntity: AuditableItemGraphVertex,\n\t\tnewEntity: AuditableItemGraphVertex,\n\t\tcompactHistory: boolean\n\t): Promise<void> {\n\t\tnewEntity.auditMode = AuditableItemGraphAuditMode.Bypass;\n\t\tdelete newEntity.version;\n\n\t\tconst patches = JsonHelper.diff(originalEntity, newEntity);\n\t\tif (patches.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (compactHistory) {\n\t\t\tawait this.compactVertexHistory(vertexId);\n\t\t}\n\n\t\tnewEntity.dateModified = context.now;\n\n\t\tawait this._vertexStorage.set(newEntity);\n\t\tawait this.syncVertexIndexes(newEntity);\n\n\t\tawait MetricHelper.metricIncrement(\n\t\t\tthis._telemetryComponent,\n\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t{\n\t\t\t\tpatchCount: patches.length\n\t\t\t}\n\t\t);\n\n\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t{ id: vertexUrn, patches }\n\t\t);\n\t}\n\n\t/**\n\t * Whether the vertex records its mutations in place with no audit trail.\n\t * @param vertexEntity The stored vertex entity.\n\t * @returns True if the vertex is in bypass mode.\n\t * @internal\n\t */\n\tprivate isBypass(vertexEntity: AuditableItemGraphVertex): boolean {\n\t\treturn vertexEntity.auditMode === AuditableItemGraphAuditMode.Bypass;\n\t}\n\n\t/**\n\t * Map the vertex entity to JSON-LD.\n\t * @param vertexEntity The vertex entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate vertexEntityToJsonLd(vertexEntity: AuditableItemGraphVertex): IAuditableItemGraphVertex {\n\t\tconst model: IAuditableItemGraphVertex = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Vertex,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, vertexEntity.id).toString(),\n\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\tdateModified: vertexEntity.dateModified,\n\t\t\torganizationIdentity: vertexEntity.organizationIdentity,\n\t\t\tauditMode: vertexEntity.auditMode,\n\t\t\tannotationObject: vertexEntity.annotationObject\n\t\t};\n\n\t\tif (Is.arrayValue(vertexEntity.aliases)) {\n\t\t\tmodel.aliases ??= [];\n\t\t\tfor (const aliasEntity of vertexEntity.aliases) {\n\t\t\t\tconst aliasModel: IAuditableItemGraphAlias = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\tid: aliasEntity.id,\n\t\t\t\t\taliasFormat: aliasEntity.aliasFormat,\n\t\t\t\t\tdateCreated: aliasEntity.dateCreated,\n\t\t\t\t\tdateModified: aliasEntity.dateModified,\n\t\t\t\t\tdateDeleted: aliasEntity.dateDeleted,\n\t\t\t\t\tannotationObject: aliasEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.aliases.push(aliasModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.resources)) {\n\t\t\tmodel.resources ??= [];\n\t\t\tfor (const resourceEntity of vertexEntity.resources) {\n\t\t\t\tconst resourceModel: IAuditableItemGraphResource = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\tid: resourceEntity.id,\n\t\t\t\t\tdateCreated: resourceEntity.dateCreated,\n\t\t\t\t\tdateModified: resourceEntity.dateModified,\n\t\t\t\t\tdateDeleted: resourceEntity.dateDeleted,\n\t\t\t\t\tresourceObject: resourceEntity.resourceObject\n\t\t\t\t};\n\t\t\t\tmodel.resources.push(resourceModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.edges)) {\n\t\t\tmodel.edges ??= [];\n\t\t\tfor (const edgeEntity of vertexEntity.edges) {\n\t\t\t\tconst edgeModel: IAuditableItemGraphEdge = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\tid: this.fullEdgeId(vertexEntity.id, edgeEntity.id),\n\t\t\t\t\ttargetId: edgeEntity.targetId,\n\t\t\t\t\tdateCreated: edgeEntity.dateCreated,\n\t\t\t\t\tdateModified: edgeEntity.dateModified,\n\t\t\t\t\tdateDeleted: edgeEntity.dateDeleted,\n\t\t\t\t\tedgeRelationships: edgeEntity.edgeRelationships,\n\t\t\t\t\tannotationObject: edgeEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.edges.push(edgeModel);\n\t\t\t}\n\t\t}\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Map the changeset entity to a JSON-LD.\n\t * @param vertexId The id of the vertex the changeset belongs to.\n\t * @param changesetEntity The changeset entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate changesetEntityToJsonLd(\n\t\tvertexId: string,\n\t\tchangesetEntity: AuditableItemGraphChangeset\n\t): IAuditableItemGraphChangeset {\n\t\tconst model: IAuditableItemGraphChangeset = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Changeset,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\t\tvertexId,\n\t\t\t\tAuditableItemGraphService.NAMESPACE_CHANGESET,\n\t\t\t\tchangesetEntity.id\n\t\t\t]).toString(),\n\t\t\tdateCreated: changesetEntity.dateCreated,\n\t\t\tuserIdentity: changesetEntity.userIdentity,\n\t\t\tpatches: changesetEntity.patches.map(p => ({\n\t\t\t\t\"@context\": [\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t],\n\t\t\t\ttype: AuditableItemGraphTypes.PatchOperation,\n\t\t\t\tpatchOperation: p.op,\n\t\t\t\tpatchPath: p.path,\n\t\t\t\tpatchFrom: p.from,\n\t\t\t\tpatchValue: p.value\n\t\t\t})),\n\t\t\tproofId: changesetEntity.proofId,\n\t\t\tversion: changesetEntity.version\n\t\t};\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Fetch all changesets for a vertex in ascending date order.\n\t * @param vertexId The internal vertex id.\n\t * @param properties The additional changeset properties to retrieve, the id and dateCreated sort\n\t * keys are always included. Only the requested properties are populated on the returned\n\t * entities, so the large patches payload is only transferred when a caller reads it.\n\t * @param options Optional filtering options.\n\t * @param options.before Only fetch changesets created strictly before this ISO 8601 timestamp.\n\t * @param options.maxVersion Only fetch changesets with version <= this value.\n\t * @returns All changeset entities sorted ascending by dateCreated.\n\t * @internal\n\t */\n\tprivate async internalGetChangesets(\n\t\tvertexId: string,\n\t\tproperties: (keyof AuditableItemGraphChangeset)[],\n\t\toptions?: { before?: string; maxVersion?: number }\n\t): Promise<AuditableItemGraphChangeset[]> {\n\t\tconst all: AuditableItemGraphChangeset[] = [];\n\t\tlet cursor: string | undefined;\n\n\t\tconst propertiesToReturn: (keyof AuditableItemGraphChangeset)[] = [\"id\", \"dateCreated\"];\n\t\tfor (const property of properties) {\n\t\t\tif (!propertiesToReturn.includes(property)) {\n\t\t\t\tpropertiesToReturn.push(property);\n\t\t\t}\n\t\t}\n\n\t\tconst conditions: IComparator[] = [\n\t\t\t{ property: \"vertexId\", value: vertexId, comparison: ComparisonOperator.Equals }\n\t\t];\n\t\tif (Is.stringValue(options?.before)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\tvalue: options.before,\n\t\t\t\tcomparison: ComparisonOperator.LessThan\n\t\t\t});\n\t\t}\n\t\tif (!Is.empty(options?.maxVersion)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"version\",\n\t\t\t\tvalue: options.maxVersion,\n\t\t\t\tcomparison: ComparisonOperator.LessThanOrEqual\n\t\t\t});\n\t\t}\n\n\t\tdo {\n\t\t\tconst result = await this._changesetStorage.query(\n\t\t\t\t{ conditions, logicalOperator: LogicalOperator.And },\n\t\t\t\t[{ property: \"dateCreated\", sortDirection: SortDirection.Ascending }],\n\t\t\t\tpropertiesToReturn,\n\t\t\t\tcursor\n\t\t\t);\n\t\t\tall.push(...(result.entities as AuditableItemGraphChangeset[]));\n\t\t\tcursor = result.cursor;\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn all;\n\t}\n\n\t/**\n\t * Build the version list for an audited vertex from its changesets.\n\t * @param vertexId The compact vertex id.\n\t * @param afterDate Only include versions created after this date, exclusive.\n\t * @param beforeDate Only include versions created before this date, exclusive.\n\t * @returns The matching versions in ascending order.\n\t * @internal\n\t */\n\tprivate async auditedVersions(\n\t\tvertexId: string,\n\t\tafterDate?: Date,\n\t\tbeforeDate?: Date\n\t): Promise<{ version: number; dateCreated: string }[]> {\n\t\tconst allChangesets = await this.internalGetChangesets(vertexId, [\"version\"], {\n\t\t\tbefore: beforeDate?.toISOString()\n\t\t});\n\n\t\tconst versions: { version: number; dateCreated: string }[] = [];\n\t\tfor (const changeset of allChangesets) {\n\t\t\tconst changesetDate = Coerce.dateTime(changeset.dateCreated);\n\t\t\tconst afterExcluded =\n\t\t\t\t!Is.empty(afterDate) && !Is.empty(changesetDate) && changesetDate <= afterDate;\n\n\t\t\tif (!afterExcluded) {\n\t\t\t\tversions.push({\n\t\t\t\t\tversion: changeset.version ?? 0,\n\t\t\t\t\tdateCreated: changeset.dateCreated\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn versions;\n\t}\n\n\t/**\n\t * Build the version list for a bypass vertex, which only exposes its current state as\n\t * a single baseline entry numbered zero.\n\t * @param vertexEntity The stored vertex entity.\n\t * @param afterDate Only include the state when it was modified after this date, exclusive.\n\t * @param beforeDate Only include the state when it was modified before this date, exclusive.\n\t * @returns The baseline entry when the state falls within the range, otherwise empty.\n\t * @internal\n\t */\n\tprivate bypassVersions(\n\t\tvertexEntity: AuditableItemGraphVertex,\n\t\tafterDate?: Date,\n\t\tbeforeDate?: Date\n\t): { version: number; dateCreated: string }[] {\n\t\tconst stateDate = vertexEntity.dateModified ?? vertexEntity.dateCreated;\n\t\tconst stateDateTime = Coerce.dateTime(stateDate);\n\n\t\tif (!Is.empty(stateDateTime)) {\n\t\t\tif (!Is.empty(beforeDate) && stateDateTime >= beforeDate) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tif (!Is.empty(afterDate) && stateDateTime <= afterDate) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\treturn [{ version: 0, dateCreated: stateDate }];\n\t}\n\n\t/**\n\t * Replace the aliases of a vertex model (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param aliases The new active alias set.\n\t * @returns A promise that resolves when the alias list has been replaced.\n\t * @internal\n\t */\n\tprivate async updateAliasList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\taliases?: IAuditableItemGraphAlias[]\n\t): Promise<void> {\n\t\tconst active = vertex.aliases?.filter(a => Is.empty(a.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const alias of active) {\n\t\t\t\tif (!aliases?.find(a => a.id === alias.id)) {\n\t\t\t\t\talias.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.AliasesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(aliases)) {\n\t\t\tfor (const alias of aliases) {\n\t\t\t\tawait this.updateAlias(context, vertex, alias);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply alias patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The alias patch.\n\t * @returns A promise that resolves when the alias patch has been applied.\n\t * @internal\n\t */\n\tprivate async applyAliasPatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphAlias>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst alias = vertex.aliases?.find(a => a.id === removeId && Is.empty(a.dateDeleted));\n\t\t\t\tif (!Is.empty(alias)) {\n\t\t\t\t\talias.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.AliasesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(patch.add)) {\n\t\t\tfor (const alias of patch.add) {\n\t\t\t\tawait this.updateAlias(context, vertex, alias);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update an alias in the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param alias The alias.\n\t * @returns A promise that resolves when the alias has been added or updated.\n\t * @internal\n\t */\n\tprivate async updateAlias(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\talias: IAuditableItemGraphAlias\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(alias), alias);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(alias.id), alias.id);\n\n\t\tif (alias.unique ?? false) {\n\t\t\tconst existingVertices = await this.findMatchingVertices(vertex.id, alias.id);\n\t\t\tif (existingVertices) {\n\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"aliasNotUnique\", {\n\t\t\t\t\taliasId: alias.id\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (Is.object(alias.annotationObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(alias.annotationObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(alias.annotationObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing alias with the same id.\n\t\tconst existing = vertex.aliases?.find(a => a.id === alias.id);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.aliases ??= [];\n\n\t\t\tconst model: AuditableItemGraphAlias = {\n\t\t\t\tid: alias.id,\n\t\t\t\taliasFormat: alias.aliasFormat,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: alias.annotationObject,\n\t\t\t\tunique: alias.unique\n\t\t\t};\n\n\t\t\tvertex.aliases.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.AliasesAdded\n\t\t\t);\n\t\t} else if (\n\t\t\texisting.aliasFormat !== alias.aliasFormat ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, alias.annotationObject, false) ||\n\t\t\texisting.unique !== alias.unique\n\t\t) {\n\t\t\t// Existing alias found, update the annotationObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.aliasFormat = alias.aliasFormat;\n\t\t\texisting.annotationObject = alias.annotationObject;\n\t\t\texisting.unique = alias.unique;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.AliasesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Replace the resources of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resources The new active resource set.\n\t * @returns A promise that resolves when the resource list has been replaced.\n\t * @internal\n\t */\n\tprivate async updateResourceList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresources?: IAuditableItemGraphResource[]\n\t): Promise<void> {\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst id = this.getResourceId(resources[i]);\n\t\t\t\tif (Is.empty(id)) {\n\t\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"resourceIdMissing\", {\n\t\t\t\t\t\tindex: i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst active = vertex.resources?.filter(r => Is.empty(r.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const resource of active) {\n\t\t\t\tif (!resources?.find(a => this.getResourceId(a) === this.getResourceId(resource))) {\n\t\t\t\t\tresource.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.ResourcesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (const resource of resources) {\n\t\t\t\tawait this.updateResource(context, vertex, resource);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply resource patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The resource patch.\n\t * @returns A promise that resolves when the resource patch has been applied.\n\t * @internal\n\t */\n\tprivate async applyResourcePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphResource>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst resource = vertex.resources?.find(\n\t\t\t\t\tr => this.getResourceId(r) === removeId && Is.empty(r.dateDeleted)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(resource)) {\n\t\t\t\t\tresource.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.ResourcesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(patch.add)) {\n\t\t\tfor (const resource of patch.add) {\n\t\t\t\tawait this.updateResource(context, vertex, resource);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add a resource to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resource The resource.\n\t * @returns A promise that resolves when the resource has been added or updated.\n\t * @internal\n\t */\n\tprivate async updateResource(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresource: IAuditableItemGraphResource\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(resource), resource);\n\n\t\tif (Is.object(resource.resourceObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(resource.resourceObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(resource.resourceObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing resource with the same id.\n\t\tconst existing = vertex.resources?.find(\n\t\t\tr => this.getResourceId(r) === this.getResourceId(resource)\n\t\t);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.resources ??= [];\n\n\t\t\tconst model: AuditableItemGraphResource = {\n\t\t\t\tid: resource.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tresourceObject: resource.resourceObject\n\t\t\t};\n\n\t\t\tvertex.resources.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ResourcesAdded\n\t\t\t);\n\t\t} else if (!ObjectHelper.equal(existing.resourceObject, resource.resourceObject, false)) {\n\t\t\t// Existing resource found, update the resourceObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.resourceObject = resource.resourceObject;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ResourcesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Replace the edges of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edges The new active edge set.\n\t * @returns A promise that resolves when the edge list has been replaced.\n\t * @internal\n\t */\n\tprivate async updateEdgeList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedges?: IAuditableItemGraphEdge[]\n\t): Promise<void> {\n\t\t// `active` shares element refs with `vertex.edges` (the cloned newEntity); mutating `edge` below is intended.\n\t\tconst active = vertex.edges?.filter(e => Is.empty(e.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const edge of active) {\n\t\t\t\tif (\n\t\t\t\t\t!edges?.find(\n\t\t\t\t\t\te =>\n\t\t\t\t\t\t\tthis.edgeMatchesStoredEdge(e, edge.id) ||\n\t\t\t\t\t\t\tthis.edgeMatchesActiveEdgeByRelationship(e, edge)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tedge.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.EdgesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(edges)) {\n\t\t\tfor (const edge of edges) {\n\t\t\t\tawait this.updateEdge(context, vertex, edge);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply edge patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The edge patch.\n\t * @returns A promise that resolves when the edge patch has been applied.\n\t * @internal\n\t */\n\tprivate async applyEdgePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphEdge>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst edge = vertex.edges?.find(\n\t\t\t\t\te => Is.empty(e.dateDeleted) && this.edgeRemoveIdMatches(e.id, removeId)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(edge)) {\n\t\t\t\t\tedge.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.EdgesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(patch.add)) {\n\t\t\tfor (const edge of patch.add) {\n\t\t\t\tawait this.updateEdge(context, vertex, edge);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add an edge to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edge The edge.\n\t * @returns A promise that resolves when the edge has been added or updated.\n\t * @internal\n\t */\n\tprivate async updateEdge(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedge: IAuditableItemGraphEdge\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(edge), edge);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(edge.targetId), edge.targetId);\n\t\tGuards.arrayValue(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.edgeRelationships),\n\t\t\tedge.edgeRelationships\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tif (edge.targetId === vertex.id) {\n\t\t\tvalidationFailures.push({\n\t\t\t\tproperty: \"id\",\n\t\t\t\treason: `validation.${StringHelper.camelCase(AuditableItemGraphService.CLASS_NAME)}.edgeIdSameAsVertexId`,\n\t\t\t\tproperties: {\n\t\t\t\t\ttargetId: edge.targetId\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (Is.object(edge.annotationObject)) {\n\t\t\tawait JsonLdHelper.validate(edge.annotationObject, validationFailures);\n\t\t}\n\t\tValidation.asValidationError(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.annotationObject),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tlet findId = Is.stringValue(edge.id) ? this.reduceEdgeId(edge.id) : undefined;\n\t\tif (Is.empty(findId)) {\n\t\t\tconst existingActive = vertex.edges?.find(\n\t\t\t\te =>\n\t\t\t\t\tIs.empty(e.dateDeleted) &&\n\t\t\t\t\te.targetId === edge.targetId &&\n\t\t\t\t\tArrayHelper.matches(e.edgeRelationships, edge.edgeRelationships)\n\t\t\t);\n\t\t\tfindId = existingActive?.id ?? RandomHelper.generateUuidV7(\"compact\");\n\t\t}\n\n\t\t// Try to find an existing edge with the same id.\n\t\tconst existing = vertex.edges?.find(r => r.id === findId);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.edges ??= [];\n\n\t\t\tconst model: AuditableItemGraphEdge = {\n\t\t\t\tid: findId,\n\t\t\t\ttargetId: edge.targetId,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: edge.annotationObject,\n\t\t\t\tedgeRelationships: edge.edgeRelationships\n\t\t\t};\n\n\t\t\tvertex.edges.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.EdgesAdded\n\t\t\t);\n\t\t} else if (\n\t\t\texisting.targetId !== edge.targetId ||\n\t\t\t!ArrayHelper.matches(existing.edgeRelationships, edge.edgeRelationships) ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, edge.annotationObject, false)\n\t\t) {\n\t\t\t// Existing edge found, update the properties.\n\t\t\texisting.targetId = edge.targetId;\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.edgeRelationships = edge.edgeRelationships;\n\t\t\texisting.annotationObject = edge.annotationObject;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.EdgesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a changeset to the vertex and generate the associated verifications.\n\t * @param context The context for the operation.\n\t * @param original The original vertex.\n\t * @param updated The updated vertex.\n\t * @param isNew Whether this is a new item.\n\t * @param version The version number of the vertex after this changeset.\n\t * @returns True if there were changes.\n\t * @internal\n\t */\n\tprivate async addChangeset(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\toriginal: AuditableItemGraphVertex,\n\t\tupdated: AuditableItemGraphVertex,\n\t\tisNew: boolean,\n\t\tversion: number\n\t): Promise<IPatchOperation[]> {\n\t\tconst patches = JsonHelper.diff(original, updated);\n\n\t\t// If there is a diff set or this is the first time the item is created.\n\t\tif (patches.length > 0 || isNew) {\n\t\t\tconst changesetEntity: AuditableItemGraphChangeset = {\n\t\t\t\tid: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\tvertexId: updated.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tuserIdentity: context.userIdentity,\n\t\t\t\tpatches,\n\t\t\t\tversion\n\t\t\t};\n\n\t\t\t// Create the JSON-LD object we want to use for the proof\n\t\t\t// this is a subset of fixed properties from the changeset object.\n\t\t\tconst reducedChangesetJsonLd = this.changesetEntityToJsonLd(\n\t\t\t\toriginal.id,\n\t\t\t\tObjectHelper.pick(changesetEntity, AuditableItemGraphService._PROOF_KEYS_CHANGESET)\n\t\t\t);\n\n\t\t\t// Create the proof for the changeset object only when the vertex has\n\t\t\t// an owning organisation. Vertices created by inbound unauthenticated\n\t\t\t// activities (e.g. DSP push via skipAuth inbox) have no org context at\n\t\t\t// creation time and must not require a proof until a local org claims\n\t\t\t// ownership through an authenticated interaction.\n\t\t\tif (Is.stringValue(updated.organizationIdentity)) {\n\t\t\t\tchangesetEntity.proofId = await this._immutableProofComponent.create(\n\t\t\t\t\tJsonLdHelper.toNodeObject(reducedChangesetJsonLd)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Link the storage id to the changeset\n\t\t\tawait this._changesetStorage.set(changesetEntity);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ChangesetsCreated\n\t\t\t);\n\n\t\t\treturn patches;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Verify the changesets of a vertex.\n\t * @param vertex The vertex to verify.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @returns The verified flag and list of changesets.\n\t * @internal\n\t */\n\tprivate async verifyChangesets(\n\t\tvertex: IAuditableItemGraphVertex,\n\t\tverifySignatureDepth: VerifyDepth\n\t): Promise<{\n\t\tverified: boolean;\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\n\t\tlet verified = true;\n\n\t\tconst vertexIdUrn = Urn.fromValidString(vertex.id);\n\t\tconst vertexId = vertexIdUrn.namespaceSpecific();\n\t\tlet cursor;\n\n\t\tdo {\n\t\t\tconst chunk = await this.verifyChangesetChunk(vertexId, verifySignatureDepth, cursor);\n\t\t\tcursor = chunk.cursor;\n\t\t\tif (!chunk.verified) {\n\t\t\t\tverified = false;\n\t\t\t}\n\t\t\tchangesets.push(...chunk.changesets);\n\t\t} while (Is.stringValue(cursor));\n\n\t\tif (verified) {\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t);\n\t\t} else {\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tverified,\n\t\t\tchangesets\n\t\t};\n\t}\n\n\t/**\n\t * Verify a chunk of changesets for a vertex.\n\t * @param vertexId The id of the vertex to verify the changesets for.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @param cursor The cursor to request the next chunk of changesets.\n\t * @param limit The maximum number of changesets to verify in this chunk.\n\t * @returns The changesets and whether they were verified.\n\t * @internal\n\t */\n\tprivate async verifyChangesetChunk(\n\t\tvertexId: string,\n\t\tverifySignatureDepth: string,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t\tverified: boolean;\n\t\tcursor?: string;\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\t\tlet verified = true;\n\n\t\tconst changesetsResult = await this._changesetStorage.query(\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tvalue: vertexId,\n\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t},\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tconst storedChangesets = changesetsResult.entities as AuditableItemGraphChangeset[];\n\t\tif (Is.arrayValue(storedChangesets)) {\n\t\t\tfor (let i = 0; i < storedChangesets.length; i++) {\n\t\t\t\tconst storedChangeset = storedChangesets[i];\n\n\t\t\t\tconst storedChangesetJsonLd = this.changesetEntityToJsonLd(vertexId, storedChangeset);\n\t\t\t\tchangesets.push(storedChangesetJsonLd);\n\n\t\t\t\t// If we are verifying all signatures\n\t\t\t\t// or this is the last changeset (cursor is empty)\n\t\t\t\t// and the changeset has a proofId, then verify the proof.\n\t\t\t\tif (\n\t\t\t\t\tverifySignatureDepth === VerifyDepth.All ||\n\t\t\t\t\t(verifySignatureDepth === VerifyDepth.Current &&\n\t\t\t\t\t\t!Is.stringValue(changesetsResult.cursor) &&\n\t\t\t\t\t\ti === storedChangesets.length - 1)\n\t\t\t\t) {\n\t\t\t\t\tstoredChangesetJsonLd.verification =\n\t\t\t\t\t\tawait this.verifyChangesetSignature(storedChangesetJsonLd);\n\t\t\t\t\tif (storedChangesetJsonLd.verification?.verified !== true) {\n\t\t\t\t\t\tverified = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { changesets, verified, cursor: changesetsResult.cursor };\n\t}\n\n\t/**\n\t * Verify the signature of a changeset and add the verification result to the changeset JSON-LD.\n\t * @param storedChangeset The changeset to verify.\n\t * @returns Whether the changeset is verified.\n\t * @internal\n\t */\n\tprivate async verifyChangesetSignature(\n\t\tstoredChangeset: IAuditableItemGraphChangeset\n\t): Promise<IImmutableProofVerification | undefined> {\n\t\tlet verification: IImmutableProofVerification | undefined;\n\t\tif (!Is.stringValue(storedChangeset.proofId)) {\n\t\t\tverification = {\n\t\t\t\t\"@context\": ImmutableProofContexts.Context,\n\t\t\t\ttype: ImmutableProofTypes.ImmutableProofVerification,\n\t\t\t\tverified: false,\n\t\t\t\tfailure: ImmutableProofFailure.ProofMissing\n\t\t\t};\n\t\t} else {\n\t\t\t// Verify the proof for the changeset object\n\t\t\tverification = await this._immutableProofComponent.verify(storedChangeset.proofId);\n\t\t}\n\t\treturn verification;\n\t}\n\n\t/**\n\t * Get the resource id from a resource object.\n\t * @param resource The resource.\n\t * @param resource.id The id of the resource.\n\t * @param resource.resourceObject The resource object.\n\t * @returns The resource id if it can find one.\n\t * @internal\n\t */\n\tprivate getResourceId(resource: {\n\t\tid?: string;\n\t\tresourceObject?: IJsonLdNodeObject;\n\t}): string | undefined {\n\t\treturn (\n\t\t\tresource.id ??\n\t\t\tObjectHelper.extractProperty<string>(resource.resourceObject, [\"id\", \"@id\"], false)\n\t\t);\n\t}\n\n\t/**\n\t * Synchronise the index storage with the current state of a vertex.\n\t * @param vertex The vertex to synchronise the index entries for.\n\t * @returns A promise that resolves when the index entries match the vertex.\n\t * @internal\n\t */\n\tprivate async syncVertexIndexes(vertex: AuditableItemGraphVertex): Promise<void> {\n\t\tconst required = new Map<string, { type: string; value: string }>();\n\n\t\t// An entry always carries a modified date so a query ordered by it can be paged by the\n\t\t// same key set as the creation date, falling back to the creation date for a vertex which\n\t\t// has never been modified rather than leaving the column empty.\n\t\tconst indexDateModified = vertex.dateModified ?? vertex.dateCreated;\n\n\t\t// Every vertex carries an entry for its own id, so a query matching on the vertex id can\n\t\t// be answered from the index alone. Without it a vertex holding no aliases and no\n\t\t// resources would have no entries at all and could never be matched here.\n\t\tconst vertexIdValue = vertex.id.toLowerCase();\n\t\trequired.set(`${AuditableItemGraphService._INDEX_TYPE_VERTEX}|${vertexIdValue}`, {\n\t\t\ttype: AuditableItemGraphService._INDEX_TYPE_VERTEX,\n\t\t\tvalue: vertexIdValue\n\t\t});\n\n\t\t// Index values are case folded here, and every lookup folds its term to match, so the\n\t\t// comparisons stay case insensitive without relying on the column collation or on the\n\t\t// connector folding case itself. The vertex keeps the value exactly as supplied.\n\t\tfor (const alias of vertex.aliases ?? []) {\n\t\t\tif (Is.empty(alias.dateDeleted) && Is.stringValue(alias.id)) {\n\t\t\t\tconst value = alias.id.toLowerCase();\n\t\t\t\trequired.set(`${AuditableItemGraphService._INDEX_TYPE_ALIAS}|${value}`, {\n\t\t\t\t\ttype: AuditableItemGraphService._INDEX_TYPE_ALIAS,\n\t\t\t\t\tvalue\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (const resource of vertex.resources ?? []) {\n\t\t\tconst resourceType = ObjectHelper.extractProperty<string>(\n\t\t\t\tresource.resourceObject,\n\t\t\t\t[\"@type\", \"type\"],\n\t\t\t\tfalse\n\t\t\t);\n\n\t\t\tif (Is.stringValue(resourceType)) {\n\t\t\t\tconst value = resourceType.toLowerCase();\n\t\t\t\trequired.set(`${AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE}|${value}`, {\n\t\t\t\t\ttype: AuditableItemGraphService._INDEX_TYPE_RESOURCE_TYPE,\n\t\t\t\t\tvalue\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst existing = await this.queryVertexIndexes(\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: vertex.id\n\t\t\t},\n\t\t\t[\"id\", \"type\", \"value\", \"dateCreated\", \"dateModified\"]\n\t\t);\n\n\t\t// Collapse by row id first. A paged read can return the same row on more than one page,\n\t\t// and without this a retained row could be queued for removal by its own duplicate.\n\t\tconst existingById = new Map<string, Partial<AuditableItemGraphVertexIndex>>();\n\t\tfor (const entry of existing) {\n\t\t\tif (Is.stringValue(entry.id)) {\n\t\t\t\texistingById.set(entry.id, entry);\n\t\t\t}\n\t\t}\n\n\t\tconst retainedKeys = new Set<string>();\n\t\tconst removeIds: string[] = [];\n\t\tconst writeEntries: AuditableItemGraphVertexIndex[] = [];\n\n\t\tfor (const [id, entry] of existingById) {\n\t\t\t// Entries which are no longer required, and any duplicates of a retained entry,\n\t\t\t// are removed so exactly one entry remains per index value.\n\t\t\tconst key = `${entry.type}|${entry.value}`;\n\t\t\tconst requiredEntry = required.get(key);\n\t\t\tif (!Is.empty(requiredEntry) && !retainedKeys.has(key)) {\n\t\t\t\tretainedKeys.add(key);\n\t\t\t\tif (entry.dateCreated !== vertex.dateCreated || entry.dateModified !== indexDateModified) {\n\t\t\t\t\t// Keep the row id so the copied dates are corrected in place rather than duplicated.\n\t\t\t\t\twriteEntries.push({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tvertexId: vertex.id,\n\t\t\t\t\t\ttype: requiredEntry.type,\n\t\t\t\t\t\tvalue: requiredEntry.value,\n\t\t\t\t\t\tdateCreated: vertex.dateCreated,\n\t\t\t\t\t\tdateModified: indexDateModified\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveIds.push(id);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, entry] of required) {\n\t\t\tif (!retainedKeys.has(key)) {\n\t\t\t\tconst writeEntry = {\n\t\t\t\t\tvertexId: vertex.id,\n\t\t\t\t\ttype: entry.type,\n\t\t\t\t\tvalue: entry.value,\n\t\t\t\t\tdateCreated: vertex.dateCreated,\n\t\t\t\t\tdateModified: indexDateModified\n\t\t\t\t};\n\n\t\t\t\twriteEntries.push({\n\t\t\t\t\tid: Converter.bytesToHex(\n\t\t\t\t\t\tBlake2b.sum256(ObjectHelper.toBytes(JsonHelper.canonicalize(writeEntry)))\n\t\t\t\t\t),\n\t\t\t\t\t...writeEntry\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (removeIds.length > 0) {\n\t\t\tawait this._vertexIndexStorage.removeBatch(removeIds);\n\t\t}\n\n\t\tif (writeEntries.length > 0) {\n\t\t\tawait this._vertexIndexStorage.setBatch(writeEntries);\n\t\t}\n\t}\n\n\t/**\n\t * Build the JSON-LD vertex list returned by query, and record the query metric.\n\t * @param entities The vertex entities for the page.\n\t * @param cursor The already encoded cursor for the next page.\n\t * @returns The compacted vertex list and the cursor.\n\t * @internal\n\t */\n\tprivate async buildVertexList(\n\t\tentities: Partial<AuditableItemGraphVertex>[],\n\t\tcursor?: string\n\t): Promise<{ entries: IAuditableItemGraphVertexList; cursor?: string }> {\n\t\tconst models: IAuditableItemGraphVertex[] = entities.map(e =>\n\t\t\tthis.vertexEntityToJsonLd(e as AuditableItemGraphVertex)\n\t\t);\n\n\t\tconst vertexList: IAuditableItemGraphVertexList = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexList],\n\t\t\t[SchemaOrgTypes.ItemListElement]: models\n\t\t};\n\n\t\tconst result = await JsonLdProcessor.compact(vertexList, vertexList[\"@context\"], {\n\t\t\tcompactArrays: false\n\t\t});\n\n\t\tawait MetricHelper.metricIncrement(\n\t\t\tthis._telemetryComponent,\n\t\t\tAuditableItemGraphMetricIds.QueriesExecuted,\n\t\t\t{\n\t\t\t\tresultCount: models.length,\n\t\t\t\thasMore: Is.stringValue(cursor)\n\t\t\t}\n\t\t);\n\n\t\treturn {\n\t\t\tentries: result,\n\t\t\tcursor\n\t\t};\n\t}\n\n\t/**\n\t * Build the condition matching one index type and value.\n\t * @param type The index type to match.\n\t * @param comparison The comparison to apply to the value.\n\t * @param value The index value or values to match, already lower cased.\n\t * @returns The condition.\n\t * @internal\n\t */\n\tprivate indexTypeValueCondition(\n\t\ttype: string,\n\t\tcomparison: ComparisonOperator,\n\t\tvalue: string | string[]\n\t): EntityCondition<AuditableItemGraphVertexIndex> {\n\t\treturn {\n\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\tconditions: [\n\t\t\t\t{ property: \"type\", comparison: ComparisonOperator.Equals, value: type },\n\t\t\t\t{ property: \"value\", comparison, value }\n\t\t\t]\n\t\t};\n\t}\n\n\t/**\n\t * Combine conditions so that matching any one of them is enough.\n\t * @param conditions The conditions to combine.\n\t * @returns The single condition when only one was given, otherwise their union.\n\t * @internal\n\t */\n\tprivate anyOfConditions(\n\t\tconditions: EntityCondition<AuditableItemGraphVertexIndex>[]\n\t): EntityCondition<AuditableItemGraphVertexIndex> {\n\t\treturn conditions.length === 1\n\t\t\t? conditions[0]\n\t\t\t: { logicalOperator: LogicalOperator.Or, conditions };\n\t}\n\n\t/**\n\t * Read one page of vertices whose index entries satisfy every dimension. The entries of a\n\t * vertex are grouped so it appears once however many of them match, its vertex is joined to\n\t * the page so no second read is needed, and the connector pages the groups with its own cursor.\n\t * @param dimensions The index conditions, a vertex has to satisfy every one of them.\n\t * @param orderProperty The index date property to order by.\n\t * @param orderDirection The direction to order in.\n\t * @param propertiesToReturn The vertex properties to return.\n\t * @param conditions Additional conditions the vertices must match.\n\t * @param cursor The cursor returned by the previous page.\n\t * @param limit The maximum number of vertices to return.\n\t * @returns The vertices in order and the cursor for the next page.\n\t * @internal\n\t */\n\tprivate async queryIndexVertices(\n\t\tdimensions: EntityCondition<AuditableItemGraphVertexIndex>[],\n\t\torderProperty: \"dateCreated\" | \"dateModified\",\n\t\torderDirection: SortDirection,\n\t\tpropertiesToReturn: (keyof AuditableItemGraphVertex)[],\n\t\tconditions?: EntityCondition<IAuditableItemGraphVertex>,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{ entities: Partial<AuditableItemGraphVertex>[]; cursor?: string }> {\n\t\t// An entry only ever satisfies one dimension, so the entries of every dimension have to\n\t\t// survive into the group for the group conditions to find them there, which is why the\n\t\t// conditions are their union and the dimensions are applied across the group.\n\t\tconst results = await this._vertexIndexStorage.queryJoin<AuditableItemGraphVertex>(\n\t\t\tthis._vertexStorage,\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tjoinProperty: \"id\",\n\t\t\t\tgroupProperty: \"vertexId\",\n\t\t\t\tconditions: this.anyOfConditions(dimensions),\n\t\t\t\tgroupConditions: dimensions.length > 1 ? dimensions : undefined,\n\t\t\t\tsortProperties: [\n\t\t\t\t\t{ property: orderProperty, sortDirection: orderDirection },\n\t\t\t\t\t{ property: \"vertexId\", sortDirection: SortDirection.Ascending }\n\t\t\t\t],\n\t\t\t\tproperties: [\"vertexId\"],\n\t\t\t\tjoinConditions: conditions,\n\t\t\t\tjoinRequired: true,\n\t\t\t\tjoinProperties: propertiesToReturn,\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t}\n\t\t);\n\n\t\t// The join is required, so every group which survived carries its vertex.\n\t\treturn {\n\t\t\tentities: results.entities.map(entity => entity.joined[0]),\n\t\t\tcursor: results.cursor\n\t\t};\n\t}\n\n\t/**\n\t * Query all the pages of the vertex index storage which match the conditions.\n\t * @param conditions The conditions to match.\n\t * @param properties The properties to return.\n\t * @returns The matching index entries.\n\t * @internal\n\t */\n\tprivate async queryVertexIndexes(\n\t\tconditions: EntityCondition<AuditableItemGraphVertexIndex>,\n\t\tproperties: (keyof AuditableItemGraphVertexIndex)[]\n\t): Promise<Partial<AuditableItemGraphVertexIndex>[]> {\n\t\tconst entities: Partial<AuditableItemGraphVertexIndex>[] = [];\n\t\tlet cursor: string | undefined;\n\n\t\tdo {\n\t\t\t// Paging needs a deterministic order or a row can be repeated or skipped between\n\t\t\t// pages, the entity declares no default sort so the primary key is used.\n\t\t\tconst results = await this._vertexIndexStorage.query(\n\t\t\t\tconditions,\n\t\t\t\t[{ property: \"id\", sortDirection: SortDirection.Ascending }],\n\t\t\t\tproperties,\n\t\t\t\tcursor\n\t\t\t);\n\t\t\tentities.push(...results.entities);\n\t\t\tcursor = results.cursor;\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn entities;\n\t}\n\n\t/**\n\t * Find vertices with matching aliases.\n\t * @param vertexId The id of the vertex to exclude from the search.\n\t * @param aliasId The alias id to try and find.\n\t * @returns True if any other vertices have matching aliases.\n\t * @internal\n\t */\n\tprivate async findMatchingVertices(vertexId: string, aliasId: string): Promise<boolean> {\n\t\tconst entities = await this.queryVertexIndexes(\n\t\t\t{\n\t\t\t\tlogicalOperator: LogicalOperator.And,\n\t\t\t\tconditions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"type\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\t\tvalue: AuditableItemGraphService._INDEX_TYPE_ALIAS\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"value\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\t\tvalue: aliasId.toLowerCase()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.NotEquals,\n\t\t\t\t\t\tvalue: vertexId\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t[\"vertexId\"]\n\t\t);\n\n\t\treturn entities.length > 0;\n\t}\n\n\t/**\n\t * Whether an incoming edge matches a stored edge id.\n\t * @param incoming The incoming edge.\n\t * @param storedEdgeId The compact stored edge id.\n\t * @returns True if the incoming edge matches the stored edge id.\n\t * @internal\n\t */\n\tprivate edgeMatchesStoredEdge(incoming: IAuditableItemGraphEdge, storedEdgeId: string): boolean {\n\t\treturn Is.stringValue(incoming.id) && this.reduceEdgeId(incoming.id) === storedEdgeId;\n\t}\n\n\t/**\n\t * Whether a PATCH remove id matches a stored compact edge id (full URN or compact).\n\t * @param storedEdgeId The compact stored edge id.\n\t * @param removeId The id from the patch remove list.\n\t * @returns True if the remove id identifies the stored edge.\n\t * @internal\n\t */\n\tprivate edgeRemoveIdMatches(storedEdgeId: string, removeId: string): boolean {\n\t\tif (storedEdgeId === removeId) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttry {\n\t\t\treturn this.reduceEdgeId(removeId) === storedEdgeId;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Whether an incoming id-less edge matches an active stored edge by target and relationships.\n\t * @param incoming The incoming edge.\n\t * @param stored The stored edge.\n\t * @returns True if they match.\n\t * @internal\n\t */\n\tprivate edgeMatchesActiveEdgeByRelationship(\n\t\tincoming: IAuditableItemGraphEdge,\n\t\tstored: AuditableItemGraphEdge\n\t): boolean {\n\t\treturn (\n\t\t\tIs.empty(incoming.id) &&\n\t\t\tIs.empty(stored.dateDeleted) &&\n\t\t\tincoming.targetId === stored.targetId &&\n\t\t\tArrayHelper.matches(incoming.edgeRelationships, stored.edgeRelationships)\n\t\t);\n\t}\n\n\t/**\n\t * Reduce the edge ID from a URN.\n\t * @param urn The URN to reduce.\n\t * @returns The edge ID.\n\t * @throws GeneralError if the URN is not valid or not an edge URN.\n\t * @internal\n\t */\n\tprivate reduceEdgeId(urn: string): string {\n\t\tconst urnParsed = Urn.fromValidString(urn);\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts().length !== 3) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts()[1] !== AuditableItemGraphService.NAMESPACE_EDGE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\treturn urnParsed.namespaceSpecificParts()[2];\n\t}\n\n\t/**\n\t * Create a full edge ID URN from a vertex ID and edge ID.\n\t * @param vertexId The vertex id the edge belongs to.\n\t * @param edgeId The edge id.\n\t * @returns The full edge ID URN.\n\t * @internal\n\t */\n\tprivate fullEdgeId(vertexId: string, edgeId: string): string {\n\t\treturn new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\tvertexId,\n\t\t\tAuditableItemGraphService.NAMESPACE_EDGE,\n\t\t\tedgeId\n\t\t]).toString();\n\t}\n}\n"]}
package/docs/changelog.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.1-next.3](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.10.1-next.2...auditable-item-graph-service-v0.10.1-next.3) (2026-09-23)
4
+
5
+
6
+ ### Features
7
+
8
+ * use canonical hash for index id ([e6bbedb](https://github.com/iotaledger/twin-auditable-item-graph/commit/e6bbedb9b777af52e104cfa9cf27be549c3594ba))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/auditable-item-graph-models bumped from 0.10.1-next.2 to 0.10.1-next.3
16
+
17
+ ## [0.10.1-next.2](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.10.1-next.1...auditable-item-graph-service-v0.10.1-next.2) (2026-09-22)
18
+
19
+
20
+ ### Features
21
+
22
+ * use entity storage query join ([#155](https://github.com/iotaledger/twin-auditable-item-graph/issues/155)) ([116bc94](https://github.com/iotaledger/twin-auditable-item-graph/commit/116bc94183fc70442ff2948d2506c65eb920b20e))
23
+
24
+
25
+ ### Dependencies
26
+
27
+ * The following workspace dependencies were updated
28
+ * dependencies
29
+ * @twin.org/auditable-item-graph-models bumped from 0.10.1-next.1 to 0.10.1-next.2
30
+
3
31
  ## [0.10.1-next.1](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.10.1-next.0...auditable-item-graph-service-v0.10.1-next.1) (2026-09-18)
4
32
 
5
33
 
package/locales/en.json CHANGED
@@ -9,7 +9,6 @@
9
9
  "versionNotFound": "The version with the Id \"{notFoundId}\" was not found",
10
10
  "updatingFailed": "Updating the Auditable Item Graph vertex failed",
11
11
  "queryingFailed": "Querying the Auditable Item Graph failed",
12
- "invalidCursor": "The cursor is not valid, it must be one returned by a matching query",
13
12
  "removeProofFailed": "Removing the proof from the Auditable Item Graph vertex failed",
14
13
  "vertexNotFound": "The vertex with the Id \"{notFoundId}\" was not found",
15
14
  "changesetNotFound": "The changeset with the Id \"{notFoundId}\" was not found",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/auditable-item-graph-service",
3
- "version": "0.10.1-next.1",
3
+ "version": "0.10.1-next.3",
4
4
  "description": "Implements graph lifecycle operations and audited change tracking with API route definitions.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,9 +15,10 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@twin.org/api-models": "next",
18
- "@twin.org/auditable-item-graph-models": "0.10.1-next.1",
18
+ "@twin.org/auditable-item-graph-models": "0.10.1-next.3",
19
19
  "@twin.org/context": "next",
20
20
  "@twin.org/core": "next",
21
+ "@twin.org/crypto": "next",
21
22
  "@twin.org/data-core": "next",
22
23
  "@twin.org/data-json-ld": "next",
23
24
  "@twin.org/entity": "next",