@twin.org/auditable-item-stream-service 0.0.3-next.20 → 0.0.3-next.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/auditableItemStreamRoutes.js +48 -1
- package/dist/es/auditableItemStreamRoutes.js.map +1 -1
- package/dist/es/auditableItemStreamService.js +17 -17
- package/dist/es/auditableItemStreamService.js.map +1 -1
- package/dist/es/entities/auditableItemStream.js +1 -1
- package/dist/es/entities/auditableItemStream.js.map +1 -1
- package/dist/es/models/IAuditableItemStreamServiceContext.js.map +1 -1
- package/dist/types/auditableItemStreamRoutes.d.ts +9 -1
- package/dist/types/entities/auditableItemStream.d.ts +1 -1
- package/dist/types/models/IAuditableItemStreamServiceContext.d.ts +1 -1
- package/docs/changelog.md +19 -0
- package/docs/open-api/spec.json +110 -0
- package/docs/reference/classes/AuditableItemStream.md +2 -2
- package/docs/reference/functions/auditableItemStreamRemoveProof.md +31 -0
- package/docs/reference/index.md +1 -0
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2024 IOTA Stiftung.
|
|
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
|
-
import { ContextIdKeys, ContextIdStore } from "@twin.org/context";
|
|
4
|
+
import { ContextIdHelper, ContextIdKeys, ContextIdStore } from "@twin.org/context";
|
|
5
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";
|
|
@@ -123,7 +123,9 @@ export class AuditableItemStreamService {
|
|
|
123
123
|
async create(stream) {
|
|
124
124
|
Guards.object(AuditableItemStreamService.CLASS_NAME, "stream", stream);
|
|
125
125
|
const contextIds = await ContextIdStore.getContextIds();
|
|
126
|
+
ContextIdHelper.guard(contextIds, ContextIdKeys.Organization);
|
|
126
127
|
try {
|
|
128
|
+
const ownerOrganizationId = contextIds[ContextIdKeys.UserOrganization] ?? contextIds[ContextIdKeys.Organization];
|
|
127
129
|
const id = RandomHelper.generateUuidV7("compact");
|
|
128
130
|
const schemaValidationFailures = [];
|
|
129
131
|
await DataTypeHelper.validate("stream", `${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}Base`, stream, schemaValidationFailures);
|
|
@@ -141,11 +143,11 @@ export class AuditableItemStreamService {
|
|
|
141
143
|
contextIds,
|
|
142
144
|
indexCounter: 0,
|
|
143
145
|
immutableInterval: stream?.immutableInterval ?? this._defaultImmutableInterval,
|
|
144
|
-
organizationIdentity:
|
|
146
|
+
organizationIdentity: ownerOrganizationId
|
|
145
147
|
};
|
|
146
148
|
const streamEntity = {
|
|
147
149
|
id,
|
|
148
|
-
organizationIdentity:
|
|
150
|
+
organizationIdentity: ownerOrganizationId,
|
|
149
151
|
userIdentity: contextIds?.[ContextIdKeys.User],
|
|
150
152
|
dateCreated: context.now,
|
|
151
153
|
immutableInterval: context.immutableInterval,
|
|
@@ -247,9 +249,10 @@ export class AuditableItemStreamService {
|
|
|
247
249
|
changed = true;
|
|
248
250
|
}
|
|
249
251
|
const contextIds = await ContextIdStore.getContextIds();
|
|
252
|
+
const ownerOrganizationId = contextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];
|
|
250
253
|
if (!Is.stringValue(streamEntity.organizationIdentity) &&
|
|
251
|
-
Is.stringValue(
|
|
252
|
-
streamEntity.organizationIdentity =
|
|
254
|
+
Is.stringValue(ownerOrganizationId)) {
|
|
255
|
+
streamEntity.organizationIdentity = ownerOrganizationId;
|
|
253
256
|
changed = true;
|
|
254
257
|
}
|
|
255
258
|
if (!Is.stringValue(streamEntity.proofId) &&
|
|
@@ -441,13 +444,6 @@ export class AuditableItemStreamService {
|
|
|
441
444
|
if (Is.empty(streamEntity)) {
|
|
442
445
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamNotFound", streamIdParts);
|
|
443
446
|
}
|
|
444
|
-
// If the stream does not have an organization identity yet, set it from the context.
|
|
445
|
-
// This is needed for the proof creation and immutability of the stream and entries.
|
|
446
|
-
if (!Is.stringValue(streamEntity.organizationIdentity) &&
|
|
447
|
-
Is.stringValue(contextIds?.[ContextIdKeys.Organization])) {
|
|
448
|
-
streamEntity.organizationIdentity = contextIds?.[ContextIdKeys.Organization];
|
|
449
|
-
await this._streamStorage.set(streamEntity);
|
|
450
|
-
}
|
|
451
447
|
if (streamEntity.closed) {
|
|
452
448
|
await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemStreamMetricIds.ClosedStreamRejections, { operation: "createEntry" });
|
|
453
449
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "streamClosed", {
|
|
@@ -586,7 +582,6 @@ export class AuditableItemStreamService {
|
|
|
586
582
|
async updateEntry(streamId, entryId, entryObject) {
|
|
587
583
|
Guards.stringValue(AuditableItemStreamService.CLASS_NAME, "streamId", streamId);
|
|
588
584
|
Guards.stringValue(AuditableItemStreamService.CLASS_NAME, "entryId", entryId);
|
|
589
|
-
const contextIds = await ContextIdStore.getContextIds();
|
|
590
585
|
const urnParsed = Urn.fromValidString(streamId);
|
|
591
586
|
if (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {
|
|
592
587
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "namespaceMismatch", {
|
|
@@ -632,12 +627,14 @@ export class AuditableItemStreamService {
|
|
|
632
627
|
if (Is.empty(existing)) {
|
|
633
628
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamEntryNotFound", entryId);
|
|
634
629
|
}
|
|
630
|
+
const contextIds = await ContextIdStore.getContextIds();
|
|
631
|
+
const ownerOrganizationId = contextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];
|
|
635
632
|
const context = {
|
|
636
633
|
now: new Date(Date.now()).toISOString(),
|
|
637
634
|
contextIds,
|
|
638
635
|
indexCounter: streamEntity.numberOfItems,
|
|
639
636
|
immutableInterval: streamEntity.immutableInterval,
|
|
640
|
-
organizationIdentity: streamEntity.organizationIdentity ??
|
|
637
|
+
organizationIdentity: streamEntity.organizationIdentity ?? ownerOrganizationId
|
|
641
638
|
};
|
|
642
639
|
await this.setEntry(context, streamEntity.id, {
|
|
643
640
|
...existing.entity,
|
|
@@ -665,7 +662,6 @@ export class AuditableItemStreamService {
|
|
|
665
662
|
async removeEntry(streamId, entryId) {
|
|
666
663
|
Guards.stringValue(AuditableItemStreamService.CLASS_NAME, "streamId", streamId);
|
|
667
664
|
Guards.stringValue(AuditableItemStreamService.CLASS_NAME, "entryId", entryId);
|
|
668
|
-
const contextIds = await ContextIdStore.getContextIds();
|
|
669
665
|
const urnParsed = Urn.fromValidString(streamId);
|
|
670
666
|
if (urnParsed.namespaceIdentifier() !== AuditableItemStreamService._NAMESPACE) {
|
|
671
667
|
throw new GeneralError(AuditableItemStreamService.CLASS_NAME, "namespaceMismatch", {
|
|
@@ -706,12 +702,14 @@ export class AuditableItemStreamService {
|
|
|
706
702
|
throw new NotFoundError(AuditableItemStreamService.CLASS_NAME, "streamEntryNotFound", entryId);
|
|
707
703
|
}
|
|
708
704
|
if (Is.empty(result.entity.dateDeleted)) {
|
|
705
|
+
const contextIds = await ContextIdStore.getContextIds();
|
|
706
|
+
const ownerOrganizationId = contextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];
|
|
709
707
|
const context = {
|
|
710
708
|
now: new Date(Date.now()).toISOString(),
|
|
711
709
|
contextIds,
|
|
712
710
|
indexCounter: streamEntity.numberOfItems,
|
|
713
711
|
immutableInterval: streamEntity.immutableInterval,
|
|
714
|
-
organizationIdentity: streamEntity.organizationIdentity ??
|
|
712
|
+
organizationIdentity: streamEntity.organizationIdentity ?? ownerOrganizationId
|
|
715
713
|
};
|
|
716
714
|
await this.setEntry(context, streamEntity.id, {
|
|
717
715
|
...result.entity,
|
|
@@ -875,6 +873,7 @@ export class AuditableItemStreamService {
|
|
|
875
873
|
* Create an immutable proof for the stream entity if the conditions are met.
|
|
876
874
|
* @param streamEntity The stream entity to create the proof for.
|
|
877
875
|
* @param immutableInterval The immutable interval for the stream.
|
|
876
|
+
* @returns The proof id.
|
|
878
877
|
* @internal
|
|
879
878
|
*/
|
|
880
879
|
async createStreamProof(streamEntity, immutableInterval) {
|
|
@@ -986,6 +985,7 @@ export class AuditableItemStreamService {
|
|
|
986
985
|
* @param streamId The stream id.
|
|
987
986
|
* @param entryId The entry id.
|
|
988
987
|
* @param verifyEntry Should the entry be verified.
|
|
988
|
+
* @returns The entry entity and optional verification result, or undefined if not found.
|
|
989
989
|
* @internal
|
|
990
990
|
*/
|
|
991
991
|
async findEntry(streamId, entryId, verifyEntry) {
|
|
@@ -1032,7 +1032,7 @@ export class AuditableItemStreamService {
|
|
|
1032
1032
|
* @param propertiesToReturn The properties to return.
|
|
1033
1033
|
* @param limit Limit the number of entities when finding.
|
|
1034
1034
|
* @param cursor The cursor.
|
|
1035
|
-
* @
|
|
1035
|
+
* @returns The stream entries and optional next cursor.
|
|
1036
1036
|
* @internal
|
|
1037
1037
|
*/
|
|
1038
1038
|
async findEntries(streamId, includeDeleted, verifyEntries, conditions, sortDirection, propertiesToReturn, limit, cursor) {
|
|
@@ -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\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\torganizationIdentity: contextIds?.[ContextIdKeys.Organization]\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\tconst streamUrn = await this.createStreamProof(streamEntity, context.immutableInterval);\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: streamUrn }\n\t\t\t);\n\n\t\t\treturn streamUrn;\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\tlet changed = false;\n\n\t\t\tif (!ObjectHelper.equal(streamEntity.annotationObject, stream.annotationObject, false)) {\n\t\t\t\tstreamEntity.annotationObject = stream.annotationObject;\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\tif (\n\t\t\t\t!Is.stringValue(streamEntity.organizationIdentity) &&\n\t\t\t\tIs.stringValue(contextIds?.[ContextIdKeys.Organization])\n\t\t\t) {\n\t\t\t\tstreamEntity.organizationIdentity = contextIds?.[ContextIdKeys.Organization];\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!Is.stringValue(streamEntity.proofId) &&\n\t\t\t\tIs.stringValue(streamEntity.organizationIdentity)\n\t\t\t) {\n\t\t\t\tawait this.createStreamProof(\n\t\t\t\t\tstreamEntity,\n\t\t\t\t\tstreamEntity.immutableInterval ?? this._defaultImmutableInterval\n\t\t\t\t);\n\t\t\t\tif (Is.stringValue(streamEntity.proofId)) {\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (changed) {\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\t// If the stream does not have an organization identity yet, set it from the context.\n\t\t\t// This is needed for the proof creation and immutability of the stream and entries.\n\t\t\tif (\n\t\t\t\t!Is.stringValue(streamEntity.organizationIdentity) &&\n\t\t\t\tIs.stringValue(contextIds?.[ContextIdKeys.Organization])\n\t\t\t) {\n\t\t\t\tstreamEntity.organizationIdentity = contextIds?.[ContextIdKeys.Organization];\n\t\t\t\tawait this._streamStorage.set(streamEntity);\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\torganizationIdentity:\n\t\t\t\t\tstreamEntity.organizationIdentity ?? contextIds?.[ContextIdKeys.Organization]\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\torganizationIdentity:\n\t\t\t\t\tstreamEntity.organizationIdentity ?? contextIds?.[ContextIdKeys.Organization]\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\torganizationIdentity:\n\t\t\t\t\t\tstreamEntity.organizationIdentity ?? contextIds?.[ContextIdKeys.Organization]\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 * Create an immutable proof for the stream entity if the conditions are met.\n\t * @param streamEntity The stream entity to create the proof for.\n\t * @param immutableInterval The immutable interval for the stream.\n\t * @internal\n\t */\n\tprivate async createStreamProof(\n\t\tstreamEntity: AuditableItemStream,\n\t\timmutableInterval: number\n\t): Promise<string> {\n\t\tconst streamModel = this.streamEntityToJsonLd(\n\t\t\tObjectHelper.pick(streamEntity, AuditableItemStreamService._PROOF_KEYS_STREAM)\n\t\t);\n\n\t\tif (immutableInterval > 0 && Is.stringValue(streamModel.organizationIdentity)) {\n\t\t\tstreamEntity.proofId = await this._immutableProofComponent.create(streamModel);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.ProofsCreatedStream\n\t\t\t);\n\t\t}\n\n\t\treturn streamModel.id;\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 but only if we have an organization identity,\n\t\t\t// either from the stream or the context, as this is needed for the proof creation and immutability.\n\t\t\tif (Is.stringValue(context.organizationIdentity)) {\n\t\t\t\tentity.proofId = await this._immutableProofComponent.create(\n\t\t\t\t\tJsonLdHelper.toNodeObject(streamEntryModel)\n\t\t\t\t);\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.ProofsCreatedEntry,\n\t\t\t\t\t{ index: entity.index }\n\t\t\t\t);\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 { ContextIdHelper, 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\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\ttry {\n\t\t\tconst ownerOrganizationId =\n\t\t\t\tcontextIds[ContextIdKeys.UserOrganization] ?? contextIds[ContextIdKeys.Organization];\n\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\torganizationIdentity: ownerOrganizationId\n\t\t\t};\n\n\t\t\tconst streamEntity: AuditableItemStream = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: ownerOrganizationId,\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\tconst streamUrn = await this.createStreamProof(streamEntity, context.immutableInterval);\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: streamUrn }\n\t\t\t);\n\n\t\t\treturn streamUrn;\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\tlet changed = false;\n\n\t\t\tif (!ObjectHelper.equal(streamEntity.annotationObject, stream.annotationObject, false)) {\n\t\t\t\tstreamEntity.annotationObject = stream.annotationObject;\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\tconst ownerOrganizationId =\n\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];\n\t\t\tif (\n\t\t\t\t!Is.stringValue(streamEntity.organizationIdentity) &&\n\t\t\t\tIs.stringValue(ownerOrganizationId)\n\t\t\t) {\n\t\t\t\tstreamEntity.organizationIdentity = ownerOrganizationId;\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!Is.stringValue(streamEntity.proofId) &&\n\t\t\t\tIs.stringValue(streamEntity.organizationIdentity)\n\t\t\t) {\n\t\t\t\tawait this.createStreamProof(\n\t\t\t\t\tstreamEntity,\n\t\t\t\t\tstreamEntity.immutableInterval ?? this._defaultImmutableInterval\n\t\t\t\t);\n\t\t\t\tif (Is.stringValue(streamEntity.proofId)) {\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (changed) {\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\torganizationIdentity:\n\t\t\t\t\tstreamEntity.organizationIdentity ?? contextIds?.[ContextIdKeys.Organization]\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 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 contextIds = await ContextIdStore.getContextIds();\n\t\t\tconst ownerOrganizationId =\n\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];\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\torganizationIdentity: streamEntity.organizationIdentity ?? ownerOrganizationId\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 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 contextIds = await ContextIdStore.getContextIds();\n\t\t\t\tconst ownerOrganizationId =\n\t\t\t\t\tcontextIds?.[ContextIdKeys.UserOrganization] ?? contextIds?.[ContextIdKeys.Organization];\n\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\torganizationIdentity: streamEntity.organizationIdentity ?? ownerOrganizationId\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 * Create an immutable proof for the stream entity if the conditions are met.\n\t * @param streamEntity The stream entity to create the proof for.\n\t * @param immutableInterval The immutable interval for the stream.\n\t * @returns The proof id.\n\t * @internal\n\t */\n\tprivate async createStreamProof(\n\t\tstreamEntity: AuditableItemStream,\n\t\timmutableInterval: number\n\t): Promise<string> {\n\t\tconst streamModel = this.streamEntityToJsonLd(\n\t\t\tObjectHelper.pick(streamEntity, AuditableItemStreamService._PROOF_KEYS_STREAM)\n\t\t);\n\n\t\tif (immutableInterval > 0 && Is.stringValue(streamModel.organizationIdentity)) {\n\t\t\tstreamEntity.proofId = await this._immutableProofComponent.create(streamModel);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.ProofsCreatedStream\n\t\t\t);\n\t\t}\n\n\t\treturn streamModel.id;\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 but only if we have an organization identity,\n\t\t\t// either from the stream or the context, as this is needed for the proof creation and immutability.\n\t\t\tif (Is.stringValue(context.organizationIdentity)) {\n\t\t\t\tentity.proofId = await this._immutableProofComponent.create(\n\t\t\t\t\tJsonLdHelper.toNodeObject(streamEntryModel)\n\t\t\t\t);\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemStreamMetricIds.ProofsCreatedEntry,\n\t\t\t\t\t{ index: entity.index }\n\t\t\t\t);\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 * @returns The entry entity and optional verification result, or undefined if not found.\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 * @returns The stream entries and optional next cursor.\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"]}
|
|
@@ -67,7 +67,7 @@ __decorate([
|
|
|
67
67
|
__metadata("design:type", String)
|
|
68
68
|
], AuditableItemStream.prototype, "dateModified", void 0);
|
|
69
69
|
__decorate([
|
|
70
|
-
property({ type: "string"
|
|
70
|
+
property({ type: "string" }),
|
|
71
71
|
__metadata("design:type", String)
|
|
72
72
|
], AuditableItemStream.prototype, "organizationIdentity", void 0);
|
|
73
73
|
__decorate([
|