@twin.org/auditable-item-stream-service 0.0.3-next.22 → 0.0.3-next.23
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/auditableItemStreamService.js +13 -7
- package/dist/es/auditableItemStreamService.js.map +1 -1
- package/dist/es/models/IAuditableItemStreamServiceConfig.js.map +1 -1
- package/dist/types/models/IAuditableItemStreamServiceConfig.d.ts +4 -0
- package/docs/changelog.md +14 -0
- package/docs/reference/interfaces/IAuditableItemStreamServiceConfig.md +8 -0
- package/package.json +2 -2
|
@@ -80,6 +80,11 @@ export class AuditableItemStreamService {
|
|
|
80
80
|
* @internal
|
|
81
81
|
*/
|
|
82
82
|
_defaultImmutableInterval;
|
|
83
|
+
/**
|
|
84
|
+
* The timeout in milliseconds when acquiring a mutex lock.
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
_mutexTimeoutMs;
|
|
83
88
|
/**
|
|
84
89
|
* Create a new instance of AuditableItemStreamService.
|
|
85
90
|
* @param options The dependencies for the auditable item stream connector.
|
|
@@ -94,6 +99,7 @@ export class AuditableItemStreamService {
|
|
|
94
99
|
this._telemetryComponent = ComponentFactory.getIfExists(options?.telemetryComponentType);
|
|
95
100
|
this._config = options?.config ?? {};
|
|
96
101
|
this._defaultImmutableInterval = this._config.defaultImmutableInterval ?? 10;
|
|
102
|
+
this._mutexTimeoutMs = Coerce.integer(options?.config?.mutexTimeoutMs);
|
|
97
103
|
SchemaOrgDataTypes.registerRedirects();
|
|
98
104
|
AuditableItemStreamDataTypes.registerTypes();
|
|
99
105
|
JsonLdDataTypes.registerTypes();
|
|
@@ -193,7 +199,7 @@ export class AuditableItemStreamService {
|
|
|
193
199
|
});
|
|
194
200
|
}
|
|
195
201
|
const streamId = urnParsed.namespaceSpecific(0);
|
|
196
|
-
await Mutex.lock(streamId, { throwOnTimeout: true });
|
|
202
|
+
await Mutex.lock(streamId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
197
203
|
try {
|
|
198
204
|
const streamEntity = await this._streamStorage.get(streamId);
|
|
199
205
|
if (Is.empty(streamEntity)) {
|
|
@@ -230,7 +236,7 @@ export class AuditableItemStreamService {
|
|
|
230
236
|
});
|
|
231
237
|
}
|
|
232
238
|
const streamId = urnParsed.namespaceSpecific(0);
|
|
233
|
-
await Mutex.lock(streamId, { throwOnTimeout: true });
|
|
239
|
+
await Mutex.lock(streamId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
234
240
|
try {
|
|
235
241
|
const schemaValidationFailures = [];
|
|
236
242
|
await DataTypeHelper.validate("stream", `${AuditableItemStreamContexts.Namespace}${AuditableItemStreamTypes.Stream}`, stream, schemaValidationFailures);
|
|
@@ -348,7 +354,7 @@ export class AuditableItemStreamService {
|
|
|
348
354
|
});
|
|
349
355
|
}
|
|
350
356
|
const streamId = urnParsed.namespaceSpecific(0);
|
|
351
|
-
await Mutex.lock(streamId, { throwOnTimeout: true });
|
|
357
|
+
await Mutex.lock(streamId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
352
358
|
try {
|
|
353
359
|
const streamEntity = await this._streamStorage.get(streamId);
|
|
354
360
|
if (Is.empty(streamEntity)) {
|
|
@@ -439,7 +445,7 @@ export class AuditableItemStreamService {
|
|
|
439
445
|
});
|
|
440
446
|
}
|
|
441
447
|
const streamIdParts = urnParsed.namespaceSpecific(0);
|
|
442
|
-
await Mutex.lock(streamIdParts, { throwOnTimeout: true });
|
|
448
|
+
await Mutex.lock(streamIdParts, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
443
449
|
try {
|
|
444
450
|
const streamEntity = await this._streamStorage.get(streamIdParts);
|
|
445
451
|
if (Is.empty(streamEntity)) {
|
|
@@ -598,7 +604,7 @@ export class AuditableItemStreamService {
|
|
|
598
604
|
});
|
|
599
605
|
}
|
|
600
606
|
const streamNamespaceId = urnParsed.namespaceSpecific(0);
|
|
601
|
-
await Mutex.lock(streamNamespaceId, { throwOnTimeout: true });
|
|
607
|
+
await Mutex.lock(streamNamespaceId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
602
608
|
try {
|
|
603
609
|
const streamEntryNamespaceId = urnParsedEntry.namespaceMethod();
|
|
604
610
|
if (streamNamespaceId !== streamEntryNamespaceId) {
|
|
@@ -678,7 +684,7 @@ export class AuditableItemStreamService {
|
|
|
678
684
|
});
|
|
679
685
|
}
|
|
680
686
|
const streamNamespaceId = urnParsed.namespaceSpecific(0);
|
|
681
|
-
await Mutex.lock(streamNamespaceId, { throwOnTimeout: true });
|
|
687
|
+
await Mutex.lock(streamNamespaceId, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
682
688
|
try {
|
|
683
689
|
const streamEntryNamespaceId = urnParsedEntry.namespaceMethod();
|
|
684
690
|
if (streamNamespaceId !== streamEntryNamespaceId) {
|
|
@@ -855,7 +861,7 @@ export class AuditableItemStreamService {
|
|
|
855
861
|
});
|
|
856
862
|
}
|
|
857
863
|
const streamIdParts = urnParsed.namespaceSpecific(0);
|
|
858
|
-
await Mutex.lock(streamIdParts, { throwOnTimeout: true });
|
|
864
|
+
await Mutex.lock(streamIdParts, { throwOnTimeout: true, timeoutMs: this._mutexTimeoutMs });
|
|
859
865
|
try {
|
|
860
866
|
const streamEntity = await this._streamStorage.get(streamIdParts);
|
|
861
867
|
if (Is.empty(streamEntity)) {
|
|
@@ -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 { 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 * @returns A promise that resolves when the metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\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 A promise that resolves when the stream has been closed.\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 A promise that resolves when the stream has been updated.\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 A promise that resolves when the stream has been removed.\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 A promise that resolves when the entry has been updated.\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 A promise that resolves when the entry has been removed.\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 A promise that resolves when the proof has been removed.\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 A promise that resolves when the entries have been processed.\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 * The timeout in milliseconds when acquiring a mutex lock.\n\t * @internal\n\t */\n\tprivate readonly _mutexTimeoutMs?: number;\n\n\t/**\n\t * Create a new instance of 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\t\tthis._mutexTimeoutMs = Coerce.integer(options?.config?.mutexTimeoutMs);\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 * @returns A promise that resolves when the metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\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 A promise that resolves when the stream has been closed.\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, timeoutMs: this._mutexTimeoutMs });\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 A promise that resolves when the stream has been updated.\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, timeoutMs: this._mutexTimeoutMs });\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 A promise that resolves when the stream has been removed.\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, timeoutMs: this._mutexTimeoutMs });\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, timeoutMs: this._mutexTimeoutMs });\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 A promise that resolves when the entry has been updated.\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, timeoutMs: this._mutexTimeoutMs });\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 A promise that resolves when the entry has been removed.\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, timeoutMs: this._mutexTimeoutMs });\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 A promise that resolves when the proof has been removed.\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, timeoutMs: this._mutexTimeoutMs });\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 A promise that resolves when the entries have been processed.\n\t * @internal\n\t */\n\tprivate async internalRemoveEntries(\n\t\tstreamEntity: AuditableItemStream,\n\t\tremoveOnlyProof: boolean\n\t): Promise<void> {\n\t\tif (Is.stringValue(streamEntity.proofId)) {\n\t\t\tawait this._immutableProofComponent.removeNotarization(streamEntity.proofId);\n\t\t\tdelete streamEntity.proofId;\n\n\t\t\tawait this._streamStorage.set(streamEntity);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemStreamMetricIds.ProofsRemovedStream\n\t\t\t);\n\t\t}\n\n\t\tconst entryIds: string[] = [];\n\t\tlet entriesResult;\n\t\tdo {\n\t\t\tentriesResult = await this._streamEntryStorage.query(\n\t\t\t\t{\n\t\t\t\t\tproperty: \"streamId\",\n\t\t\t\t\tvalue: streamEntity.id,\n\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tundefined,\n\t\t\t\tentriesResult?.cursor\n\t\t\t);\n\n\t\t\tfor (const streamEntry of entriesResult.entities) {\n\t\t\t\tentryIds.push(streamEntry.id as string);\n\t\t\t\tif (Is.stringValue(streamEntry.proofId)) {\n\t\t\t\t\tawait this._immutableProofComponent.removeNotarization(streamEntry.proofId);\n\t\t\t\t\tdelete streamEntry.proofId;\n\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemStreamMetricIds.ProofsRemovedEntry\n\t\t\t\t\t);\n\n\t\t\t\t\t// If we are only removing the proof, we need to set the entry\n\t\t\t\t\t// otherwise the entry is going to be removed later anyway.\n\t\t\t\t\tif (removeOnlyProof) {\n\t\t\t\t\t\tawait this._streamEntryStorage.set(streamEntry as AuditableItemStreamEntry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} while (Is.stringValue(entriesResult.cursor));\n\n\t\tif (!removeOnlyProof) {\n\t\t\tfor (const entryId of entryIds) {\n\t\t\t\tawait this._streamEntryStorage.remove(entryId);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IAuditableItemStreamServiceConfig.js","sourceRoot":"","sources":["../../../src/models/IAuditableItemStreamServiceConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Configuration for the auditable item stream service.\n */\nexport interface IAuditableItemStreamServiceConfig {\n\t/**\n\t * After how many entries do we add immutable checks, defaults to service configured value.\n\t * A value of 0 will disable integrity checks, 1 will be every item, or any other integer for an interval.\n\t * You can override this value on stream creation.\n\t * @default 10\n\t */\n\tdefaultImmutableInterval?: number;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IAuditableItemStreamServiceConfig.js","sourceRoot":"","sources":["../../../src/models/IAuditableItemStreamServiceConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Configuration for the auditable item stream service.\n */\nexport interface IAuditableItemStreamServiceConfig {\n\t/**\n\t * After how many entries do we add immutable checks, defaults to service configured value.\n\t * A value of 0 will disable integrity checks, 1 will be every item, or any other integer for an interval.\n\t * You can override this value on stream creation.\n\t * @default 10\n\t */\n\tdefaultImmutableInterval?: number;\n\n\t/**\n\t * The timeout in milliseconds to wait when acquiring a mutex lock, defaults to the Mutex default of 5000ms.\n\t */\n\tmutexTimeoutMs?: number;\n}\n"]}
|
|
@@ -9,4 +9,8 @@ export interface IAuditableItemStreamServiceConfig {
|
|
|
9
9
|
* @default 10
|
|
10
10
|
*/
|
|
11
11
|
defaultImmutableInterval?: number;
|
|
12
|
+
/**
|
|
13
|
+
* The timeout in milliseconds to wait when acquiring a mutex lock, defaults to the Mutex default of 5000ms.
|
|
14
|
+
*/
|
|
15
|
+
mutexTimeoutMs?: number;
|
|
12
16
|
}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.23](https://github.com/iotaledger/twin-auditable-item-stream/compare/auditable-item-stream-service-v0.0.3-next.22...auditable-item-stream-service-v0.0.3-next.23) (2026-06-19)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* configurable timeout for mutex ([b32e744](https://github.com/iotaledger/twin-auditable-item-stream/commit/b32e74476d7c9da3e7b079c675494849dad5bdd3))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/auditable-item-stream-models bumped from 0.0.3-next.22 to 0.0.3-next.23
|
|
16
|
+
|
|
3
17
|
## [0.0.3-next.22](https://github.com/iotaledger/twin-auditable-item-stream/compare/auditable-item-stream-service-v0.0.3-next.21...auditable-item-stream-service-v0.0.3-next.22) (2026-06-18)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -17,3 +17,11 @@ You can override this value on stream creation.
|
|
|
17
17
|
```ts
|
|
18
18
|
10
|
|
19
19
|
```
|
|
20
|
+
|
|
21
|
+
***
|
|
22
|
+
|
|
23
|
+
### mutexTimeoutMs? {#mutextimeoutms}
|
|
24
|
+
|
|
25
|
+
> `optional` **mutexTimeoutMs?**: `number`
|
|
26
|
+
|
|
27
|
+
The timeout in milliseconds to wait when acquiring a mutex lock, defaults to the Mutex default of 5000ms.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/auditable-item-stream-service",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.23",
|
|
4
4
|
"description": "Service implementation and REST route generation for managing auditable streams and entries.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@twin.org/api-models": "next",
|
|
18
|
-
"@twin.org/auditable-item-stream-models": "0.0.3-next.
|
|
18
|
+
"@twin.org/auditable-item-stream-models": "0.0.3-next.23",
|
|
19
19
|
"@twin.org/context": "next",
|
|
20
20
|
"@twin.org/core": "next",
|
|
21
21
|
"@twin.org/crypto": "next",
|