@twin.org/auditable-item-stream-service 0.0.3-next.18 → 0.0.3-next.19
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.
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
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
|
-
import { Coerce, ComponentFactory, GeneralError, Guards, Is, NotFoundError, ObjectHelper, RandomHelper, Urn, Validation } from "@twin.org/core";
|
|
5
|
+
import { Coerce, ComponentFactory, GeneralError, Guards, Is, Mutex, NotFoundError, ObjectHelper, RandomHelper, Urn, Validation } from "@twin.org/core";
|
|
6
6
|
import { DataTypeHelper } from "@twin.org/data-core";
|
|
7
7
|
import { JsonLdDataTypes, JsonLdHelper, JsonLdProcessor } from "@twin.org/data-json-ld";
|
|
8
8
|
import { ComparisonOperator, LogicalOperator, SortDirection } from "@twin.org/entity";
|
|
@@ -195,8 +195,9 @@ export class AuditableItemStreamService {
|
|
|
195
195
|
id
|
|
196
196
|
});
|
|
197
197
|
}
|
|
198
|
+
const streamId = urnParsed.namespaceSpecific(0);
|
|
199
|
+
await Mutex.lock(streamId, { throwOnTimeout: true });
|
|
198
200
|
try {
|
|
199
|
-
const streamId = urnParsed.namespaceSpecific(0);
|
|
200
201
|
const streamEntity = await this._streamStorage.get(streamId);
|
|
201
202
|
if (Is.empty(streamEntity)) {
|
|
202
203
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", id);
|
|
@@ -212,6 +213,9 @@ export class AuditableItemStreamService {
|
|
|
212
213
|
catch (error) {
|
|
213
214
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "closeFailed", undefined, error);
|
|
214
215
|
}
|
|
216
|
+
finally {
|
|
217
|
+
Mutex.unlock(streamId);
|
|
218
|
+
}
|
|
215
219
|
}
|
|
216
220
|
/**
|
|
217
221
|
* Update a stream.
|
|
@@ -228,11 +232,12 @@ export class AuditableItemStreamService {
|
|
|
228
232
|
id: stream.id
|
|
229
233
|
});
|
|
230
234
|
}
|
|
235
|
+
const streamId = urnParsed.namespaceSpecific(0);
|
|
236
|
+
await Mutex.lock(streamId, { throwOnTimeout: true });
|
|
231
237
|
try {
|
|
232
238
|
const schemaValidationFailures = [];
|
|
233
239
|
await DataTypeHelper.validate("stream", `${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}`, stream, schemaValidationFailures);
|
|
234
240
|
Validation.asValidationError(AuditableItemStreamService.CLASS_NAME, "stream", schemaValidationFailures);
|
|
235
|
-
const streamId = urnParsed.namespaceSpecific(0);
|
|
236
241
|
const streamEntity = await this._streamStorage.get(streamId);
|
|
237
242
|
if (Is.empty(streamEntity)) {
|
|
238
243
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", stream.id);
|
|
@@ -253,6 +258,9 @@ export class AuditableItemStreamService {
|
|
|
253
258
|
catch (error) {
|
|
254
259
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "updatingFailed", undefined, error);
|
|
255
260
|
}
|
|
261
|
+
finally {
|
|
262
|
+
Mutex.unlock(streamId);
|
|
263
|
+
}
|
|
256
264
|
}
|
|
257
265
|
/**
|
|
258
266
|
* Get a stream header without the entries.
|
|
@@ -324,8 +332,9 @@ export class AuditableItemStreamService {
|
|
|
324
332
|
id
|
|
325
333
|
});
|
|
326
334
|
}
|
|
335
|
+
const streamId = urnParsed.namespaceSpecific(0);
|
|
336
|
+
await Mutex.lock(streamId, { throwOnTimeout: true });
|
|
327
337
|
try {
|
|
328
|
-
const streamId = urnParsed.namespaceSpecific(0);
|
|
329
338
|
const streamEntity = await this._streamStorage.get(streamId);
|
|
330
339
|
if (Is.empty(streamEntity)) {
|
|
331
340
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", id);
|
|
@@ -338,6 +347,9 @@ export class AuditableItemStreamService {
|
|
|
338
347
|
catch (error) {
|
|
339
348
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "removingFailed", undefined, error);
|
|
340
349
|
}
|
|
350
|
+
finally {
|
|
351
|
+
Mutex.unlock(streamId);
|
|
352
|
+
}
|
|
341
353
|
}
|
|
342
354
|
/**
|
|
343
355
|
* Query all the streams, will not return entries.
|
|
@@ -411,8 +423,9 @@ export class AuditableItemStreamService {
|
|
|
411
423
|
id: streamId
|
|
412
424
|
});
|
|
413
425
|
}
|
|
426
|
+
const streamIdParts = urnParsed.namespaceSpecific(0);
|
|
427
|
+
await Mutex.lock(streamIdParts, { throwOnTimeout: true });
|
|
414
428
|
try {
|
|
415
|
-
const streamIdParts = urnParsed.namespaceSpecific(0);
|
|
416
429
|
const streamEntity = await this._streamStorage.get(streamIdParts);
|
|
417
430
|
if (Is.empty(streamEntity)) {
|
|
418
431
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", streamIdParts);
|
|
@@ -449,6 +462,9 @@ export class AuditableItemStreamService {
|
|
|
449
462
|
catch (error) {
|
|
450
463
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "creatingEntryFailed", undefined, error);
|
|
451
464
|
}
|
|
465
|
+
finally {
|
|
466
|
+
Mutex.unlock(streamIdParts);
|
|
467
|
+
}
|
|
452
468
|
}
|
|
453
469
|
/**
|
|
454
470
|
* Get the entry from the stream.
|
|
@@ -566,8 +582,9 @@ export class AuditableItemStreamService {
|
|
|
566
582
|
id: entryId
|
|
567
583
|
});
|
|
568
584
|
}
|
|
585
|
+
const streamNamespaceId = urnParsed.namespaceSpecific(0);
|
|
586
|
+
await Mutex.lock(streamNamespaceId, { throwOnTimeout: true });
|
|
569
587
|
try {
|
|
570
|
-
const streamNamespaceId = urnParsed.namespaceMethod();
|
|
571
588
|
const streamEntryNamespaceId = urnParsedEntry.namespaceMethod();
|
|
572
589
|
if (streamNamespaceId !== streamEntryNamespaceId) {
|
|
573
590
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "namespaceMismatch", {
|
|
@@ -615,6 +632,9 @@ export class AuditableItemStreamService {
|
|
|
615
632
|
catch (error) {
|
|
616
633
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "updatingEntryFailed", undefined, error);
|
|
617
634
|
}
|
|
635
|
+
finally {
|
|
636
|
+
Mutex.unlock(streamNamespaceId);
|
|
637
|
+
}
|
|
618
638
|
}
|
|
619
639
|
/**
|
|
620
640
|
* Delete from the stream.
|
|
@@ -640,8 +660,9 @@ export class AuditableItemStreamService {
|
|
|
640
660
|
id: entryId
|
|
641
661
|
});
|
|
642
662
|
}
|
|
663
|
+
const streamNamespaceId = urnParsed.namespaceSpecific(0);
|
|
664
|
+
await Mutex.lock(streamNamespaceId, { throwOnTimeout: true });
|
|
643
665
|
try {
|
|
644
|
-
const streamNamespaceId = urnParsed.namespaceMethod();
|
|
645
666
|
const streamEntryNamespaceId = urnParsedEntry.namespaceMethod();
|
|
646
667
|
if (streamNamespaceId !== streamEntryNamespaceId) {
|
|
647
668
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "namespaceMismatch", {
|
|
@@ -685,6 +706,9 @@ export class AuditableItemStreamService {
|
|
|
685
706
|
catch (error) {
|
|
686
707
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "removingEntryFailed", undefined, error);
|
|
687
708
|
}
|
|
709
|
+
finally {
|
|
710
|
+
Mutex.unlock(streamNamespaceId);
|
|
711
|
+
}
|
|
688
712
|
}
|
|
689
713
|
/**
|
|
690
714
|
* Get the entries for the stream.
|
|
@@ -810,8 +834,9 @@ export class AuditableItemStreamService {
|
|
|
810
834
|
id: streamId
|
|
811
835
|
});
|
|
812
836
|
}
|
|
837
|
+
const streamIdParts = urnParsed.namespaceSpecific(0);
|
|
838
|
+
await Mutex.lock(streamIdParts, { throwOnTimeout: true });
|
|
813
839
|
try {
|
|
814
|
-
const streamIdParts = urnParsed.namespaceSpecific(0);
|
|
815
840
|
const streamEntity = await this._streamStorage.get(streamIdParts);
|
|
816
841
|
if (Is.empty(streamEntity)) {
|
|
817
842
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", streamIdParts);
|
|
@@ -821,6 +846,9 @@ export class AuditableItemStreamService {
|
|
|
821
846
|
catch (error) {
|
|
822
847
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "removeProofFailed", undefined, error);
|
|
823
848
|
}
|
|
849
|
+
finally {
|
|
850
|
+
Mutex.unlock(streamIdParts);
|
|
851
|
+
}
|
|
824
852
|
}
|
|
825
853
|
/**
|
|
826
854
|
* Map the stream entity to a JSON-LD model.
|
|
@@ -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\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
|
+
{"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\tMutex,\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\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamId, { throwOnTimeout: true });\n\t\ttry {\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} finally {\n\t\t\tMutex.unlock(streamId);\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\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamId, { throwOnTimeout: true });\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 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} finally {\n\t\t\tMutex.unlock(streamId);\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\tconst streamId = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamId, { throwOnTimeout: true });\n\n\t\ttry {\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} finally {\n\t\t\tMutex.unlock(streamId);\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\tconst streamIdParts = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamIdParts, { throwOnTimeout: true });\n\t\ttry {\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} finally {\n\t\t\tMutex.unlock(streamIdParts);\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\tconst streamNamespaceId = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamNamespaceId, { throwOnTimeout: true });\n\t\ttry {\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} finally {\n\t\t\tMutex.unlock(streamNamespaceId);\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\tconst streamNamespaceId = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamNamespaceId, { throwOnTimeout: true });\n\t\ttry {\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} finally {\n\t\t\tMutex.unlock(streamNamespaceId);\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\tconst streamIdParts = urnParsed.namespaceSpecific(0);\n\t\tawait Mutex.lock(streamIdParts, { throwOnTimeout: true });\n\n\t\ttry {\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} finally {\n\t\t\tMutex.unlock(streamIdParts);\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"]}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.19](https://github.com/iotaledger/twin-auditable-item-stream/compare/auditable-item-stream-service-v0.0.3-next.18...auditable-item-stream-service-v0.0.3-next.19) (2026-06-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* additional mutex locks ([07f271f](https://github.com/iotaledger/twin-auditable-item-stream/commit/07f271f411b2835ea9aa5d31ed6557e7aa659939))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* guard stream mutations with per-stream Mutex ([#75](https://github.com/iotaledger/twin-auditable-item-stream/issues/75)) ([83aaf55](https://github.com/iotaledger/twin-auditable-item-stream/commit/83aaf550264dd2ffcbea8c6b1e5641d943cc7108))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Dependencies
|
|
17
|
+
|
|
18
|
+
* The following workspace dependencies were updated
|
|
19
|
+
* dependencies
|
|
20
|
+
* @twin.org/auditable-item-stream-models bumped from 0.0.3-next.18 to 0.0.3-next.19
|
|
21
|
+
|
|
3
22
|
## [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
23
|
|
|
5
24
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/auditable-item-stream-service",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.19",
|
|
4
4
|
"description": "Service implementation and REST route generation for managing auditable streams and entries.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/iotaledger/auditable-item-stream.git",
|
|
7
|
+
"url": "git+https://github.com/iotaledger/twin-auditable-item-stream.git",
|
|
8
8
|
"directory": "packages/auditable-item-stream-service"
|
|
9
9
|
},
|
|
10
10
|
"author": "martyn.janes@iota.org",
|
|
@@ -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.
|
|
18
|
+
"@twin.org/auditable-item-stream-models": "0.0.3-next.19",
|
|
19
19
|
"@twin.org/context": "next",
|
|
20
20
|
"@twin.org/core": "next",
|
|
21
21
|
"@twin.org/crypto": "next",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"business-logic"
|
|
59
59
|
],
|
|
60
60
|
"bugs": {
|
|
61
|
-
"url": "git+https://github.com/iotaledger/auditable-item-stream/issues"
|
|
61
|
+
"url": "git+https://github.com/iotaledger/twin-auditable-item-stream/issues"
|
|
62
62
|
},
|
|
63
63
|
"homepage": "https://twindev.org"
|
|
64
64
|
}
|