@twin.org/auditable-item-stream-service 0.0.3-next.16 → 0.0.3-next.18

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.
@@ -1,6 +1,6 @@
1
1
  // Copyright 2024 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
- import { AuditableItemStreamContexts, AuditableItemStreamDataTypes, AuditableItemStreamModes, AuditableItemStreamTopics, AuditableItemStreamTypes } from "@twin.org/auditable-item-stream-models";
3
+ import { AuditableItemStreamContexts, AuditableItemStreamDataTypes, AuditableItemStreamMetricIds, AuditableItemStreamMetrics, AuditableItemStreamModes, AuditableItemStreamTopics, AuditableItemStreamTypes } from "@twin.org/auditable-item-stream-models";
4
4
  import { ContextIdKeys, ContextIdStore } from "@twin.org/context";
5
5
  import { Coerce, ComponentFactory, GeneralError, Guards, Is, NotFoundError, ObjectHelper, RandomHelper, Urn, Validation } from "@twin.org/core";
6
6
  import { DataTypeHelper } from "@twin.org/data-core";
@@ -9,6 +9,7 @@ import { ComparisonOperator, LogicalOperator, SortDirection } from "@twin.org/en
9
9
  import { EntityStorageConnectorFactory } from "@twin.org/entity-storage-models";
10
10
  import { ImmutableProofContexts, ImmutableProofDataTypes } from "@twin.org/immutable-proof-models";
11
11
  import { SchemaOrgContexts, SchemaOrgDataTypes, SchemaOrgTypes } from "@twin.org/standards-schema-org";
12
+ import { MetricHelper } from "@twin.org/telemetry-models";
12
13
  /**
13
14
  * Class for performing auditable item stream operations.
14
15
  */
@@ -69,6 +70,11 @@ export class AuditableItemStreamService {
69
70
  * @internal
70
71
  */
71
72
  _eventBusComponent;
73
+ /**
74
+ * The telemetry component.
75
+ * @internal
76
+ */
77
+ _telemetryComponent;
72
78
  /**
73
79
  * The default interval for the integrity checks.
74
80
  * @internal
@@ -85,6 +91,7 @@ export class AuditableItemStreamService {
85
91
  if (Is.stringValue(options?.eventBusComponentType)) {
86
92
  this._eventBusComponent = ComponentFactory.get(options.eventBusComponentType);
87
93
  }
94
+ this._telemetryComponent = ComponentFactory.getIfExists(options?.telemetryComponentType);
88
95
  this._config = options?.config ?? {};
89
96
  this._defaultImmutableInterval = this._config.defaultImmutableInterval ?? 10;
90
97
  SchemaOrgDataTypes.registerRedirects();
@@ -99,6 +106,15 @@ export class AuditableItemStreamService {
99
106
  className() {
100
107
  return AuditableItemStreamService.CLASS_NAME;
101
108
  }
109
+ /**
110
+ * Register all AIS metrics with the telemetry component.
111
+ */
112
+ async start() {
113
+ if (Is.undefined(this._telemetryComponent)) {
114
+ return;
115
+ }
116
+ await MetricHelper.createMetrics(this._telemetryComponent, AuditableItemStreamMetrics);
117
+ }
102
118
  /**
103
119
  * Create a new stream.
104
120
  * @param stream The stream to create.
@@ -142,6 +158,7 @@ export class AuditableItemStreamService {
142
158
  // Create the proof for the stream object
143
159
  if (context.immutableInterval > 0) {
144
160
  streamEntity.proofId = await this._immutableProofComponent.create(streamModel);
161
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ProofsCreatedStream);
145
162
  }
146
163
  if (Is.arrayValue(stream.entries?.[SchemaOrgTypes.ItemListElement])) {
147
164
  for (const entry of stream.entries[SchemaOrgTypes.ItemListElement]) {
@@ -153,6 +170,10 @@ export class AuditableItemStreamService {
153
170
  streamEntity.annotationObject = stream.annotationObject;
154
171
  streamEntity.numberOfItems = context.indexCounter;
155
172
  await this._streamStorage.set(streamEntity);
173
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.StreamsCreated, {
174
+ mode: streamEntity.mode ?? AuditableItemStreamModes.Default,
175
+ immutableInterval: context.immutableInterval
176
+ });
156
177
  await this._eventBusComponent?.publish(AuditableItemStreamTopics.StreamCreated, { id: streamModel.id });
157
178
  return streamModel.id;
158
179
  }
@@ -184,6 +205,7 @@ export class AuditableItemStreamService {
184
205
  streamEntity.closed = true;
185
206
  streamEntity.dateModified = new Date(Date.now()).toISOString();
186
207
  await this._streamStorage.set(streamEntity);
208
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.StreamsClosed);
187
209
  await this._eventBusComponent?.publish(AuditableItemStreamTopics.StreamUpdated, { id });
188
210
  }
189
211
  }
@@ -224,6 +246,7 @@ export class AuditableItemStreamService {
224
246
  streamEntity.annotationObject = stream.annotationObject;
225
247
  streamEntity.dateModified = new Date(Date.now()).toISOString();
226
248
  await this._streamStorage.set(streamEntity);
249
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.StreamsUpdated);
227
250
  await this._eventBusComponent?.publish(AuditableItemStreamTopics.StreamUpdated, { id: stream.id });
228
251
  }
229
252
  }
@@ -309,6 +332,7 @@ export class AuditableItemStreamService {
309
332
  }
310
333
  await this.internalRemoveEntries(streamEntity, false);
311
334
  await this._streamStorage.remove(streamEntity.id);
335
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.StreamsDeleted);
312
336
  await this._eventBusComponent?.publish(AuditableItemStreamTopics.StreamDeleted, { id });
313
337
  }
314
338
  catch (error) {
@@ -394,6 +418,7 @@ export class AuditableItemStreamService {
394
418
  throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", streamIdParts);
395
419
  }
396
420
  if (streamEntity.closed) {
421
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ClosedStreamRejections, { operation: "createEntry" });
397
422
  throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "streamClosed", {
398
423
  id: streamId
399
424
  });
@@ -410,6 +435,10 @@ export class AuditableItemStreamService {
410
435
  streamEntity.dateModified = context.now;
411
436
  streamEntity.numberOfItems = context.indexCounter;
412
437
  await this._streamStorage.set(streamEntity);
438
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.EntriesCreated, {
439
+ hasProof: context.immutableInterval > 0 &&
440
+ (context.indexCounter - 1) % context.immutableInterval === 0
441
+ });
413
442
  const fullId = new Urn(AuditableItemStreamService._NAMESPACE, [
414
443
  streamEntity.id,
415
444
  createdId
@@ -551,11 +580,13 @@ export class AuditableItemStreamService {
551
580
  throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", streamId);
552
581
  }
553
582
  if (streamEntity.closed) {
583
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ClosedStreamRejections, { operation: "updateEntry" });
554
584
  throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "streamClosed", {
555
585
  id: streamId
556
586
  });
557
587
  }
558
588
  if (streamEntity.mode === AuditableItemStreamModes.AppendOnly) {
589
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.AppendOnlyRejections, { operation: "updateEntry" });
559
590
  throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "appendOnlyNoEntryUpdates", {
560
591
  id: streamId
561
592
  });
@@ -578,6 +609,7 @@ export class AuditableItemStreamService {
578
609
  streamEntity.dateModified = context.now;
579
610
  streamEntity.numberOfItems = context.indexCounter;
580
611
  await this._streamStorage.set(streamEntity);
612
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.EntriesUpdated);
581
613
  await this._eventBusComponent?.publish(AuditableItemStreamTopics.StreamEntryUpdated, { id: streamId, entryId });
582
614
  }
583
615
  catch (error) {
@@ -622,6 +654,7 @@ export class AuditableItemStreamService {
622
654
  throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", streamId);
623
655
  }
624
656
  if (streamEntity.mode === AuditableItemStreamModes.AppendOnly) {
657
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.AppendOnlyRejections, { operation: "removeEntry" });
625
658
  throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "appendOnlyNoEntryRemovals", {
626
659
  id: streamId
627
660
  });
@@ -645,6 +678,7 @@ export class AuditableItemStreamService {
645
678
  streamEntity.dateModified = context.now;
646
679
  streamEntity.numberOfItems = context.indexCounter;
647
680
  await this._streamStorage.set(streamEntity);
681
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.EntriesDeleted);
648
682
  await this._eventBusComponent?.publish(AuditableItemStreamTopics.StreamEntryDeleted, { id: streamId, entryId });
649
683
  }
650
684
  }
@@ -762,12 +796,12 @@ export class AuditableItemStreamService {
762
796
  }
763
797
  }
764
798
  /**
765
- * Remove the verifiable storage for the stream and entries.
766
- * @param streamId The id of the stream to remove the storage from.
799
+ * Remove the proof for the stream and entries.
800
+ * @param streamId The id of the stream to remove the proof from.
767
801
  * @returns Nothing.
768
802
  * @throws NotFoundError if the vertex is not found.
769
803
  */
770
- async removeVerifiable(streamId) {
804
+ async removeProof(streamId) {
771
805
  Guards.stringValue(AuditableItemStreamService.CLASS_NAME, "streamId", streamId);
772
806
  const urnParsed = Urn.fromValidString(streamId);
773
807
  if (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {
@@ -785,7 +819,7 @@ export class AuditableItemStreamService {
785
819
  await this.internalRemoveEntries(streamEntity, true);
786
820
  }
787
821
  catch (error) {
788
- throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "removeVerifiableFailed", undefined, error);
822
+ throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "removeProofFailed", undefined, error);
789
823
  }
790
824
  }
791
825
  /**
@@ -876,6 +910,7 @@ export class AuditableItemStreamService {
876
910
  const streamEntryModel = this.streamEntryEntityToJsonLd(ObjectHelper.pick(entity, AuditableItemStreamService._PROOF_KEYS_STREAM_ENTRY));
877
911
  // Create the proof for the stream object
878
912
  entity.proofId = await this._immutableProofComponent.create(JsonLdHelper.toNodeObject(streamEntryModel));
913
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ProofsCreatedEntry, { index: entity.index });
879
914
  }
880
915
  await this._streamEntryStorage.set(entity);
881
916
  return entity.id;
@@ -1009,9 +1044,10 @@ export class AuditableItemStreamService {
1009
1044
  */
1010
1045
  async internalRemoveEntries(streamEntity, removeOnlyProof) {
1011
1046
  if (Is.stringValue(streamEntity.proofId)) {
1012
- await this._immutableProofComponent.removeVerifiable(streamEntity.proofId);
1047
+ await this._immutableProofComponent.removeNotarization(streamEntity.proofId);
1013
1048
  delete streamEntity.proofId;
1014
1049
  await this._streamStorage.set(streamEntity);
1050
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ProofsRemovedStream);
1015
1051
  }
1016
1052
  const entryIds = [];
1017
1053
  let entriesResult;
@@ -1029,8 +1065,9 @@ export class AuditableItemStreamService {
1029
1065
  for (const streamEntry of entriesResult.entities) {
1030
1066
  entryIds.push(streamEntry.id);
1031
1067
  if (Is.stringValue(streamEntry.proofId)) {
1032
- await this._immutableProofComponent.removeVerifiable(streamEntry.proofId);
1068
+ await this._immutableProofComponent.removeNotarization(streamEntry.proofId);
1033
1069
  delete streamEntry.proofId;
1070
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ProofsRemovedEntry);
1034
1071
  // If we are only removing the proof, we need to set the entry
1035
1072
  // otherwise the entry is going to be removed later anyway.
1036
1073
  if (removeOnlyProof) {
@@ -1 +1 @@
1
- {"version":3,"file":"auditableItemStreamService.js","sourceRoot":"","sources":["../../src/auditableItemStreamService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tAuditableItemStreamContexts,\n\tAuditableItemStreamDataTypes,\n\tAuditableItemStreamModes,\n\tAuditableItemStreamTopics,\n\tAuditableItemStreamTypes,\n\ttype IAuditableItemStream,\n\ttype IAuditableItemStreamBase,\n\ttype IAuditableItemStreamComponent,\n\ttype IAuditableItemStreamEntry,\n\ttype IAuditableItemStreamEntryList,\n\ttype IAuditableItemStreamEntryObjectList,\n\ttype IAuditableItemStreamEventBusStreamCreated,\n\ttype IAuditableItemStreamEventBusStreamDeleted,\n\ttype IAuditableItemStreamEventBusStreamEntryCreated,\n\ttype IAuditableItemStreamEventBusStreamEntryDeleted,\n\ttype IAuditableItemStreamEventBusStreamEntryUpdated,\n\ttype IAuditableItemStreamEventBusStreamUpdated,\n\ttype IAuditableItemStreamList\n} from \"@twin.org/auditable-item-stream-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tCoerce,\n\tComponentFactory,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tUrn,\n\tValidation,\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 IComparator,\n\ttype IComparatorGroup\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\tImmutableProofDataTypes,\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 type { AuditableItemStream } from \"./entities/auditableItemStream.js\";\nimport type { AuditableItemStreamEntry } from \"./entities/auditableItemStreamEntry.js\";\nimport type { IAuditableItemStreamServiceConfig } from \"./models/IAuditableItemStreamServiceConfig.js\";\nimport type { IAuditableItemStreamServiceConstructorOptions } from \"./models/IAuditableItemStreamServiceConstructorOptions.js\";\nimport type { IAuditableItemStreamServiceContext } from \"./models/IAuditableItemStreamServiceContext.js\";\n\n/**\n * Class for performing auditable item stream operations.\n */\nexport class AuditableItemStreamService implements IAuditableItemStreamComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<AuditableItemStreamService>();\n\n\t/**\n\t * The namespace for the service.\n\t * @internal\n\t */\n\tprivate static readonly _NAMESPACE: string = \"ais\";\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_STREAM: (keyof AuditableItemStream)[] = [\n\t\t\"id\",\n\t\t\"organizationIdentity\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\"\n\t];\n\n\t/**\n\t * The keys to pick when creating the proof for the stream entry.\n\t * @internal\n\t */\n\tprivate static readonly _PROOF_KEYS_STREAM_ENTRY: (keyof AuditableItemStreamEntry)[] = [\n\t\t\"id\",\n\t\t\"streamId\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\",\n\t\t\"entryObject\",\n\t\t\"index\"\n\t];\n\n\t/**\n\t * The configuration for the connector.\n\t * @internal\n\t */\n\tprivate readonly _config: IAuditableItemStreamServiceConfig;\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 streams.\n\t * @internal\n\t */\n\tprivate readonly _streamStorage: IEntityStorageConnector<AuditableItemStream>;\n\n\t/**\n\t * The entity storage for stream entries.\n\t * @internal\n\t */\n\tprivate readonly _streamEntryStorage: IEntityStorageConnector<AuditableItemStreamEntry>;\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 default interval for the integrity checks.\n\t * @internal\n\t */\n\tprivate readonly _defaultImmutableInterval: number;\n\n\t/**\n\t * Create a new instance of AuditableItemStreamService.\n\t * @param options The dependencies for the auditable item stream connector.\n\t */\n\tconstructor(options?: IAuditableItemStreamServiceConstructorOptions) {\n\t\tthis._immutableProofComponent = ComponentFactory.get(\n\t\t\toptions?.immutableProofComponentType ?? \"immutable-proof\"\n\t\t);\n\n\t\tthis._streamStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.streamEntityStorageType ?? nameofKebabCase<AuditableItemStream>()\n\t\t);\n\n\t\tthis._streamEntryStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.streamEntryEntityStorageType ?? nameofKebabCase<AuditableItemStreamEntry>()\n\t\t);\n\n\t\tif (Is.stringValue(options?.eventBusComponentType)) {\n\t\t\tthis._eventBusComponent = ComponentFactory.get(options.eventBusComponentType);\n\t\t}\n\n\t\tthis._config = options?.config ?? {};\n\t\tthis._defaultImmutableInterval = this._config.defaultImmutableInterval ?? 10;\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tAuditableItemStreamDataTypes.registerTypes();\n\t\tJsonLdDataTypes.registerTypes();\n\t\tImmutableProofDataTypes.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 AuditableItemStreamService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create a new stream.\n\t * @param stream The stream to create.\n\t * @returns The id of the new stream item.\n\t */\n\tpublic async create(stream: IAuditableItemStreamBase): Promise<string> {\n\t\tGuards.object(AuditableItemStreamService.CLASS_NAME, nameof(stream), stream);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\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(stream),\n\t\t\t\t`${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}Base`,\n\t\t\t\tstream,\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\tnameof(stream),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tif (stream.closed && !Is.arrayValue(stream.entries?.[SchemaOrgTypes.ItemListElement])) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"closedRequiresEntries\");\n\t\t\t}\n\n\t\t\tif (Is.object(stream.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(stream.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\tnameof(stream.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds,\n\t\t\t\tindexCounter: 0,\n\t\t\t\timmutableInterval: stream?.immutableInterval ?? this._defaultImmutableInterval\n\t\t\t};\n\n\t\t\tconst streamEntity: AuditableItemStream = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: contextIds?.[ContextIdKeys.Organization],\n\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User],\n\t\t\t\tdateCreated: context.now,\n\t\t\t\timmutableInterval: context.immutableInterval,\n\t\t\t\tclosed: stream.closed,\n\t\t\t\tmode: stream.mode,\n\t\t\t\tnumberOfItems: 0\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 stream object.\n\t\t\tconst streamModel = this.streamEntityToJsonLd(\n\t\t\t\tObjectHelper.pick(streamEntity, AuditableItemStreamService._PROOF_KEYS_STREAM)\n\t\t\t);\n\n\t\t\t// Create the proof for the stream object\n\t\t\tif (context.immutableInterval > 0) {\n\t\t\t\tstreamEntity.proofId = await this._immutableProofComponent.create(streamModel);\n\t\t\t}\n\n\t\t\tif (Is.arrayValue(stream.entries?.[SchemaOrgTypes.ItemListElement])) {\n\t\t\t\tfor (const entry of stream.entries[SchemaOrgTypes.ItemListElement]) {\n\t\t\t\t\tawait this.setEntry(context, id, entry);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add these dynamic properties to the stream object after the proof has been created.\n\t\t\tstreamEntity.dateModified = context.now;\n\t\t\tstreamEntity.annotationObject = stream.annotationObject;\n\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamCreated>(\n\t\t\t\tAuditableItemStreamTopics.StreamCreated,\n\t\t\t\t{ id: streamModel.id }\n\t\t\t);\n\n\t\t\treturn streamModel.id;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.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 * Close a stream.\n\t * @param id The id of the stream to close.\n\t * @returns Nothing.\n\t */\n\tpublic async close(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", id);\n\t\t\t}\n\n\t\t\tif (!streamEntity.closed) {\n\t\t\t\tstreamEntity.closed = true;\n\t\t\t\tstreamEntity.dateModified = new Date(Date.now()).toISOString();\n\n\t\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamUpdated>(\n\t\t\t\t\tAuditableItemStreamTopics.StreamUpdated,\n\t\t\t\t\t{ id }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"closeFailed\",\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 stream.\n\t * @param stream The stream to update, does not update entries.\n\t * @returns Nothing.\n\t */\n\tpublic async update(\n\t\tstream: Pick<IAuditableItemStream, \"@context\" | \"type\" | \"id\" | \"annotationObject\">\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemStreamService.CLASS_NAME, nameof(stream), stream);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(stream.id), stream.id);\n\n\t\tconst urnParsed = Urn.fromValidString(stream.id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: stream.id\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(stream),\n\t\t\t\t`${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}`,\n\t\t\t\tstream,\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\tnameof(stream),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", stream.id);\n\t\t\t}\n\n\t\t\tif (Is.object(stream.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(stream.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\tnameof(stream.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!ObjectHelper.equal(streamEntity.annotationObject, stream.annotationObject, false)) {\n\t\t\t\tstreamEntity.annotationObject = stream.annotationObject;\n\t\t\t\tstreamEntity.dateModified = new Date(Date.now()).toISOString();\n\n\t\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamUpdated>(\n\t\t\t\t\tAuditableItemStreamTopics.StreamUpdated,\n\t\t\t\t\t{ id: stream.id }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"updatingFailed\",\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 a stream header without the entries.\n\t * @param id The id of the stream to get.\n\t * @param cursor Cursor to use for next chunk of entries.\n\t * @param limit Limit the number of entries to return, only applicable if includeEntries is true.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeEntries Whether to include the entries, defaults to false.\n\t * @param options.includeDeleted Whether to include deleted entries, defaults to false.\n\t * @param options.verifyStream Should the stream be verified, defaults to false.\n\t * @param options.verifyEntries Should the entries be verified, defaults to false.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\toptions?: {\n\t\t\tincludeEntries?: boolean;\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifyStream?: boolean;\n\t\t\tverifyEntries?: boolean;\n\t\t}\n\t): Promise<{\n\t\tstream: IAuditableItemStream;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", id);\n\t\t\t}\n\n\t\t\tconst verifyStream = options?.verifyStream ?? false;\n\t\t\tconst verifyEntries = options?.verifyEntries ?? false;\n\n\t\t\tconst streamModel = this.streamEntityToJsonLd(streamEntity);\n\t\t\tlet returnCursor;\n\n\t\t\tif (options?.includeEntries) {\n\t\t\t\tconst result = await this.findEntries(\n\t\t\t\t\tstreamId,\n\t\t\t\t\toptions?.includeDeleted,\n\t\t\t\t\tverifyEntries,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tlimit,\n\t\t\t\t\tcursor\n\t\t\t\t);\n\t\t\t\tstreamModel.entries = {\n\t\t\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t\t\t[SchemaOrgTypes.ItemListElement]: result.entries\n\t\t\t\t};\n\t\t\t\treturnCursor = result.cursor;\n\t\t\t}\n\n\t\t\tif (verifyStream && Is.stringValue(streamEntity.proofId)) {\n\t\t\t\tstreamModel.verification = await this._immutableProofComponent.verify(streamEntity.proofId);\n\t\t\t}\n\n\t\t\tif (verifyStream || verifyEntries) {\n\t\t\t\tstreamModel[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(streamModel, streamModel[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tstream: result,\n\t\t\t\tcursor: returnCursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Delete the stream.\n\t * @param id The id of the stream to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async remove(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", id);\n\t\t\t}\n\n\t\t\tawait this.internalRemoveEntries(streamEntity, false);\n\n\t\t\tawait this._streamStorage.remove(streamEntity.id);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamDeleted>(\n\t\t\t\tAuditableItemStreamTopics.StreamDeleted,\n\t\t\t\t{ id }\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"removingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Query all the streams, will not return entries.\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 descending.\n\t * @param properties The properties to return, if not provided defaults to id, created and object.\n\t * @param cursor The cursor to request the next chunk of entities.\n\t * @param limit Limit the number of entities to return.\n\t * @returns The entities, which can be partial if a limited keys list was provided.\n\t */\n\tpublic async query(\n\t\tconditions?: IComparator[],\n\t\torderBy?: keyof Pick<IAuditableItemStream, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tproperties?: (keyof IAuditableItemStream)[],\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemStreamList;\n\t\tcursor?: string;\n\t}> {\n\t\ttry {\n\t\t\tlet propertiesToReturn: (keyof IAuditableItemStream)[] = properties ?? [\n\t\t\t\t\"id\",\n\t\t\t\t\"dateCreated\",\n\t\t\t\t\"dateModified\",\n\t\t\t\t\"annotationObject\"\n\t\t\t];\n\t\t\tconst orderProperty: keyof IAuditableItemStream = orderBy ?? \"dateCreated\";\n\t\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\n\t\t\t// We never return entries from this method as this would involve a lot of lookups\n\t\t\t// and we want to keep this method fast.\n\t\t\tif (propertiesToReturn.includes(\"entries\")) {\n\t\t\t\tpropertiesToReturn = propertiesToReturn.filter(p => p !== \"entries\");\n\t\t\t}\n\n\t\t\tconditions ??= [];\n\n\t\t\tconst results = await this._streamStorage.query(\n\t\t\t\tconditions.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tconditions,\n\t\t\t\t\t\t\tlogicalOperator: LogicalOperator.And\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\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],\n\t\t\t\tpropertiesToReturn as (keyof AuditableItemStream)[],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\tconst list: IAuditableItemStreamList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemStreamTypes.StreamList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: (results.entities as AuditableItemStream[]).map(e =>\n\t\t\t\t\tthis.streamEntityToJsonLd(e)\n\t\t\t\t)\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(list, list[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result,\n\t\t\t\tcursor: results.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.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 * Create an entry in the stream.\n\t * @param streamId The id of the stream to update.\n\t * @param entryObject The object for the stream as JSON-LD.\n\t * @returns The id of the created entry, if not provided.\n\t */\n\tpublic async createEntry(streamId: string, entryObject: IJsonLdNodeObject): Promise<string> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamIdParts = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamIdParts);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\tstreamIdParts\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (streamEntity.closed) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"streamClosed\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds,\n\t\t\t\tindexCounter: streamEntity.numberOfItems,\n\t\t\t\timmutableInterval: streamEntity.immutableInterval\n\t\t\t};\n\n\t\t\tconst createdId = await this.setEntry(context, streamEntity.id, {\n\t\t\t\tentryObject\n\t\t\t});\n\n\t\t\tstreamEntity.dateModified = context.now;\n\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\tconst fullId = new Urn(AuditableItemStreamService._NAMESPACE, [\n\t\t\t\tstreamEntity.id,\n\t\t\t\tcreatedId\n\t\t\t]).toString();\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamEntryCreated>(\n\t\t\t\tAuditableItemStreamTopics.StreamEntryCreated,\n\t\t\t\t{ id: streamId, entryId: 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\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"creatingEntryFailed\",\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 the entry from the stream.\n\t * @param streamId The id of the stream to get.\n\t * @param entryId The id of the stream entry to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifyEntry Should the entry be verified, defaults to false.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntry(\n\t\tstreamId: string,\n\t\tentryId: string,\n\t\toptions?: {\n\t\t\tverifyEntry?: boolean;\n\t\t}\n\t): Promise<IAuditableItemStreamEntry> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tconst verifyEntry = options?.verifyEntry ?? false;\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst result = await this.findEntry(streamEntity.id, entryNamespaceId, verifyEntry);\n\t\t\tif (Is.empty(result)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst entry = this.streamEntryEntityToJsonLd(result.entity);\n\n\t\t\tif (verifyEntry) {\n\t\t\t\tentry[\"@context\"] = JsonLdProcessor.combineContexts(\n\t\t\t\t\tentry[\"@context\"],\n\t\t\t\t\tImmutableProofContexts.Context\n\t\t\t\t) as IAuditableItemStreamEntry[\"@context\"];\n\t\t\t\tentry.verification = result.verification;\n\t\t\t}\n\n\t\t\tconst result2 = await JsonLdProcessor.compact(entry, entry[\"@context\"]);\n\t\t\treturn result2;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntryFailed\",\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 the entry object from the stream.\n\t * @param streamId The id of the stream to get.\n\t * @param entryId The id of the stream entry to get.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntryObject(streamId: string, entryId: string): Promise<IJsonLdNodeObject> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst result = await this.findEntry(streamEntity.id, entryNamespaceId);\n\t\t\tif (Is.empty(result)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn result.entity.entryObject;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntryObjectFailed\",\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 an entry in the stream.\n\t * @param streamId The id of the stream to update.\n\t * @param entryId The id of the entry to update.\n\t * @param entryObject The object for the entry as JSON-LD.\n\t * @returns Nothing.\n\t */\n\tpublic async updateEntry(\n\t\tstreamId: string,\n\t\tentryId: string,\n\t\tentryObject: IJsonLdNodeObject\n\t): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceMethod();\n\t\t\tconst streamEntryNamespaceId = urnParsedEntry.namespaceMethod();\n\n\t\t\tif (streamNamespaceId !== streamEntryNamespaceId) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: streamNamespaceId,\n\t\t\t\t\tid: streamEntryNamespaceId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tif (streamEntity.closed) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"streamClosed\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (streamEntity.mode === AuditableItemStreamModes.AppendOnly) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"appendOnlyNoEntryUpdates\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst existing = await this.findEntry(streamEntity.id, entryNamespaceId);\n\t\t\tif (Is.empty(existing)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds,\n\t\t\t\tindexCounter: streamEntity.numberOfItems,\n\t\t\t\timmutableInterval: streamEntity.immutableInterval\n\t\t\t};\n\n\t\t\tawait this.setEntry(context, streamEntity.id, {\n\t\t\t\t...existing.entity,\n\t\t\t\tentryObject\n\t\t\t});\n\n\t\t\tstreamEntity.dateModified = context.now;\n\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamEntryUpdated>(\n\t\t\t\tAuditableItemStreamTopics.StreamEntryUpdated,\n\t\t\t\t{ id: streamId, entryId }\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"updatingEntryFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Delete from the stream.\n\t * @param streamId The id of the stream to remove from.\n\t * @param entryId The id of the entry to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async removeEntry(streamId: string, entryId: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceMethod();\n\t\t\tconst streamEntryNamespaceId = urnParsedEntry.namespaceMethod();\n\n\t\t\tif (streamNamespaceId !== streamEntryNamespaceId) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: streamNamespaceId,\n\t\t\t\t\tid: streamEntryNamespaceId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tif (streamEntity.mode === AuditableItemStreamModes.AppendOnly) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"appendOnlyNoEntryRemovals\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst result = await this.findEntry(streamNamespaceId, entryNamespaceId);\n\t\t\tif (Is.empty(result)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (Is.empty(result.entity.dateDeleted)) {\n\t\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\tcontextIds,\n\t\t\t\t\tindexCounter: streamEntity.numberOfItems,\n\t\t\t\t\timmutableInterval: streamEntity.immutableInterval\n\t\t\t\t};\n\n\t\t\t\tawait this.setEntry(context, streamEntity.id, {\n\t\t\t\t\t...result.entity,\n\t\t\t\t\tdateDeleted: context.now\n\t\t\t\t});\n\n\t\t\t\tstreamEntity.dateModified = context.now;\n\t\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\t\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamEntryDeleted>(\n\t\t\t\t\tAuditableItemStreamTopics.StreamEntryDeleted,\n\t\t\t\t\t{ id: streamId, entryId }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"removingEntryFailed\",\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 the entries for the stream.\n\t * @param streamId The id of the stream to get, if undefined returns all matching entries.\n\t * @param options Additional options for the get operation.\n\t * @param options.conditions The conditions to filter the stream.\n\t * @param options.includeDeleted Whether to include deleted entries, defaults to false.\n\t * @param options.verifyEntries Should the entries be verified, defaults to false.\n\t * @param options.limit How many entries to return.\n\t * @param options.cursor Cursor to use for next chunk of data.\n\t * @param options.order Retrieve the entries in ascending/descending time order, defaults to Ascending.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntries(\n\t\tstreamId?: string,\n\t\toptions?: {\n\t\t\tconditions?: IComparator[];\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifyEntries?: boolean;\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t\torder?: SortDirection;\n\t\t}\n\t): Promise<{\n\t\tentries: IAuditableItemStreamEntryList;\n\t\tcursor?: string;\n\t}> {\n\t\tlet streamNamespaceId;\n\t\tif (!Is.empty(streamId)) {\n\t\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstreamNamespaceId = urnParsed.namespaceSpecific(0);\n\t\t}\n\n\t\ttry {\n\t\t\tif (Is.stringValue(streamNamespaceId)) {\n\t\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\t\tstreamId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst verifyEntries = options?.verifyEntries ?? false;\n\n\t\t\tconst result = await this.findEntries(\n\t\t\t\tstreamNamespaceId,\n\t\t\t\toptions?.includeDeleted,\n\t\t\t\tverifyEntries,\n\t\t\t\toptions?.conditions,\n\t\t\t\toptions?.order,\n\t\t\t\tundefined,\n\t\t\t\toptions?.limit,\n\t\t\t\toptions?.cursor\n\t\t\t);\n\n\t\t\tconst list: IAuditableItemStreamEntryList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemStreamTypes.StreamEntryList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: result.entries\n\t\t\t};\n\n\t\t\tif (verifyEntries) {\n\t\t\t\tlist[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tconst result2 = await JsonLdProcessor.compact(list, list[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result2,\n\t\t\t\tcursor: result.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntriesFailed\",\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 the entry objects for the stream.\n\t * @param streamId The id of the stream to get, if undefined returns all matching entries.\n\t * @param options Additional options for the get operation.\n\t * @param options.conditions The conditions to filter the stream.\n\t * @param options.includeDeleted Whether to include deleted entries, defaults to false.\n\t * @param options.limit How many entries to return.\n\t * @param options.cursor Cursor to use for next chunk of data.\n\t * @param options.order Retrieve the entries in ascending/descending time order, defaults to Ascending.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntryObjects(\n\t\tstreamId?: string,\n\t\toptions?: {\n\t\t\tconditions?: IComparator[];\n\t\t\tincludeDeleted?: boolean;\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t\torder?: SortDirection;\n\t\t}\n\t): Promise<{\n\t\tentries: IAuditableItemStreamEntryObjectList;\n\t\tcursor?: string;\n\t}> {\n\t\tlet streamNamespaceId;\n\t\tif (!Is.empty(streamId)) {\n\t\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstreamNamespaceId = urnParsed.namespaceSpecific(0);\n\t\t}\n\n\t\ttry {\n\t\t\tif (Is.stringValue(streamNamespaceId)) {\n\t\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\t\tstreamId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await this.findEntries(\n\t\t\t\tstreamNamespaceId,\n\t\t\t\toptions?.includeDeleted,\n\t\t\t\tfalse,\n\t\t\t\toptions?.conditions,\n\t\t\t\toptions?.order,\n\t\t\t\tundefined,\n\t\t\t\toptions?.limit,\n\t\t\t\toptions?.cursor\n\t\t\t);\n\n\t\t\tconst list: IAuditableItemStreamEntryObjectList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemStreamTypes.StreamEntryObjectList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: result.entries.map(m => m.entryObject)\n\t\t\t};\n\n\t\t\tconst result2 = await JsonLdProcessor.compact(list, list[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result2,\n\t\t\t\tcursor: result.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntryObjectsFailed\",\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 verifiable storage for the stream and entries.\n\t * @param streamId The id of the stream to remove the storage from.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeVerifiable(streamId: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamIdParts = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamIdParts);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\tstreamIdParts\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.internalRemoveEntries(streamEntity, true);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"removeVerifiableFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Map the stream entity to a JSON-LD model.\n\t * @param streamEntity The stream entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate streamEntityToJsonLd(\n\t\tstreamEntity: AuditableItemStream\n\t): IAuditableItemStream & IJsonLdNodeObject {\n\t\tconst model: IAuditableItemStream & IJsonLdNodeObject = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: AuditableItemStreamTypes.Stream,\n\t\t\tid: `${AuditableItemStreamService._NAMESPACE}:${streamEntity.id}`,\n\t\t\tdateCreated: streamEntity.dateCreated,\n\t\t\tdateModified: streamEntity.dateModified,\n\t\t\torganizationIdentity: streamEntity.organizationIdentity,\n\t\t\tuserIdentity: streamEntity.userIdentity,\n\t\t\tannotationObject: streamEntity.annotationObject,\n\t\t\timmutableInterval: streamEntity.immutableInterval,\n\t\t\tproofId: streamEntity.proofId,\n\t\t\tnumberOfItems: streamEntity.numberOfItems,\n\t\t\tclosed: streamEntity.closed,\n\t\t\tmode: streamEntity.mode\n\t\t};\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Map the stream entry entity to a JSON-LD model.\n\t * @param streamEntryEntity The stream entry entity.\n\t * @returns The model\n\t * @internal\n\t */\n\tprivate streamEntryEntityToJsonLd(\n\t\tstreamEntryEntity: AuditableItemStreamEntry\n\t): IAuditableItemStreamEntry {\n\t\tconst streamEntryModel: IAuditableItemStreamEntry = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\tAuditableItemStreamContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemStreamTypes.StreamEntry,\n\t\t\tid: `${AuditableItemStreamService._NAMESPACE}:${streamEntryEntity.streamId}:${streamEntryEntity.id}`,\n\t\t\tdateCreated: streamEntryEntity.dateCreated,\n\t\t\tdateModified: streamEntryEntity.dateModified,\n\t\t\tdateDeleted: streamEntryEntity.dateDeleted,\n\t\t\tentryObject: streamEntryEntity.entryObject,\n\t\t\tuserIdentity: streamEntryEntity.userIdentity,\n\t\t\tindex: streamEntryEntity.index,\n\t\t\tproofId: streamEntryEntity.proofId\n\t\t};\n\t\treturn streamEntryModel;\n\t}\n\n\t/**\n\t * Set a stream entry.\n\t * @param context The context for the operation.\n\t * @param streamId The stream id.\n\t * @param entry The entry.\n\t * @returns The id of the entry.\n\t * @internal\n\t */\n\tprivate async setEntry(\n\t\tcontext: IAuditableItemStreamServiceContext,\n\t\tstreamId: string,\n\t\tentry: Partial<IAuditableItemStreamEntry>\n\t): Promise<string> {\n\t\tGuards.object(AuditableItemStreamService.CLASS_NAME, nameof(entry), entry);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tif (Is.object(entry.entryObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(entry.entryObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\tnameof(entry.entryObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\tconst entity: AuditableItemStreamEntry = {\n\t\t\tid: entry.id ?? RandomHelper.generateUuidV7(\"compact\"),\n\t\t\tstreamId,\n\t\t\tdateCreated: entry.dateCreated ?? context.now,\n\t\t\tdateDeleted: entry.dateDeleted,\n\t\t\tentryObject: entry.entryObject ?? {},\n\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User],\n\t\t\tindex: entry.index ?? context.indexCounter++\n\t\t};\n\n\t\t// If the created date is not the same as the context now, then we are modifying the entry.\n\t\tif (entity.dateCreated !== context.now) {\n\t\t\tentity.dateModified = context.now;\n\t\t}\n\n\t\tif (context.immutableInterval > 0 && entity.index % context.immutableInterval === 0) {\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 stream entry object.\n\t\t\tconst streamEntryModel = this.streamEntryEntityToJsonLd(\n\t\t\t\tObjectHelper.pick(entity, AuditableItemStreamService._PROOF_KEYS_STREAM_ENTRY)\n\t\t\t);\n\n\t\t\t// Create the proof for the stream object\n\t\t\tentity.proofId = await this._immutableProofComponent.create(\n\t\t\t\tJsonLdHelper.toNodeObject(streamEntryModel)\n\t\t\t);\n\t\t}\n\n\t\tawait this._streamEntryStorage.set(entity);\n\n\t\treturn entity.id;\n\t}\n\n\t/**\n\t * Find a stream entry.\n\t * @param streamId The stream id.\n\t * @param entryId The entry id.\n\t * @param verifyEntry Should the entry be verified.\n\t * @internal\n\t */\n\tprivate async findEntry(\n\t\tstreamId: string,\n\t\tentryId: string,\n\t\tverifyEntry?: boolean\n\t): Promise<\n\t\t| {\n\t\t\t\tentity: AuditableItemStreamEntry;\n\t\t\t\tverification?: IImmutableProofVerification;\n\t\t }\n\t\t| undefined\n\t> {\n\t\tconst conditions: IComparatorGroup<AuditableItemStreamEntry> = {\n\t\t\tconditions: [\n\t\t\t\t{\n\t\t\t\t\tproperty: \"streamId\",\n\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\tvalue: streamId\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\tvalue: entryId\n\t\t\t\t}\n\t\t\t],\n\t\t\tlogicalOperator: LogicalOperator.And\n\t\t};\n\n\t\tconst result = await this._streamEntryStorage.query(\n\t\t\tconditions,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\tsortDirection: SortDirection.Descending\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t1\n\t\t);\n\n\t\tif (result.entities.length > 0) {\n\t\t\tconst entity = result.entities[0] as AuditableItemStreamEntry;\n\n\t\t\tlet verification: IImmutableProofVerification | undefined;\n\t\t\tif ((verifyEntry ?? false) && Is.stringValue(entity.proofId)) {\n\t\t\t\tverification = await this._immutableProofComponent.verify(entity.proofId);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tentity,\n\t\t\t\tverification\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Find stream entries.\n\t * @param streamId The stream id.\n\t * @param includeDeleted Should deleted entries be included.\n\t * @param verifyEntries Should the entries be verified.\n\t * @param conditions The conditions to filter the entries.\n\t * @param sortDirection The sort direction.\n\t * @param propertiesToReturn The properties to return.\n\t * @param limit Limit the number of entities when finding.\n\t * @param cursor The cursor.\n\t * @param contextIds The context ids to perform the operation with.\n\t * @internal\n\t */\n\tprivate async findEntries(\n\t\tstreamId?: string,\n\t\tincludeDeleted?: boolean,\n\t\tverifyEntries?: boolean,\n\t\tconditions?: IComparator[],\n\t\tsortDirection?: SortDirection,\n\t\tpropertiesToReturn?: (keyof AuditableItemStreamEntry)[],\n\t\tlimit?: number,\n\t\tcursor?: string\n\t): Promise<{\n\t\tentries: IAuditableItemStreamEntry[];\n\t\tcursor?: string;\n\t}> {\n\t\tconst needToVerify = verifyEntries ?? false;\n\n\t\tconst combinedConditions: IComparator[] = [];\n\n\t\tif (Is.stringValue(streamId)) {\n\t\t\tcombinedConditions.push({\n\t\t\t\tproperty: \"streamId\",\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: streamId\n\t\t\t});\n\t\t}\n\n\t\tif (Is.stringValue(cursor)) {\n\t\t\tconst parts = cursor.split(\"|\");\n\t\t\tif (parts.length > 1) {\n\t\t\t\tincludeDeleted = Coerce.boolean(parts[1]);\n\t\t\t}\n\t\t}\n\n\t\tif (!(includeDeleted ?? false)) {\n\t\t\tcombinedConditions.push({\n\t\t\t\tproperty: \"dateDeleted\",\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: undefined\n\t\t\t});\n\t\t}\n\n\t\t// If we need to verify the entries, we need to make sure we have\n\t\t// specific properties in the data, if the properties to return are not\n\t\t// an array then all will be retrieved anyway.\n\t\tif (needToVerify && Is.array(propertiesToReturn)) {\n\t\t\tpropertiesToReturn ??= [];\n\n\t\t\tfor (const property of AuditableItemStreamService._PROOF_KEYS_STREAM_ENTRY) {\n\t\t\t\tif (!propertiesToReturn.includes(property)) {\n\t\t\t\t\tpropertiesToReturn.push(property);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(conditions)) {\n\t\t\tcombinedConditions.push(...conditions);\n\t\t}\n\n\t\tconst result = await this._streamEntryStorage.query(\n\t\t\t{\n\t\t\t\tconditions: combinedConditions,\n\t\t\t\tlogicalOperator: LogicalOperator.And\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 ?? SortDirection.Descending\n\t\t\t\t}\n\t\t\t],\n\t\t\tpropertiesToReturn,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tlet returnCursor: string | undefined;\n\n\t\tif (Is.stringValue(result.cursor)) {\n\t\t\treturnCursor = result.cursor;\n\t\t}\n\t\tif (includeDeleted) {\n\t\t\treturnCursor = `${returnCursor ?? \"\"}|true`;\n\t\t}\n\n\t\tconst entryModels: IAuditableItemStreamEntry[] = [];\n\n\t\tfor (const entry of result.entities) {\n\t\t\tconst entryModel = this.streamEntryEntityToJsonLd(entry as AuditableItemStreamEntry);\n\n\t\t\tif (needToVerify && Is.stringValue(entry.proofId)) {\n\t\t\t\tentryModel.verification = await this._immutableProofComponent.verify(entry.proofId);\n\t\t\t}\n\t\t\tentryModels.push(entryModel);\n\t\t}\n\n\t\treturn {\n\t\t\tentries: entryModels,\n\t\t\tcursor: returnCursor\n\t\t};\n\t}\n\n\t/**\n\t * Remove the verifiable storage for the stream and entries.\n\t * @param streamEntity The stream entity.\n\t * @param removeOnlyProof Should only the proof be removed.\n\t * @returns Nothing.\n\t * @internal\n\t */\n\tprivate async internalRemoveEntries(\n\t\tstreamEntity: AuditableItemStream,\n\t\tremoveOnlyProof: boolean\n\t): Promise<void> {\n\t\tif (Is.stringValue(streamEntity.proofId)) {\n\t\t\tawait this._immutableProofComponent.removeVerifiable(streamEntity.proofId);\n\t\t\tdelete streamEntity.proofId;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\t\t}\n\n\t\tconst entryIds: string[] = [];\n\t\tlet entriesResult;\n\t\tdo {\n\t\t\tentriesResult = await this._streamEntryStorage.query(\n\t\t\t\t{\n\t\t\t\t\tproperty: \"streamId\",\n\t\t\t\t\tvalue: streamEntity.id,\n\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tundefined,\n\t\t\t\tentriesResult?.cursor\n\t\t\t);\n\n\t\t\tfor (const streamEntry of entriesResult.entities) {\n\t\t\t\tentryIds.push(streamEntry.id as string);\n\t\t\t\tif (Is.stringValue(streamEntry.proofId)) {\n\t\t\t\t\tawait this._immutableProofComponent.removeVerifiable(streamEntry.proofId);\n\t\t\t\t\tdelete streamEntry.proofId;\n\n\t\t\t\t\t// If we are only removing the proof, we need to set the entry\n\t\t\t\t\t// otherwise the entry is going to be removed later anyway.\n\t\t\t\t\tif (removeOnlyProof) {\n\t\t\t\t\t\tawait this._streamEntryStorage.set(streamEntry as AuditableItemStreamEntry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} while (Is.stringValue(entriesResult.cursor));\n\n\t\tif (!removeOnlyProof) {\n\t\t\tfor (const entryId of entryIds) {\n\t\t\t\tawait this._streamEntryStorage.remove(entryId);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"auditableItemStreamService.js","sourceRoot":"","sources":["../../src/auditableItemStreamService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tAuditableItemStreamContexts,\n\tAuditableItemStreamDataTypes,\n\tAuditableItemStreamMetricIds,\n\tAuditableItemStreamMetrics,\n\tAuditableItemStreamModes,\n\tAuditableItemStreamTopics,\n\tAuditableItemStreamTypes,\n\ttype IAuditableItemStream,\n\ttype IAuditableItemStreamBase,\n\ttype IAuditableItemStreamComponent,\n\ttype IAuditableItemStreamEntry,\n\ttype IAuditableItemStreamEntryList,\n\ttype IAuditableItemStreamEntryObjectList,\n\ttype IAuditableItemStreamEventBusStreamCreated,\n\ttype IAuditableItemStreamEventBusStreamDeleted,\n\ttype IAuditableItemStreamEventBusStreamEntryCreated,\n\ttype IAuditableItemStreamEventBusStreamEntryDeleted,\n\ttype IAuditableItemStreamEventBusStreamEntryUpdated,\n\ttype IAuditableItemStreamEventBusStreamUpdated,\n\ttype IAuditableItemStreamList\n} from \"@twin.org/auditable-item-stream-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tCoerce,\n\tComponentFactory,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tUrn,\n\tValidation,\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 IComparator,\n\ttype IComparatorGroup\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\tImmutableProofDataTypes,\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 { AuditableItemStream } from \"./entities/auditableItemStream.js\";\nimport type { AuditableItemStreamEntry } from \"./entities/auditableItemStreamEntry.js\";\nimport type { IAuditableItemStreamServiceConfig } from \"./models/IAuditableItemStreamServiceConfig.js\";\nimport type { IAuditableItemStreamServiceConstructorOptions } from \"./models/IAuditableItemStreamServiceConstructorOptions.js\";\nimport type { IAuditableItemStreamServiceContext } from \"./models/IAuditableItemStreamServiceContext.js\";\n\n/**\n * Class for performing auditable item stream operations.\n */\nexport class AuditableItemStreamService implements IAuditableItemStreamComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<AuditableItemStreamService>();\n\n\t/**\n\t * The namespace for the service.\n\t * @internal\n\t */\n\tprivate static readonly _NAMESPACE: string = \"ais\";\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_STREAM: (keyof AuditableItemStream)[] = [\n\t\t\"id\",\n\t\t\"organizationIdentity\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\"\n\t];\n\n\t/**\n\t * The keys to pick when creating the proof for the stream entry.\n\t * @internal\n\t */\n\tprivate static readonly _PROOF_KEYS_STREAM_ENTRY: (keyof AuditableItemStreamEntry)[] = [\n\t\t\"id\",\n\t\t\"streamId\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\",\n\t\t\"entryObject\",\n\t\t\"index\"\n\t];\n\n\t/**\n\t * The configuration for the connector.\n\t * @internal\n\t */\n\tprivate readonly _config: IAuditableItemStreamServiceConfig;\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 streams.\n\t * @internal\n\t */\n\tprivate readonly _streamStorage: IEntityStorageConnector<AuditableItemStream>;\n\n\t/**\n\t * The entity storage for stream entries.\n\t * @internal\n\t */\n\tprivate readonly _streamEntryStorage: IEntityStorageConnector<AuditableItemStreamEntry>;\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 default interval for the integrity checks.\n\t * @internal\n\t */\n\tprivate readonly _defaultImmutableInterval: number;\n\n\t/**\n\t * Create a new instance of AuditableItemStreamService.\n\t * @param options The dependencies for the auditable item stream connector.\n\t */\n\tconstructor(options?: IAuditableItemStreamServiceConstructorOptions) {\n\t\tthis._immutableProofComponent = ComponentFactory.get(\n\t\t\toptions?.immutableProofComponentType ?? \"immutable-proof\"\n\t\t);\n\n\t\tthis._streamStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.streamEntityStorageType ?? nameofKebabCase<AuditableItemStream>()\n\t\t);\n\n\t\tthis._streamEntryStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.streamEntryEntityStorageType ?? nameofKebabCase<AuditableItemStreamEntry>()\n\t\t);\n\n\t\tif (Is.stringValue(options?.eventBusComponentType)) {\n\t\t\tthis._eventBusComponent = ComponentFactory.get(options.eventBusComponentType);\n\t\t}\n\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\n\t\tthis._config = options?.config ?? {};\n\t\tthis._defaultImmutableInterval = this._config.defaultImmutableInterval ?? 10;\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tAuditableItemStreamDataTypes.registerTypes();\n\t\tJsonLdDataTypes.registerTypes();\n\t\tImmutableProofDataTypes.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 AuditableItemStreamService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register all AIS metrics with the telemetry component.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, AuditableItemStreamMetrics);\n\t}\n\n\t/**\n\t * Create a new stream.\n\t * @param stream The stream to create.\n\t * @returns The id of the new stream item.\n\t */\n\tpublic async create(stream: IAuditableItemStreamBase): Promise<string> {\n\t\tGuards.object(AuditableItemStreamService.CLASS_NAME, nameof(stream), stream);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\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(stream),\n\t\t\t\t`${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}Base`,\n\t\t\t\tstream,\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\tnameof(stream),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tif (stream.closed && !Is.arrayValue(stream.entries?.[SchemaOrgTypes.ItemListElement])) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"closedRequiresEntries\");\n\t\t\t}\n\n\t\t\tif (Is.object(stream.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(stream.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\tnameof(stream.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds,\n\t\t\t\tindexCounter: 0,\n\t\t\t\timmutableInterval: stream?.immutableInterval ?? this._defaultImmutableInterval\n\t\t\t};\n\n\t\t\tconst streamEntity: AuditableItemStream = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: contextIds?.[ContextIdKeys.Organization],\n\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User],\n\t\t\t\tdateCreated: context.now,\n\t\t\t\timmutableInterval: context.immutableInterval,\n\t\t\t\tclosed: stream.closed,\n\t\t\t\tmode: stream.mode,\n\t\t\t\tnumberOfItems: 0\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 stream object.\n\t\t\tconst streamModel = this.streamEntityToJsonLd(\n\t\t\t\tObjectHelper.pick(streamEntity, AuditableItemStreamService._PROOF_KEYS_STREAM)\n\t\t\t);\n\n\t\t\t// Create the proof for the stream object\n\t\t\tif (context.immutableInterval > 0) {\n\t\t\t\tstreamEntity.proofId = await this._immutableProofComponent.create(streamModel);\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.ProofsCreatedStream\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (Is.arrayValue(stream.entries?.[SchemaOrgTypes.ItemListElement])) {\n\t\t\t\tfor (const entry of stream.entries[SchemaOrgTypes.ItemListElement]) {\n\t\t\t\t\tawait this.setEntry(context, id, entry);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add these dynamic properties to the stream object after the proof has been created.\n\t\t\tstreamEntity.dateModified = context.now;\n\t\t\tstreamEntity.annotationObject = stream.annotationObject;\n\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.StreamsCreated,\n\t\t\t\t{\n\t\t\t\t\tmode: streamEntity.mode ?? AuditableItemStreamModes.Default,\n\t\t\t\t\timmutableInterval: context.immutableInterval\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamCreated>(\n\t\t\t\tAuditableItemStreamTopics.StreamCreated,\n\t\t\t\t{ id: streamModel.id }\n\t\t\t);\n\n\t\t\treturn streamModel.id;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.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 * Close a stream.\n\t * @param id The id of the stream to close.\n\t * @returns Nothing.\n\t */\n\tpublic async close(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", id);\n\t\t\t}\n\n\t\t\tif (!streamEntity.closed) {\n\t\t\t\tstreamEntity.closed = true;\n\t\t\t\tstreamEntity.dateModified = new Date(Date.now()).toISOString();\n\n\t\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.StreamsClosed\n\t\t\t\t);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamUpdated>(\n\t\t\t\t\tAuditableItemStreamTopics.StreamUpdated,\n\t\t\t\t\t{ id }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"closeFailed\",\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 stream.\n\t * @param stream The stream to update, does not update entries.\n\t * @returns Nothing.\n\t */\n\tpublic async update(\n\t\tstream: Pick<IAuditableItemStream, \"@context\" | \"type\" | \"id\" | \"annotationObject\">\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemStreamService.CLASS_NAME, nameof(stream), stream);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(stream.id), stream.id);\n\n\t\tconst urnParsed = Urn.fromValidString(stream.id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: stream.id\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(stream),\n\t\t\t\t`${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}`,\n\t\t\t\tstream,\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\tnameof(stream),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", stream.id);\n\t\t\t}\n\n\t\t\tif (Is.object(stream.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(stream.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\tnameof(stream.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!ObjectHelper.equal(streamEntity.annotationObject, stream.annotationObject, false)) {\n\t\t\t\tstreamEntity.annotationObject = stream.annotationObject;\n\t\t\t\tstreamEntity.dateModified = new Date(Date.now()).toISOString();\n\n\t\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.StreamsUpdated\n\t\t\t\t);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamUpdated>(\n\t\t\t\t\tAuditableItemStreamTopics.StreamUpdated,\n\t\t\t\t\t{ id: stream.id }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"updatingFailed\",\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 a stream header without the entries.\n\t * @param id The id of the stream to get.\n\t * @param cursor Cursor to use for next chunk of entries.\n\t * @param limit Limit the number of entries to return, only applicable if includeEntries is true.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeEntries Whether to include the entries, defaults to false.\n\t * @param options.includeDeleted Whether to include deleted entries, defaults to false.\n\t * @param options.verifyStream Should the stream be verified, defaults to false.\n\t * @param options.verifyEntries Should the entries be verified, defaults to false.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\toptions?: {\n\t\t\tincludeEntries?: boolean;\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifyStream?: boolean;\n\t\t\tverifyEntries?: boolean;\n\t\t}\n\t): Promise<{\n\t\tstream: IAuditableItemStream;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", id);\n\t\t\t}\n\n\t\t\tconst verifyStream = options?.verifyStream ?? false;\n\t\t\tconst verifyEntries = options?.verifyEntries ?? false;\n\n\t\t\tconst streamModel = this.streamEntityToJsonLd(streamEntity);\n\t\t\tlet returnCursor;\n\n\t\t\tif (options?.includeEntries) {\n\t\t\t\tconst result = await this.findEntries(\n\t\t\t\t\tstreamId,\n\t\t\t\t\toptions?.includeDeleted,\n\t\t\t\t\tverifyEntries,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tlimit,\n\t\t\t\t\tcursor\n\t\t\t\t);\n\t\t\t\tstreamModel.entries = {\n\t\t\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t\t\t[SchemaOrgTypes.ItemListElement]: result.entries\n\t\t\t\t};\n\t\t\t\treturnCursor = result.cursor;\n\t\t\t}\n\n\t\t\tif (verifyStream && Is.stringValue(streamEntity.proofId)) {\n\t\t\t\tstreamModel.verification = await this._immutableProofComponent.verify(streamEntity.proofId);\n\t\t\t}\n\n\t\t\tif (verifyStream || verifyEntries) {\n\t\t\t\tstreamModel[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(streamModel, streamModel[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tstream: result,\n\t\t\t\tcursor: returnCursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Delete the stream.\n\t * @param id The id of the stream to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async remove(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\t\tconst streamEntity = await this._streamStorage.get(streamId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", id);\n\t\t\t}\n\n\t\t\tawait this.internalRemoveEntries(streamEntity, false);\n\n\t\t\tawait this._streamStorage.remove(streamEntity.id);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.StreamsDeleted\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamDeleted>(\n\t\t\t\tAuditableItemStreamTopics.StreamDeleted,\n\t\t\t\t{ id }\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"removingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Query all the streams, will not return entries.\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 descending.\n\t * @param properties The properties to return, if not provided defaults to id, created and object.\n\t * @param cursor The cursor to request the next chunk of entities.\n\t * @param limit Limit the number of entities to return.\n\t * @returns The entities, which can be partial if a limited keys list was provided.\n\t */\n\tpublic async query(\n\t\tconditions?: IComparator[],\n\t\torderBy?: keyof Pick<IAuditableItemStream, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tproperties?: (keyof IAuditableItemStream)[],\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemStreamList;\n\t\tcursor?: string;\n\t}> {\n\t\ttry {\n\t\t\tlet propertiesToReturn: (keyof IAuditableItemStream)[] = properties ?? [\n\t\t\t\t\"id\",\n\t\t\t\t\"dateCreated\",\n\t\t\t\t\"dateModified\",\n\t\t\t\t\"annotationObject\"\n\t\t\t];\n\t\t\tconst orderProperty: keyof IAuditableItemStream = orderBy ?? \"dateCreated\";\n\t\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\n\t\t\t// We never return entries from this method as this would involve a lot of lookups\n\t\t\t// and we want to keep this method fast.\n\t\t\tif (propertiesToReturn.includes(\"entries\")) {\n\t\t\t\tpropertiesToReturn = propertiesToReturn.filter(p => p !== \"entries\");\n\t\t\t}\n\n\t\t\tconditions ??= [];\n\n\t\t\tconst results = await this._streamStorage.query(\n\t\t\t\tconditions.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tconditions,\n\t\t\t\t\t\t\tlogicalOperator: LogicalOperator.And\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\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],\n\t\t\t\tpropertiesToReturn as (keyof AuditableItemStream)[],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\tconst list: IAuditableItemStreamList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemStreamTypes.StreamList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: (results.entities as AuditableItemStream[]).map(e =>\n\t\t\t\t\tthis.streamEntityToJsonLd(e)\n\t\t\t\t)\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(list, list[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result,\n\t\t\t\tcursor: results.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.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 * Create an entry in the stream.\n\t * @param streamId The id of the stream to update.\n\t * @param entryObject The object for the stream as JSON-LD.\n\t * @returns The id of the created entry, if not provided.\n\t */\n\tpublic async createEntry(streamId: string, entryObject: IJsonLdNodeObject): Promise<string> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamIdParts = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamIdParts);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\tstreamIdParts\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (streamEntity.closed) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.ClosedStreamRejections,\n\t\t\t\t\t{ operation: \"createEntry\" }\n\t\t\t\t);\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"streamClosed\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds,\n\t\t\t\tindexCounter: streamEntity.numberOfItems,\n\t\t\t\timmutableInterval: streamEntity.immutableInterval\n\t\t\t};\n\n\t\t\tconst createdId = await this.setEntry(context, streamEntity.id, {\n\t\t\t\tentryObject\n\t\t\t});\n\n\t\t\tstreamEntity.dateModified = context.now;\n\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.EntriesCreated,\n\t\t\t\t{\n\t\t\t\t\thasProof:\n\t\t\t\t\t\tcontext.immutableInterval > 0 &&\n\t\t\t\t\t\t(context.indexCounter - 1) % context.immutableInterval === 0\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tconst fullId = new Urn(AuditableItemStreamService._NAMESPACE, [\n\t\t\t\tstreamEntity.id,\n\t\t\t\tcreatedId\n\t\t\t]).toString();\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamEntryCreated>(\n\t\t\t\tAuditableItemStreamTopics.StreamEntryCreated,\n\t\t\t\t{ id: streamId, entryId: 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\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"creatingEntryFailed\",\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 the entry from the stream.\n\t * @param streamId The id of the stream to get.\n\t * @param entryId The id of the stream entry to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifyEntry Should the entry be verified, defaults to false.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntry(\n\t\tstreamId: string,\n\t\tentryId: string,\n\t\toptions?: {\n\t\t\tverifyEntry?: boolean;\n\t\t}\n\t): Promise<IAuditableItemStreamEntry> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tconst verifyEntry = options?.verifyEntry ?? false;\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst result = await this.findEntry(streamEntity.id, entryNamespaceId, verifyEntry);\n\t\t\tif (Is.empty(result)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst entry = this.streamEntryEntityToJsonLd(result.entity);\n\n\t\t\tif (verifyEntry) {\n\t\t\t\tentry[\"@context\"] = JsonLdProcessor.combineContexts(\n\t\t\t\t\tentry[\"@context\"],\n\t\t\t\t\tImmutableProofContexts.Context\n\t\t\t\t) as IAuditableItemStreamEntry[\"@context\"];\n\t\t\t\tentry.verification = result.verification;\n\t\t\t}\n\n\t\t\tconst result2 = await JsonLdProcessor.compact(entry, entry[\"@context\"]);\n\t\t\treturn result2;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntryFailed\",\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 the entry object from the stream.\n\t * @param streamId The id of the stream to get.\n\t * @param entryId The id of the stream entry to get.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntryObject(streamId: string, entryId: string): Promise<IJsonLdNodeObject> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst result = await this.findEntry(streamEntity.id, entryNamespaceId);\n\t\t\tif (Is.empty(result)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn result.entity.entryObject;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntryObjectFailed\",\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 an entry in the stream.\n\t * @param streamId The id of the stream to update.\n\t * @param entryId The id of the entry to update.\n\t * @param entryObject The object for the entry as JSON-LD.\n\t * @returns Nothing.\n\t */\n\tpublic async updateEntry(\n\t\tstreamId: string,\n\t\tentryId: string,\n\t\tentryObject: IJsonLdNodeObject\n\t): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceMethod();\n\t\t\tconst streamEntryNamespaceId = urnParsedEntry.namespaceMethod();\n\n\t\t\tif (streamNamespaceId !== streamEntryNamespaceId) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: streamNamespaceId,\n\t\t\t\t\tid: streamEntryNamespaceId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tif (streamEntity.closed) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.ClosedStreamRejections,\n\t\t\t\t\t{ operation: \"updateEntry\" }\n\t\t\t\t);\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"streamClosed\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (streamEntity.mode === AuditableItemStreamModes.AppendOnly) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.AppendOnlyRejections,\n\t\t\t\t\t{ operation: \"updateEntry\" }\n\t\t\t\t);\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"appendOnlyNoEntryUpdates\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst existing = await this.findEntry(streamEntity.id, entryNamespaceId);\n\t\t\tif (Is.empty(existing)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds,\n\t\t\t\tindexCounter: streamEntity.numberOfItems,\n\t\t\t\timmutableInterval: streamEntity.immutableInterval\n\t\t\t};\n\n\t\t\tawait this.setEntry(context, streamEntity.id, {\n\t\t\t\t...existing.entity,\n\t\t\t\tentryObject\n\t\t\t});\n\n\t\t\tstreamEntity.dateModified = context.now;\n\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.EntriesUpdated\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamEntryUpdated>(\n\t\t\t\tAuditableItemStreamTopics.StreamEntryUpdated,\n\t\t\t\t{ id: streamId, entryId }\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"updatingEntryFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Delete from the stream.\n\t * @param streamId The id of the stream to remove from.\n\t * @param entryId The id of the entry to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async removeEntry(streamId: string, entryId: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(entryId), entryId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\tconst urnParsedEntry = Urn.fromValidString(entryId);\n\t\tif (urnParsedEntry.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: entryId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamNamespaceId = urnParsed.namespaceMethod();\n\t\t\tconst streamEntryNamespaceId = urnParsedEntry.namespaceMethod();\n\n\t\t\tif (streamNamespaceId !== streamEntryNamespaceId) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: streamNamespaceId,\n\t\t\t\t\tid: streamEntryNamespaceId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemStreamService.CLASS_NAME, \"streamNotFound\", streamId);\n\t\t\t}\n\n\t\t\tif (streamEntity.mode === AuditableItemStreamModes.AppendOnly) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.AppendOnlyRejections,\n\t\t\t\t\t{ operation: \"removeEntry\" }\n\t\t\t\t);\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"appendOnlyNoEntryRemovals\", {\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst entryNamespaceId = urnParsedEntry.namespaceSpecific(1);\n\t\t\tconst result = await this.findEntry(streamNamespaceId, entryNamespaceId);\n\t\t\tif (Is.empty(result)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamEntryNotFound\",\n\t\t\t\t\tentryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (Is.empty(result.entity.dateDeleted)) {\n\t\t\t\tconst context: IAuditableItemStreamServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\tcontextIds,\n\t\t\t\t\tindexCounter: streamEntity.numberOfItems,\n\t\t\t\t\timmutableInterval: streamEntity.immutableInterval\n\t\t\t\t};\n\n\t\t\t\tawait this.setEntry(context, streamEntity.id, {\n\t\t\t\t\t...result.entity,\n\t\t\t\t\tdateDeleted: context.now\n\t\t\t\t});\n\n\t\t\t\tstreamEntity.dateModified = context.now;\n\t\t\t\tstreamEntity.numberOfItems = context.indexCounter;\n\t\t\t\tawait this._streamStorage.set(streamEntity);\n\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.EntriesDeleted\n\t\t\t\t);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemStreamEventBusStreamEntryDeleted>(\n\t\t\t\t\tAuditableItemStreamTopics.StreamEntryDeleted,\n\t\t\t\t\t{ id: streamId, entryId }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"removingEntryFailed\",\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 the entries for the stream.\n\t * @param streamId The id of the stream to get, if undefined returns all matching entries.\n\t * @param options Additional options for the get operation.\n\t * @param options.conditions The conditions to filter the stream.\n\t * @param options.includeDeleted Whether to include deleted entries, defaults to false.\n\t * @param options.verifyEntries Should the entries be verified, defaults to false.\n\t * @param options.limit How many entries to return.\n\t * @param options.cursor Cursor to use for next chunk of data.\n\t * @param options.order Retrieve the entries in ascending/descending time order, defaults to Ascending.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntries(\n\t\tstreamId?: string,\n\t\toptions?: {\n\t\t\tconditions?: IComparator[];\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifyEntries?: boolean;\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t\torder?: SortDirection;\n\t\t}\n\t): Promise<{\n\t\tentries: IAuditableItemStreamEntryList;\n\t\tcursor?: string;\n\t}> {\n\t\tlet streamNamespaceId;\n\t\tif (!Is.empty(streamId)) {\n\t\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstreamNamespaceId = urnParsed.namespaceSpecific(0);\n\t\t}\n\n\t\ttry {\n\t\t\tif (Is.stringValue(streamNamespaceId)) {\n\t\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\t\tstreamId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst verifyEntries = options?.verifyEntries ?? false;\n\n\t\t\tconst result = await this.findEntries(\n\t\t\t\tstreamNamespaceId,\n\t\t\t\toptions?.includeDeleted,\n\t\t\t\tverifyEntries,\n\t\t\t\toptions?.conditions,\n\t\t\t\toptions?.order,\n\t\t\t\tundefined,\n\t\t\t\toptions?.limit,\n\t\t\t\toptions?.cursor\n\t\t\t);\n\n\t\t\tconst list: IAuditableItemStreamEntryList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemStreamTypes.StreamEntryList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: result.entries\n\t\t\t};\n\n\t\t\tif (verifyEntries) {\n\t\t\t\tlist[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tconst result2 = await JsonLdProcessor.compact(list, list[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result2,\n\t\t\t\tcursor: result.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntriesFailed\",\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 the entry objects for the stream.\n\t * @param streamId The id of the stream to get, if undefined returns all matching entries.\n\t * @param options Additional options for the get operation.\n\t * @param options.conditions The conditions to filter the stream.\n\t * @param options.includeDeleted Whether to include deleted entries, defaults to false.\n\t * @param options.limit How many entries to return.\n\t * @param options.cursor Cursor to use for next chunk of data.\n\t * @param options.order Retrieve the entries in ascending/descending time order, defaults to Ascending.\n\t * @returns The stream and entries if found.\n\t * @throws NotFoundError if the stream is not found.\n\t */\n\tpublic async getEntryObjects(\n\t\tstreamId?: string,\n\t\toptions?: {\n\t\t\tconditions?: IComparator[];\n\t\t\tincludeDeleted?: boolean;\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t\torder?: SortDirection;\n\t\t}\n\t): Promise<{\n\t\tentries: IAuditableItemStreamEntryObjectList;\n\t\tcursor?: string;\n\t}> {\n\t\tlet streamNamespaceId;\n\t\tif (!Is.empty(streamId)) {\n\t\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\t\tid: streamId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstreamNamespaceId = urnParsed.namespaceSpecific(0);\n\t\t}\n\n\t\ttry {\n\t\t\tif (Is.stringValue(streamNamespaceId)) {\n\t\t\t\tconst streamEntity = await this._streamStorage.get(streamNamespaceId);\n\n\t\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\t\tstreamId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await this.findEntries(\n\t\t\t\tstreamNamespaceId,\n\t\t\t\toptions?.includeDeleted,\n\t\t\t\tfalse,\n\t\t\t\toptions?.conditions,\n\t\t\t\toptions?.order,\n\t\t\t\tundefined,\n\t\t\t\toptions?.limit,\n\t\t\t\toptions?.cursor\n\t\t\t);\n\n\t\t\tconst list: IAuditableItemStreamEntryObjectList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemStreamTypes.StreamEntryObjectList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: result.entries.map(m => m.entryObject)\n\t\t\t};\n\n\t\t\tconst result2 = await JsonLdProcessor.compact(list, list[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result2,\n\t\t\t\tcursor: result.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\"gettingEntryObjectsFailed\",\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 the stream and entries.\n\t * @param streamId The id of the stream to remove the proof from.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeProof(streamId: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemStreamService.CLASS_NAME, nameof(streamId), streamId);\n\n\t\tconst urnParsed = Urn.fromValidString(streamId);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemStreamService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemStreamService._NAMESPACE,\n\t\t\t\tid: streamId\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst streamIdParts = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst streamEntity = await this._streamStorage.get(streamIdParts);\n\n\t\t\tif (Is.empty(streamEntity)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\t\t\"streamNotFound\",\n\t\t\t\t\tstreamIdParts\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.internalRemoveEntries(streamEntity, true);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemStreamService.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}\n\t}\n\n\t/**\n\t * Map the stream entity to a JSON-LD model.\n\t * @param streamEntity The stream entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate streamEntityToJsonLd(\n\t\tstreamEntity: AuditableItemStream\n\t): IAuditableItemStream & IJsonLdNodeObject {\n\t\tconst model: IAuditableItemStream & IJsonLdNodeObject = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\tAuditableItemStreamContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: AuditableItemStreamTypes.Stream,\n\t\t\tid: `${AuditableItemStreamService._NAMESPACE}:${streamEntity.id}`,\n\t\t\tdateCreated: streamEntity.dateCreated,\n\t\t\tdateModified: streamEntity.dateModified,\n\t\t\torganizationIdentity: streamEntity.organizationIdentity,\n\t\t\tuserIdentity: streamEntity.userIdentity,\n\t\t\tannotationObject: streamEntity.annotationObject,\n\t\t\timmutableInterval: streamEntity.immutableInterval,\n\t\t\tproofId: streamEntity.proofId,\n\t\t\tnumberOfItems: streamEntity.numberOfItems,\n\t\t\tclosed: streamEntity.closed,\n\t\t\tmode: streamEntity.mode\n\t\t};\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Map the stream entry entity to a JSON-LD model.\n\t * @param streamEntryEntity The stream entry entity.\n\t * @returns The model\n\t * @internal\n\t */\n\tprivate streamEntryEntityToJsonLd(\n\t\tstreamEntryEntity: AuditableItemStreamEntry\n\t): IAuditableItemStreamEntry {\n\t\tconst streamEntryModel: IAuditableItemStreamEntry = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemStreamContexts.Context,\n\t\t\t\tAuditableItemStreamContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemStreamTypes.StreamEntry,\n\t\t\tid: `${AuditableItemStreamService._NAMESPACE}:${streamEntryEntity.streamId}:${streamEntryEntity.id}`,\n\t\t\tdateCreated: streamEntryEntity.dateCreated,\n\t\t\tdateModified: streamEntryEntity.dateModified,\n\t\t\tdateDeleted: streamEntryEntity.dateDeleted,\n\t\t\tentryObject: streamEntryEntity.entryObject,\n\t\t\tuserIdentity: streamEntryEntity.userIdentity,\n\t\t\tindex: streamEntryEntity.index,\n\t\t\tproofId: streamEntryEntity.proofId\n\t\t};\n\t\treturn streamEntryModel;\n\t}\n\n\t/**\n\t * Set a stream entry.\n\t * @param context The context for the operation.\n\t * @param streamId The stream id.\n\t * @param entry The entry.\n\t * @returns The id of the entry.\n\t * @internal\n\t */\n\tprivate async setEntry(\n\t\tcontext: IAuditableItemStreamServiceContext,\n\t\tstreamId: string,\n\t\tentry: Partial<IAuditableItemStreamEntry>\n\t): Promise<string> {\n\t\tGuards.object(AuditableItemStreamService.CLASS_NAME, nameof(entry), entry);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tif (Is.object(entry.entryObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(entry.entryObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemStreamService.CLASS_NAME,\n\t\t\t\tnameof(entry.entryObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\tconst entity: AuditableItemStreamEntry = {\n\t\t\tid: entry.id ?? RandomHelper.generateUuidV7(\"compact\"),\n\t\t\tstreamId,\n\t\t\tdateCreated: entry.dateCreated ?? context.now,\n\t\t\tdateDeleted: entry.dateDeleted,\n\t\t\tentryObject: entry.entryObject ?? {},\n\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User],\n\t\t\tindex: entry.index ?? context.indexCounter++\n\t\t};\n\n\t\t// If the created date is not the same as the context now, then we are modifying the entry.\n\t\tif (entity.dateCreated !== context.now) {\n\t\t\tentity.dateModified = context.now;\n\t\t}\n\n\t\tif (context.immutableInterval > 0 && entity.index % context.immutableInterval === 0) {\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 stream entry object.\n\t\t\tconst streamEntryModel = this.streamEntryEntityToJsonLd(\n\t\t\t\tObjectHelper.pick(entity, AuditableItemStreamService._PROOF_KEYS_STREAM_ENTRY)\n\t\t\t);\n\n\t\t\t// Create the proof for the stream object\n\t\t\tentity.proofId = await this._immutableProofComponent.create(\n\t\t\t\tJsonLdHelper.toNodeObject(streamEntryModel)\n\t\t\t);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.ProofsCreatedEntry,\n\t\t\t\t{ index: entity.index }\n\t\t\t);\n\t\t}\n\n\t\tawait this._streamEntryStorage.set(entity);\n\n\t\treturn entity.id;\n\t}\n\n\t/**\n\t * Find a stream entry.\n\t * @param streamId The stream id.\n\t * @param entryId The entry id.\n\t * @param verifyEntry Should the entry be verified.\n\t * @internal\n\t */\n\tprivate async findEntry(\n\t\tstreamId: string,\n\t\tentryId: string,\n\t\tverifyEntry?: boolean\n\t): Promise<\n\t\t| {\n\t\t\t\tentity: AuditableItemStreamEntry;\n\t\t\t\tverification?: IImmutableProofVerification;\n\t\t }\n\t\t| undefined\n\t> {\n\t\tconst conditions: IComparatorGroup<AuditableItemStreamEntry> = {\n\t\t\tconditions: [\n\t\t\t\t{\n\t\t\t\t\tproperty: \"streamId\",\n\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\tvalue: streamId\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\t\tvalue: entryId\n\t\t\t\t}\n\t\t\t],\n\t\t\tlogicalOperator: LogicalOperator.And\n\t\t};\n\n\t\tconst result = await this._streamEntryStorage.query(\n\t\t\tconditions,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\tsortDirection: SortDirection.Descending\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t1\n\t\t);\n\n\t\tif (result.entities.length > 0) {\n\t\t\tconst entity = result.entities[0] as AuditableItemStreamEntry;\n\n\t\t\tlet verification: IImmutableProofVerification | undefined;\n\t\t\tif ((verifyEntry ?? false) && Is.stringValue(entity.proofId)) {\n\t\t\t\tverification = await this._immutableProofComponent.verify(entity.proofId);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tentity,\n\t\t\t\tverification\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Find stream entries.\n\t * @param streamId The stream id.\n\t * @param includeDeleted Should deleted entries be included.\n\t * @param verifyEntries Should the entries be verified.\n\t * @param conditions The conditions to filter the entries.\n\t * @param sortDirection The sort direction.\n\t * @param propertiesToReturn The properties to return.\n\t * @param limit Limit the number of entities when finding.\n\t * @param cursor The cursor.\n\t * @param contextIds The context ids to perform the operation with.\n\t * @internal\n\t */\n\tprivate async findEntries(\n\t\tstreamId?: string,\n\t\tincludeDeleted?: boolean,\n\t\tverifyEntries?: boolean,\n\t\tconditions?: IComparator[],\n\t\tsortDirection?: SortDirection,\n\t\tpropertiesToReturn?: (keyof AuditableItemStreamEntry)[],\n\t\tlimit?: number,\n\t\tcursor?: string\n\t): Promise<{\n\t\tentries: IAuditableItemStreamEntry[];\n\t\tcursor?: string;\n\t}> {\n\t\tconst needToVerify = verifyEntries ?? false;\n\n\t\tconst combinedConditions: IComparator[] = [];\n\n\t\tif (Is.stringValue(streamId)) {\n\t\t\tcombinedConditions.push({\n\t\t\t\tproperty: \"streamId\",\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: streamId\n\t\t\t});\n\t\t}\n\n\t\tif (Is.stringValue(cursor)) {\n\t\t\tconst parts = cursor.split(\"|\");\n\t\t\tif (parts.length > 1) {\n\t\t\t\tincludeDeleted = Coerce.boolean(parts[1]);\n\t\t\t}\n\t\t}\n\n\t\tif (!(includeDeleted ?? false)) {\n\t\t\tcombinedConditions.push({\n\t\t\t\tproperty: \"dateDeleted\",\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: undefined\n\t\t\t});\n\t\t}\n\n\t\t// If we need to verify the entries, we need to make sure we have\n\t\t// specific properties in the data, if the properties to return are not\n\t\t// an array then all will be retrieved anyway.\n\t\tif (needToVerify && Is.array(propertiesToReturn)) {\n\t\t\tpropertiesToReturn ??= [];\n\n\t\t\tfor (const property of AuditableItemStreamService._PROOF_KEYS_STREAM_ENTRY) {\n\t\t\t\tif (!propertiesToReturn.includes(property)) {\n\t\t\t\t\tpropertiesToReturn.push(property);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(conditions)) {\n\t\t\tcombinedConditions.push(...conditions);\n\t\t}\n\n\t\tconst result = await this._streamEntryStorage.query(\n\t\t\t{\n\t\t\t\tconditions: combinedConditions,\n\t\t\t\tlogicalOperator: LogicalOperator.And\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 ?? SortDirection.Descending\n\t\t\t\t}\n\t\t\t],\n\t\t\tpropertiesToReturn,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tlet returnCursor: string | undefined;\n\n\t\tif (Is.stringValue(result.cursor)) {\n\t\t\treturnCursor = result.cursor;\n\t\t}\n\t\tif (includeDeleted) {\n\t\t\treturnCursor = `${returnCursor ?? \"\"}|true`;\n\t\t}\n\n\t\tconst entryModels: IAuditableItemStreamEntry[] = [];\n\n\t\tfor (const entry of result.entities) {\n\t\t\tconst entryModel = this.streamEntryEntityToJsonLd(entry as AuditableItemStreamEntry);\n\n\t\t\tif (needToVerify && Is.stringValue(entry.proofId)) {\n\t\t\t\tentryModel.verification = await this._immutableProofComponent.verify(entry.proofId);\n\t\t\t}\n\t\t\tentryModels.push(entryModel);\n\t\t}\n\n\t\treturn {\n\t\t\tentries: entryModels,\n\t\t\tcursor: returnCursor\n\t\t};\n\t}\n\n\t/**\n\t * Remove the verifiable storage for the stream and entries.\n\t * @param streamEntity The stream entity.\n\t * @param removeOnlyProof Should only the proof be removed.\n\t * @returns Nothing.\n\t * @internal\n\t */\n\tprivate async internalRemoveEntries(\n\t\tstreamEntity: AuditableItemStream,\n\t\tremoveOnlyProof: boolean\n\t): Promise<void> {\n\t\tif (Is.stringValue(streamEntity.proofId)) {\n\t\t\tawait this._immutableProofComponent.removeNotarization(streamEntity.proofId);\n\t\t\tdelete streamEntity.proofId;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.ProofsRemovedStream\n\t\t\t);\n\t\t}\n\n\t\tconst entryIds: string[] = [];\n\t\tlet entriesResult;\n\t\tdo {\n\t\t\tentriesResult = await this._streamEntryStorage.query(\n\t\t\t\t{\n\t\t\t\t\tproperty: \"streamId\",\n\t\t\t\t\tvalue: streamEntity.id,\n\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tundefined,\n\t\t\t\tentriesResult?.cursor\n\t\t\t);\n\n\t\t\tfor (const streamEntry of entriesResult.entities) {\n\t\t\t\tentryIds.push(streamEntry.id as string);\n\t\t\t\tif (Is.stringValue(streamEntry.proofId)) {\n\t\t\t\t\tawait this._immutableProofComponent.removeNotarization(streamEntry.proofId);\n\t\t\t\t\tdelete streamEntry.proofId;\n\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemStreamMetricIds.ProofsRemovedEntry\n\t\t\t\t\t);\n\n\t\t\t\t\t// If we are only removing the proof, we need to set the entry\n\t\t\t\t\t// otherwise the entry is going to be removed later anyway.\n\t\t\t\t\tif (removeOnlyProof) {\n\t\t\t\t\t\tawait this._streamEntryStorage.set(streamEntry as AuditableItemStreamEntry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} while (Is.stringValue(entriesResult.cursor));\n\n\t\tif (!removeOnlyProof) {\n\t\t\tfor (const entryId of entryIds) {\n\t\t\t\tawait this._streamEntryStorage.remove(entryId);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IAuditableItemStreamServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IAuditableItemStreamServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IAuditableItemStreamServiceConfig } from \"./IAuditableItemStreamServiceConfig.js\";\n\n/**\n * Options for the auditable item stream service constructor.\n */\nexport interface IAuditableItemStreamServiceConstructorOptions {\n\t/**\n\t * The immutable proof component type.\n\t * @default immutable-proof\n\t */\n\timmutableProofComponentType?: string;\n\n\t/**\n\t * The entity storage for stream.\n\t * @default auditable-item-stream\n\t */\n\tstreamEntityStorageType?: string;\n\n\t/**\n\t * The entity storage for stream entries.\n\t * @default auditable-item-stream-entry\n\t */\n\tstreamEntryEntityStorageType?: string;\n\n\t/**\n\t * The event bus component type, defaults to no event bus.\n\t */\n\teventBusComponentType?: string;\n\n\t/**\n\t * The configuration for the connector.\n\t */\n\tconfig?: IAuditableItemStreamServiceConfig;\n}\n"]}
1
+ {"version":3,"file":"IAuditableItemStreamServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IAuditableItemStreamServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IAuditableItemStreamServiceConfig } from \"./IAuditableItemStreamServiceConfig.js\";\n\n/**\n * Options for the auditable item stream service constructor.\n */\nexport interface IAuditableItemStreamServiceConstructorOptions {\n\t/**\n\t * The immutable proof component type.\n\t * @default immutable-proof\n\t */\n\timmutableProofComponentType?: string;\n\n\t/**\n\t * The entity storage for stream.\n\t * @default auditable-item-stream\n\t */\n\tstreamEntityStorageType?: string;\n\n\t/**\n\t * The entity storage for stream entries.\n\t * @default auditable-item-stream-entry\n\t */\n\tstreamEntryEntityStorageType?: string;\n\n\t/**\n\t * The event bus component type, defaults to no event bus.\n\t */\n\teventBusComponentType?: string;\n\n\t/**\n\t * The component type for the optional telemetry component used for event metrics.\n\t */\n\ttelemetryComponentType?: string;\n\n\t/**\n\t * The configuration for the connector.\n\t */\n\tconfig?: IAuditableItemStreamServiceConfig;\n}\n"]}
@@ -20,6 +20,10 @@ export declare class AuditableItemStreamService implements IAuditableItemStreamC
20
20
  * @returns The class name of the component.
21
21
  */
22
22
  className(): string;
23
+ /**
24
+ * Register all AIS metrics with the telemetry component.
25
+ */
26
+ start(): Promise<void>;
23
27
  /**
24
28
  * Create a new stream.
25
29
  * @param stream The stream to create.
@@ -169,10 +173,10 @@ export declare class AuditableItemStreamService implements IAuditableItemStreamC
169
173
  cursor?: string;
170
174
  }>;
171
175
  /**
172
- * Remove the verifiable storage for the stream and entries.
173
- * @param streamId The id of the stream to remove the storage from.
176
+ * Remove the proof for the stream and entries.
177
+ * @param streamId The id of the stream to remove the proof from.
174
178
  * @returns Nothing.
175
179
  * @throws NotFoundError if the vertex is not found.
176
180
  */
177
- removeVerifiable(streamId: string): Promise<void>;
181
+ removeProof(streamId: string): Promise<void>;
178
182
  }
@@ -22,6 +22,10 @@ export interface IAuditableItemStreamServiceConstructorOptions {
22
22
  * The event bus component type, defaults to no event bus.
23
23
  */
24
24
  eventBusComponentType?: string;
25
+ /**
26
+ * The component type for the optional telemetry component used for event metrics.
27
+ */
28
+ telemetryComponentType?: string;
25
29
  /**
26
30
  * The configuration for the connector.
27
31
  */
package/docs/changelog.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.18](https://github.com/iotaledger/twin-auditable-item-stream/compare/auditable-item-stream-service-v0.0.3-next.17...auditable-item-stream-service-v0.0.3-next.18) (2026-05-29)
4
+
5
+
6
+ ### Features
7
+
8
+ * update immutable proof usage ([#71](https://github.com/iotaledger/twin-auditable-item-stream/issues/71)) ([1fd7c16](https://github.com/iotaledger/twin-auditable-item-stream/commit/1fd7c1666ef77f96e807a9d944e0f31b8f043ae6))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/auditable-item-stream-models bumped from 0.0.3-next.17 to 0.0.3-next.18
16
+
17
+ ## [0.0.3-next.17](https://github.com/iotaledger/twin-auditable-item-stream/compare/auditable-item-stream-service-v0.0.3-next.16...auditable-item-stream-service-v0.0.3-next.17) (2026-05-22)
18
+
19
+
20
+ ### Features
21
+
22
+ * add event-driven telemetry metrics ([#68](https://github.com/iotaledger/twin-auditable-item-stream/issues/68)) ([a24d179](https://github.com/iotaledger/twin-auditable-item-stream/commit/a24d1791977245b76894a494bfc64d1d68867d8f))
23
+
24
+
25
+ ### Dependencies
26
+
27
+ * The following workspace dependencies were updated
28
+ * dependencies
29
+ * @twin.org/auditable-item-stream-models bumped from 0.0.3-next.16 to 0.0.3-next.17
30
+
3
31
  ## [0.0.3-next.16](https://github.com/iotaledger/twin-auditable-item-stream/compare/auditable-item-stream-service-v0.0.3-next.15...auditable-item-stream-service-v0.0.3-next.16) (2026-05-20)
4
32
 
5
33
 
@@ -54,6 +54,22 @@ The class name of the component.
54
54
 
55
55
  ***
56
56
 
57
+ ### start() {#start}
58
+
59
+ > **start**(): `Promise`\<`void`\>
60
+
61
+ Register all AIS metrics with the telemetry component.
62
+
63
+ #### Returns
64
+
65
+ `Promise`\<`void`\>
66
+
67
+ #### Implementation of
68
+
69
+ `IAuditableItemStreamComponent.start`
70
+
71
+ ***
72
+
57
73
  ### create() {#create}
58
74
 
59
75
  > **create**(`stream`): `Promise`\<`string`\>
@@ -602,11 +618,11 @@ NotFoundError if the stream is not found.
602
618
 
603
619
  ***
604
620
 
605
- ### removeVerifiable() {#removeverifiable}
621
+ ### removeProof() {#removeproof}
606
622
 
607
- > **removeVerifiable**(`streamId`): `Promise`\<`void`\>
623
+ > **removeProof**(`streamId`): `Promise`\<`void`\>
608
624
 
609
- Remove the verifiable storage for the stream and entries.
625
+ Remove the proof for the stream and entries.
610
626
 
611
627
  #### Parameters
612
628
 
@@ -614,7 +630,7 @@ Remove the verifiable storage for the stream and entries.
614
630
 
615
631
  `string`
616
632
 
617
- The id of the stream to remove the storage from.
633
+ The id of the stream to remove the proof from.
618
634
 
619
635
  #### Returns
620
636
 
@@ -628,4 +644,4 @@ NotFoundError if the vertex is not found.
628
644
 
629
645
  #### Implementation of
630
646
 
631
- `IAuditableItemStreamComponent.removeVerifiable`
647
+ `IAuditableItemStreamComponent.removeProof`
@@ -54,6 +54,14 @@ The event bus component type, defaults to no event bus.
54
54
 
55
55
  ***
56
56
 
57
+ ### telemetryComponentType? {#telemetrycomponenttype}
58
+
59
+ > `optional` **telemetryComponentType?**: `string`
60
+
61
+ The component type for the optional telemetry component used for event metrics.
62
+
63
+ ***
64
+
57
65
  ### config? {#config}
58
66
 
59
67
  > `optional` **config?**: [`IAuditableItemStreamServiceConfig`](IAuditableItemStreamServiceConfig.md)
package/locales/en.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "removingEntryFailed": "Removing entry from the Auditable Item Stream failed",
16
16
  "gettingEntriesFailed": "Getting entries from the Auditable Item Stream failed",
17
17
  "gettingEntryObjectsFailed": "Getting entry objects from the Auditable Item Stream failed",
18
- "removeVerifiableFailed": "Removing verifiable storage from the Auditable Item Stream failed",
18
+ "removeProofFailed": "Removing proof from the Auditable Item Stream failed",
19
19
  "closedRequiresEntries": "A stream can only be created as closed when entries are provided",
20
20
  "streamClosed": "The stream with the Id \"{id}\" is closed and does not allow entry updates",
21
21
  "appendOnlyNoEntryUpdates": "Entries in append-only mode cannot be updated for stream \"{id}\"",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/auditable-item-stream-service",
3
- "version": "0.0.3-next.16",
3
+ "version": "0.0.3-next.18",
4
4
  "description": "Service implementation and REST route generation for managing auditable streams and entries.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@twin.org/api-models": "next",
18
- "@twin.org/auditable-item-stream-models": "0.0.3-next.16",
18
+ "@twin.org/auditable-item-stream-models": "0.0.3-next.18",
19
19
  "@twin.org/context": "next",
20
20
  "@twin.org/core": "next",
21
21
  "@twin.org/crypto": "next",
@@ -27,6 +27,7 @@
27
27
  "@twin.org/nameof": "next",
28
28
  "@twin.org/standards-schema-org": "next",
29
29
  "@twin.org/standards-w3c-did": "next",
30
+ "@twin.org/telemetry-models": "next",
30
31
  "@twin.org/web": "next"
31
32
  },
32
33
  "main": "./dist/es/index.js",