@twin.org/synchronised-storage-service 0.0.1-next.6 → 0.0.1-next.7
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/cjs/index.cjs +93 -94
- package/dist/esm/index.mjs +93 -94
- package/dist/types/helpers/blobStorageHelper.d.ts +3 -3
- package/dist/types/helpers/changeSetHelper.d.ts +3 -3
- package/dist/types/helpers/localSyncStateHelper.d.ts +3 -3
- package/dist/types/helpers/remoteSyncStateHelper.d.ts +3 -3
- package/dist/types/models/ISynchronisedStorageServiceConstructorOptions.d.ts +2 -2
- package/docs/changelog.md +14 -0
- package/docs/reference/interfaces/ISynchronisedStorageServiceConstructorOptions.md +3 -3
- package/package.json +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -6,7 +6,6 @@ var web = require('@twin.org/web');
|
|
|
6
6
|
var blobStorageModels = require('@twin.org/blob-storage-models');
|
|
7
7
|
var entityStorageModels = require('@twin.org/entity-storage-models');
|
|
8
8
|
var identityModels = require('@twin.org/identity-models');
|
|
9
|
-
var loggingModels = require('@twin.org/logging-models');
|
|
10
9
|
var standardsW3cDid = require('@twin.org/standards-w3c-did');
|
|
11
10
|
var synchronisedStorageModels = require('@twin.org/synchronised-storage-models');
|
|
12
11
|
var vaultModels = require('@twin.org/vault-models');
|
|
@@ -297,10 +296,10 @@ class BlobStorageHelper {
|
|
|
297
296
|
*/
|
|
298
297
|
CLASS_NAME = "BlobStorageHelper";
|
|
299
298
|
/**
|
|
300
|
-
* The logging
|
|
299
|
+
* The logging component to use for logging.
|
|
301
300
|
* @internal
|
|
302
301
|
*/
|
|
303
|
-
|
|
302
|
+
_loggingComponent;
|
|
304
303
|
/**
|
|
305
304
|
* The vault connector.
|
|
306
305
|
* @internal
|
|
@@ -323,14 +322,14 @@ class BlobStorageHelper {
|
|
|
323
322
|
_isTrustedNode;
|
|
324
323
|
/**
|
|
325
324
|
* Create a new instance of BlobStorageHelper.
|
|
326
|
-
* @param
|
|
325
|
+
* @param loggingComponent The logging connector to use for logging.
|
|
327
326
|
* @param vaultConnector The vault connector to use for for the encryption key.
|
|
328
327
|
* @param blobStorageConnector The blob storage component to use.
|
|
329
328
|
* @param blobStorageEncryptionKeyId The id of the vault key to use for encrypting/decrypting blobs.
|
|
330
329
|
* @param isTrustedNode Is this a trusted node.
|
|
331
330
|
*/
|
|
332
|
-
constructor(
|
|
333
|
-
this.
|
|
331
|
+
constructor(loggingComponent, vaultConnector, blobStorageConnector, blobStorageEncryptionKeyId, isTrustedNode) {
|
|
332
|
+
this._loggingComponent = loggingComponent;
|
|
334
333
|
this._vaultConnector = vaultConnector;
|
|
335
334
|
this._blobStorageConnector = blobStorageConnector;
|
|
336
335
|
this._blobStorageEncryptionKeyId = blobStorageEncryptionKeyId;
|
|
@@ -342,7 +341,7 @@ class BlobStorageHelper {
|
|
|
342
341
|
* @returns The blob.
|
|
343
342
|
*/
|
|
344
343
|
async loadBlob(blobId) {
|
|
345
|
-
await this.
|
|
344
|
+
await this._loggingComponent?.log({
|
|
346
345
|
level: "info",
|
|
347
346
|
source: this.CLASS_NAME,
|
|
348
347
|
message: "loadBlob",
|
|
@@ -365,7 +364,7 @@ class BlobStorageHelper {
|
|
|
365
364
|
compressedBlob = rsa.decrypt(encryptedBlob);
|
|
366
365
|
}
|
|
367
366
|
const decompressedBlob = await core.Compression.decompress(compressedBlob, core.CompressionType.Gzip);
|
|
368
|
-
await this.
|
|
367
|
+
await this._loggingComponent?.log({
|
|
369
368
|
level: "info",
|
|
370
369
|
source: this.CLASS_NAME,
|
|
371
370
|
message: "loadedBlob",
|
|
@@ -377,7 +376,7 @@ class BlobStorageHelper {
|
|
|
377
376
|
}
|
|
378
377
|
}
|
|
379
378
|
catch (error) {
|
|
380
|
-
await this.
|
|
379
|
+
await this._loggingComponent?.log({
|
|
381
380
|
level: "error",
|
|
382
381
|
source: this.CLASS_NAME,
|
|
383
382
|
message: "loadBlobFailed",
|
|
@@ -387,7 +386,7 @@ class BlobStorageHelper {
|
|
|
387
386
|
error: core.BaseError.fromError(error)
|
|
388
387
|
});
|
|
389
388
|
}
|
|
390
|
-
await this.
|
|
389
|
+
await this._loggingComponent?.log({
|
|
391
390
|
level: "info",
|
|
392
391
|
source: this.CLASS_NAME,
|
|
393
392
|
message: "loadBlobEmpty",
|
|
@@ -402,7 +401,7 @@ class BlobStorageHelper {
|
|
|
402
401
|
* @returns The id of the blob.
|
|
403
402
|
*/
|
|
404
403
|
async saveBlob(blob) {
|
|
405
|
-
await this.
|
|
404
|
+
await this._loggingComponent?.log({
|
|
406
405
|
level: "info",
|
|
407
406
|
source: this.CLASS_NAME,
|
|
408
407
|
message: "saveBlob"
|
|
@@ -414,7 +413,7 @@ class BlobStorageHelper {
|
|
|
414
413
|
const encryptedBlob = await this._vaultConnector.encrypt(this._blobStorageEncryptionKeyId, vaultModels.VaultEncryptionType.Rsa2048, compressedBlob);
|
|
415
414
|
try {
|
|
416
415
|
const blobId = await this._blobStorageConnector.set(encryptedBlob);
|
|
417
|
-
await this.
|
|
416
|
+
await this._loggingComponent?.log({
|
|
418
417
|
level: "info",
|
|
419
418
|
source: this.CLASS_NAME,
|
|
420
419
|
message: "savedBlob",
|
|
@@ -425,7 +424,7 @@ class BlobStorageHelper {
|
|
|
425
424
|
return blobId;
|
|
426
425
|
}
|
|
427
426
|
catch (error) {
|
|
428
|
-
await this.
|
|
427
|
+
await this._loggingComponent?.log({
|
|
429
428
|
level: "error",
|
|
430
429
|
source: this.CLASS_NAME,
|
|
431
430
|
message: "saveBlobFailed",
|
|
@@ -440,7 +439,7 @@ class BlobStorageHelper {
|
|
|
440
439
|
* @returns Nothing.
|
|
441
440
|
*/
|
|
442
441
|
async removeBlob(blobId) {
|
|
443
|
-
await this.
|
|
442
|
+
await this._loggingComponent?.log({
|
|
444
443
|
level: "info",
|
|
445
444
|
source: this.CLASS_NAME,
|
|
446
445
|
message: "removeBlob",
|
|
@@ -450,7 +449,7 @@ class BlobStorageHelper {
|
|
|
450
449
|
});
|
|
451
450
|
try {
|
|
452
451
|
await this._blobStorageConnector.remove(blobId);
|
|
453
|
-
await this.
|
|
452
|
+
await this._loggingComponent?.log({
|
|
454
453
|
level: "info",
|
|
455
454
|
source: this.CLASS_NAME,
|
|
456
455
|
message: "removedBlob",
|
|
@@ -460,7 +459,7 @@ class BlobStorageHelper {
|
|
|
460
459
|
});
|
|
461
460
|
}
|
|
462
461
|
catch (error) {
|
|
463
|
-
await this.
|
|
462
|
+
await this._loggingComponent?.log({
|
|
464
463
|
level: "error",
|
|
465
464
|
source: this.CLASS_NAME,
|
|
466
465
|
message: "removeBlobFailed",
|
|
@@ -470,7 +469,7 @@ class BlobStorageHelper {
|
|
|
470
469
|
error: core.BaseError.fromError(error)
|
|
471
470
|
});
|
|
472
471
|
}
|
|
473
|
-
await this.
|
|
472
|
+
await this._loggingComponent?.log({
|
|
474
473
|
level: "info",
|
|
475
474
|
source: this.CLASS_NAME,
|
|
476
475
|
message: "removeBlobEmpty",
|
|
@@ -492,10 +491,10 @@ class ChangeSetHelper {
|
|
|
492
491
|
*/
|
|
493
492
|
CLASS_NAME = "ChangeSetHelper";
|
|
494
493
|
/**
|
|
495
|
-
* The logging
|
|
494
|
+
* The logging component to use for logging.
|
|
496
495
|
* @internal
|
|
497
496
|
*/
|
|
498
|
-
|
|
497
|
+
_loggingComponent;
|
|
499
498
|
/**
|
|
500
499
|
* The event bus component.
|
|
501
500
|
* @internal
|
|
@@ -523,14 +522,14 @@ class ChangeSetHelper {
|
|
|
523
522
|
_nodeIdentity;
|
|
524
523
|
/**
|
|
525
524
|
* Create a new instance of ChangeSetHelper.
|
|
526
|
-
* @param
|
|
525
|
+
* @param loggingComponent The logging connector to use for logging.
|
|
527
526
|
* @param eventBusComponent The event bus component to use for events.
|
|
528
527
|
* @param identityConnector The identity connector to use for signing/verifying changesets.
|
|
529
528
|
* @param blobStorageHelper The blob storage component to use for remote sync states.
|
|
530
529
|
* @param decentralisedStorageMethodId The id of the identity method to use when signing/verifying changesets.
|
|
531
530
|
*/
|
|
532
|
-
constructor(
|
|
533
|
-
this.
|
|
531
|
+
constructor(loggingComponent, eventBusComponent, identityConnector, blobStorageHelper, decentralisedStorageMethodId) {
|
|
532
|
+
this._loggingComponent = loggingComponent;
|
|
534
533
|
this._eventBusComponent = eventBusComponent;
|
|
535
534
|
this._decentralisedStorageMethodId = decentralisedStorageMethodId;
|
|
536
535
|
this._blobStorageHelper = blobStorageHelper;
|
|
@@ -549,7 +548,7 @@ class ChangeSetHelper {
|
|
|
549
548
|
* @returns The changeset if it was verified.
|
|
550
549
|
*/
|
|
551
550
|
async getAndVerifyChangeset(changeSetStorageId) {
|
|
552
|
-
await this.
|
|
551
|
+
await this._loggingComponent?.log({
|
|
553
552
|
level: "info",
|
|
554
553
|
source: this.CLASS_NAME,
|
|
555
554
|
message: "getChangeSet",
|
|
@@ -565,7 +564,7 @@ class ChangeSetHelper {
|
|
|
565
564
|
}
|
|
566
565
|
}
|
|
567
566
|
catch (error) {
|
|
568
|
-
await this.
|
|
567
|
+
await this._loggingComponent?.log({
|
|
569
568
|
level: "warn",
|
|
570
569
|
source: this.CLASS_NAME,
|
|
571
570
|
message: "getChangeSetError",
|
|
@@ -575,7 +574,7 @@ class ChangeSetHelper {
|
|
|
575
574
|
error: core.BaseError.fromError(error)
|
|
576
575
|
});
|
|
577
576
|
}
|
|
578
|
-
await this.
|
|
577
|
+
await this._loggingComponent?.log({
|
|
579
578
|
level: "info",
|
|
580
579
|
source: this.CLASS_NAME,
|
|
581
580
|
message: "getChangeSetEmpty",
|
|
@@ -606,7 +605,7 @@ class ChangeSetHelper {
|
|
|
606
605
|
async applyChangeset(syncChangeset) {
|
|
607
606
|
if (core.Is.arrayValue(syncChangeset.changes)) {
|
|
608
607
|
for (const change of syncChangeset.changes) {
|
|
609
|
-
await this.
|
|
608
|
+
await this._loggingComponent?.log({
|
|
610
609
|
level: "info",
|
|
611
610
|
source: this.CLASS_NAME,
|
|
612
611
|
message: "changeSetApplyingChange",
|
|
@@ -652,7 +651,7 @@ class ChangeSetHelper {
|
|
|
652
651
|
* @returns The id of the change set.
|
|
653
652
|
*/
|
|
654
653
|
async storeChangeSet(syncChangeSet) {
|
|
655
|
-
await this.
|
|
654
|
+
await this._loggingComponent?.log({
|
|
656
655
|
level: "info",
|
|
657
656
|
source: this.CLASS_NAME,
|
|
658
657
|
message: "changeSetStoring",
|
|
@@ -669,7 +668,7 @@ class ChangeSetHelper {
|
|
|
669
668
|
*/
|
|
670
669
|
async verifyChangesetProof(syncChangeset) {
|
|
671
670
|
if (core.Is.empty(syncChangeset.proof)) {
|
|
672
|
-
await this.
|
|
671
|
+
await this._loggingComponent?.log({
|
|
673
672
|
level: "info",
|
|
674
673
|
source: this.CLASS_NAME,
|
|
675
674
|
message: "verifyChangeSetProofMissing",
|
|
@@ -682,7 +681,7 @@ class ChangeSetHelper {
|
|
|
682
681
|
// If the proof or verification method is missing, the proof is invalid
|
|
683
682
|
const verificationMethod = syncChangeset.proof?.verificationMethod;
|
|
684
683
|
if (!core.Is.stringValue(verificationMethod)) {
|
|
685
|
-
await this.
|
|
684
|
+
await this._loggingComponent?.log({
|
|
686
685
|
level: "error",
|
|
687
686
|
source: this.CLASS_NAME,
|
|
688
687
|
message: "verifyChangeSetProofMissing",
|
|
@@ -696,7 +695,7 @@ class ChangeSetHelper {
|
|
|
696
695
|
// otherwise you could sign a changeset for another node
|
|
697
696
|
const changeSetNodeIdentity = identityModels.DocumentHelper.parseId(verificationMethod ?? "");
|
|
698
697
|
if (changeSetNodeIdentity.id !== syncChangeset.nodeIdentity) {
|
|
699
|
-
await this.
|
|
698
|
+
await this._loggingComponent?.log({
|
|
700
699
|
level: "error",
|
|
701
700
|
source: this.CLASS_NAME,
|
|
702
701
|
message: "verifyChangeSetProofNodeIdentityMismatch",
|
|
@@ -709,7 +708,7 @@ class ChangeSetHelper {
|
|
|
709
708
|
delete changeSetWithoutProof.proof;
|
|
710
709
|
const isValid = await this._identityConnector.verifyProof(changeSetWithoutProof, syncChangeset.proof);
|
|
711
710
|
if (!isValid) {
|
|
712
|
-
await this.
|
|
711
|
+
await this._loggingComponent?.log({
|
|
713
712
|
level: "error",
|
|
714
713
|
source: this.CLASS_NAME,
|
|
715
714
|
message: "verifyChangeSetProofInvalid",
|
|
@@ -719,7 +718,7 @@ class ChangeSetHelper {
|
|
|
719
718
|
});
|
|
720
719
|
}
|
|
721
720
|
else {
|
|
722
|
-
await this.
|
|
721
|
+
await this._loggingComponent?.log({
|
|
723
722
|
level: "error",
|
|
724
723
|
source: this.CLASS_NAME,
|
|
725
724
|
message: "verifyChangeSetProofValid",
|
|
@@ -740,7 +739,7 @@ class ChangeSetHelper {
|
|
|
740
739
|
const changeSetWithoutProof = core.ObjectHelper.clone(syncChangeset);
|
|
741
740
|
delete changeSetWithoutProof.proof;
|
|
742
741
|
const proof = await this._identityConnector.createProof(this._nodeIdentity, identityModels.DocumentHelper.joinId(this._nodeIdentity, this._decentralisedStorageMethodId), standardsW3cDid.ProofTypes.DataIntegrityProof, changeSetWithoutProof);
|
|
743
|
-
await this.
|
|
742
|
+
await this._loggingComponent?.log({
|
|
744
743
|
level: "info",
|
|
745
744
|
source: this.CLASS_NAME,
|
|
746
745
|
message: "createdChangeSetProof",
|
|
@@ -760,7 +759,7 @@ class ChangeSetHelper {
|
|
|
760
759
|
if (core.Is.stringValue(this._nodeIdentity)) {
|
|
761
760
|
const verified = await this.verifyChangesetProof(syncChangeSet);
|
|
762
761
|
if (verified) {
|
|
763
|
-
await this.
|
|
762
|
+
await this._loggingComponent?.log({
|
|
764
763
|
level: "info",
|
|
765
764
|
source: this.CLASS_NAME,
|
|
766
765
|
message: "copyChangeSet",
|
|
@@ -789,7 +788,7 @@ class ChangeSetHelper {
|
|
|
789
788
|
async reset(storageKey, resetMode) {
|
|
790
789
|
// If we are applying a consolidation we need to reset the local db
|
|
791
790
|
// but keep any entries from the local node, as they might have been updated
|
|
792
|
-
await this.
|
|
791
|
+
await this._loggingComponent?.log({
|
|
793
792
|
level: "info",
|
|
794
793
|
source: this.CLASS_NAME,
|
|
795
794
|
message: "storageReset",
|
|
@@ -821,10 +820,10 @@ class LocalSyncStateHelper {
|
|
|
821
820
|
*/
|
|
822
821
|
CLASS_NAME = "LocalSyncStateHelper";
|
|
823
822
|
/**
|
|
824
|
-
* The logging
|
|
823
|
+
* The logging component to use for logging.
|
|
825
824
|
* @internal
|
|
826
825
|
*/
|
|
827
|
-
|
|
826
|
+
_loggingComponent;
|
|
828
827
|
/**
|
|
829
828
|
* The storage connector for the sync snapshot entries.
|
|
830
829
|
* @internal
|
|
@@ -837,12 +836,12 @@ class LocalSyncStateHelper {
|
|
|
837
836
|
_changeSetHelper;
|
|
838
837
|
/**
|
|
839
838
|
* Create a new instance of LocalSyncStateHelper.
|
|
840
|
-
* @param
|
|
839
|
+
* @param loggingComponent The logging connector to use for logging.
|
|
841
840
|
* @param snapshotEntryEntityStorage The storage connector for the sync snapshot entries.
|
|
842
841
|
* @param changeSetHelper The change set helper to use for applying changesets.
|
|
843
842
|
*/
|
|
844
|
-
constructor(
|
|
845
|
-
this.
|
|
843
|
+
constructor(loggingComponent, snapshotEntryEntityStorage, changeSetHelper) {
|
|
844
|
+
this._loggingComponent = loggingComponent;
|
|
846
845
|
this._snapshotEntryEntityStorage = snapshotEntryEntityStorage;
|
|
847
846
|
this._changeSetHelper = changeSetHelper;
|
|
848
847
|
}
|
|
@@ -854,7 +853,7 @@ class LocalSyncStateHelper {
|
|
|
854
853
|
* @returns Nothing.
|
|
855
854
|
*/
|
|
856
855
|
async addLocalChange(storageKey, operation, id) {
|
|
857
|
-
await this.
|
|
856
|
+
await this._loggingComponent?.log({
|
|
858
857
|
level: "info",
|
|
859
858
|
source: this.CLASS_NAME,
|
|
860
859
|
message: "addLocalChange",
|
|
@@ -892,7 +891,7 @@ class LocalSyncStateHelper {
|
|
|
892
891
|
* @returns The local snapshot entry.
|
|
893
892
|
*/
|
|
894
893
|
async getSnapshots(storageKey, isLocal) {
|
|
895
|
-
await this.
|
|
894
|
+
await this._loggingComponent?.log({
|
|
896
895
|
level: "info",
|
|
897
896
|
source: this.CLASS_NAME,
|
|
898
897
|
message: "getSnapshots",
|
|
@@ -915,7 +914,7 @@ class LocalSyncStateHelper {
|
|
|
915
914
|
]
|
|
916
915
|
});
|
|
917
916
|
if (queryResult.entities.length > 0) {
|
|
918
|
-
await this.
|
|
917
|
+
await this._loggingComponent?.log({
|
|
919
918
|
level: "info",
|
|
920
919
|
source: this.CLASS_NAME,
|
|
921
920
|
message: "getSnapshotsExists",
|
|
@@ -925,7 +924,7 @@ class LocalSyncStateHelper {
|
|
|
925
924
|
});
|
|
926
925
|
return queryResult.entities;
|
|
927
926
|
}
|
|
928
|
-
await this.
|
|
927
|
+
await this._loggingComponent?.log({
|
|
929
928
|
level: "info",
|
|
930
929
|
source: this.CLASS_NAME,
|
|
931
930
|
message: "getSnapshotsDoesNotExist",
|
|
@@ -954,7 +953,7 @@ class LocalSyncStateHelper {
|
|
|
954
953
|
* @returns Nothing.
|
|
955
954
|
*/
|
|
956
955
|
async setLocalChangeSnapshot(localChangeSnapshot) {
|
|
957
|
-
await this.
|
|
956
|
+
await this._loggingComponent?.log({
|
|
958
957
|
level: "info",
|
|
959
958
|
source: this.CLASS_NAME,
|
|
960
959
|
message: "setLocalChangeSnapshot",
|
|
@@ -970,7 +969,7 @@ class LocalSyncStateHelper {
|
|
|
970
969
|
* @returns Nothing.
|
|
971
970
|
*/
|
|
972
971
|
async removeLocalChangeSnapshot(localChangeSnapshot) {
|
|
973
|
-
await this.
|
|
972
|
+
await this._loggingComponent?.log({
|
|
974
973
|
level: "info",
|
|
975
974
|
source: this.CLASS_NAME,
|
|
976
975
|
message: "removeLocalChangeSnapshot",
|
|
@@ -987,7 +986,7 @@ class LocalSyncStateHelper {
|
|
|
987
986
|
* @returns Nothing.
|
|
988
987
|
*/
|
|
989
988
|
async applySyncState(storageKey, syncState) {
|
|
990
|
-
await this.
|
|
989
|
+
await this._loggingComponent?.log({
|
|
991
990
|
level: "info",
|
|
992
991
|
source: this.CLASS_NAME,
|
|
993
992
|
message: "applySyncState",
|
|
@@ -1012,7 +1011,7 @@ class LocalSyncStateHelper {
|
|
|
1012
1011
|
// If we have an epoch gap or no existing snapshots then we need to apply
|
|
1013
1012
|
// a full sync from a consolidation
|
|
1014
1013
|
if (!existingSnapshots.some(s => s.isConsolidated) || hasEpochGap) {
|
|
1015
|
-
await this.
|
|
1014
|
+
await this._loggingComponent?.log({
|
|
1016
1015
|
level: "info",
|
|
1017
1016
|
source: this.CLASS_NAME,
|
|
1018
1017
|
message: "applySnapshotNoExisting",
|
|
@@ -1023,7 +1022,7 @@ class LocalSyncStateHelper {
|
|
|
1023
1022
|
const mostRecentConsolidation = syncStateSnapshots.findIndex(snapshot => snapshot.isConsolidated);
|
|
1024
1023
|
if (mostRecentConsolidation !== -1) {
|
|
1025
1024
|
// We found the most recent consolidated snapshot, we can use it
|
|
1026
|
-
await this.
|
|
1025
|
+
await this._loggingComponent?.log({
|
|
1027
1026
|
level: "info",
|
|
1028
1027
|
source: this.CLASS_NAME,
|
|
1029
1028
|
message: "applySnapshotFoundConsolidated",
|
|
@@ -1051,7 +1050,7 @@ class LocalSyncStateHelper {
|
|
|
1051
1050
|
}
|
|
1052
1051
|
}
|
|
1053
1052
|
else {
|
|
1054
|
-
await this.
|
|
1053
|
+
await this._loggingComponent?.log({
|
|
1055
1054
|
level: "info",
|
|
1056
1055
|
source: this.CLASS_NAME,
|
|
1057
1056
|
message: "applySnapshotNoConsolidated",
|
|
@@ -1076,7 +1075,7 @@ class LocalSyncStateHelper {
|
|
|
1076
1075
|
const referencedExistingSnapshots = Object.keys(existingSnapshotsMap);
|
|
1077
1076
|
let completedProcessing = false;
|
|
1078
1077
|
for (const snapshot of syncStateSnapshots) {
|
|
1079
|
-
await this.
|
|
1078
|
+
await this._loggingComponent?.log({
|
|
1080
1079
|
level: "info",
|
|
1081
1080
|
source: this.CLASS_NAME,
|
|
1082
1081
|
message: "applySnapshot",
|
|
@@ -1137,7 +1136,7 @@ class LocalSyncStateHelper {
|
|
|
1137
1136
|
*/
|
|
1138
1137
|
async processModifiedSnapshots(modifiedSnapshots) {
|
|
1139
1138
|
for (const modifiedSnapshot of modifiedSnapshots) {
|
|
1140
|
-
await this.
|
|
1139
|
+
await this._loggingComponent?.log({
|
|
1141
1140
|
level: "info",
|
|
1142
1141
|
source: this.CLASS_NAME,
|
|
1143
1142
|
message: "processModifiedSnapshot",
|
|
@@ -1170,7 +1169,7 @@ class LocalSyncStateHelper {
|
|
|
1170
1169
|
*/
|
|
1171
1170
|
async processNewSnapshots(newSnapshots) {
|
|
1172
1171
|
for (const newSnapshot of newSnapshots) {
|
|
1173
|
-
await this.
|
|
1172
|
+
await this._loggingComponent?.log({
|
|
1174
1173
|
level: "info",
|
|
1175
1174
|
source: this.CLASS_NAME,
|
|
1176
1175
|
message: "processNewSnapshot",
|
|
@@ -1201,10 +1200,10 @@ class RemoteSyncStateHelper {
|
|
|
1201
1200
|
*/
|
|
1202
1201
|
CLASS_NAME = "RemoteSyncStateHelper";
|
|
1203
1202
|
/**
|
|
1204
|
-
* The logging
|
|
1203
|
+
* The logging component to use for logging.
|
|
1205
1204
|
* @internal
|
|
1206
1205
|
*/
|
|
1207
|
-
|
|
1206
|
+
_loggingComponent;
|
|
1208
1207
|
/**
|
|
1209
1208
|
* The event bus component.
|
|
1210
1209
|
* @internal
|
|
@@ -1257,7 +1256,7 @@ class RemoteSyncStateHelper {
|
|
|
1257
1256
|
_maxConsolidations;
|
|
1258
1257
|
/**
|
|
1259
1258
|
* Create a new instance of DecentralisedEntityStorageConnector.
|
|
1260
|
-
* @param
|
|
1259
|
+
* @param loggingComponent The logging component to use for logging.
|
|
1261
1260
|
* @param eventBusComponent The event bus component to use for events.
|
|
1262
1261
|
* @param verifiableSyncPointerStorageConnector The verifiable storage connector to use for storing sync pointers.
|
|
1263
1262
|
* @param blobStorageHelper The blob storage helper to use for remote sync states.
|
|
@@ -1265,8 +1264,8 @@ class RemoteSyncStateHelper {
|
|
|
1265
1264
|
* @param isTrustedNode Whether the node is trusted or not.
|
|
1266
1265
|
* @param maxConsolidations The maximum number of consolidations to keep in storage.
|
|
1267
1266
|
*/
|
|
1268
|
-
constructor(
|
|
1269
|
-
this.
|
|
1267
|
+
constructor(loggingComponent, eventBusComponent, verifiableSyncPointerStorageConnector, blobStorageHelper, changeSetHelper, isTrustedNode, maxConsolidations) {
|
|
1268
|
+
this._loggingComponent = loggingComponent;
|
|
1270
1269
|
this._eventBusComponent = eventBusComponent;
|
|
1271
1270
|
this._verifiableSyncPointerStorageConnector = verifiableSyncPointerStorageConnector;
|
|
1272
1271
|
this._changeSetHelper = changeSetHelper;
|
|
@@ -1304,7 +1303,7 @@ class RemoteSyncStateHelper {
|
|
|
1304
1303
|
* @returns The storage id of the change set if created.
|
|
1305
1304
|
*/
|
|
1306
1305
|
async buildChangeSet(storageKey, changes, completeCallback) {
|
|
1307
|
-
await this.
|
|
1306
|
+
await this._loggingComponent?.log({
|
|
1308
1307
|
level: "info",
|
|
1309
1308
|
source: this.CLASS_NAME,
|
|
1310
1309
|
message: "buildingChangeSet",
|
|
@@ -1330,7 +1329,7 @@ class RemoteSyncStateHelper {
|
|
|
1330
1329
|
// Once all the requests are handled the callback will be called
|
|
1331
1330
|
for (const change of setChanges) {
|
|
1332
1331
|
// Create a request for each change to populate the full details
|
|
1333
|
-
await this.
|
|
1332
|
+
await this._loggingComponent?.log({
|
|
1334
1333
|
level: "info",
|
|
1335
1334
|
source: this.CLASS_NAME,
|
|
1336
1335
|
message: "createChangeSetRequestingItem",
|
|
@@ -1353,7 +1352,7 @@ class RemoteSyncStateHelper {
|
|
|
1353
1352
|
* @returns Nothing.
|
|
1354
1353
|
*/
|
|
1355
1354
|
async finaliseFullChanges(storageKey, completeCallback) {
|
|
1356
|
-
await this.
|
|
1355
|
+
await this._loggingComponent?.log({
|
|
1357
1356
|
level: "info",
|
|
1358
1357
|
source: this.CLASS_NAME,
|
|
1359
1358
|
message: "finalisingSyncChanges",
|
|
@@ -1394,7 +1393,7 @@ class RemoteSyncStateHelper {
|
|
|
1394
1393
|
await completeCallback(syncChangeSet, changeSetStorageId);
|
|
1395
1394
|
}
|
|
1396
1395
|
catch (err) {
|
|
1397
|
-
await this.
|
|
1396
|
+
await this._loggingComponent?.log({
|
|
1398
1397
|
level: "error",
|
|
1399
1398
|
source: this.CLASS_NAME,
|
|
1400
1399
|
message: "finalisingSyncChangesFailed",
|
|
@@ -1417,7 +1416,7 @@ class RemoteSyncStateHelper {
|
|
|
1417
1416
|
* @returns Nothing.
|
|
1418
1417
|
*/
|
|
1419
1418
|
async addChangeSetToSyncState(storageKey, changeSetStorageId) {
|
|
1420
|
-
await this.
|
|
1419
|
+
await this._loggingComponent?.log({
|
|
1421
1420
|
level: "info",
|
|
1422
1421
|
source: this.CLASS_NAME,
|
|
1423
1422
|
message: "addChangeSetToSyncState",
|
|
@@ -1474,7 +1473,7 @@ class RemoteSyncStateHelper {
|
|
|
1474
1473
|
* @returns Nothing.
|
|
1475
1474
|
*/
|
|
1476
1475
|
async consolidationStart(storageKey, batchSize) {
|
|
1477
|
-
await this.
|
|
1476
|
+
await this._loggingComponent?.log({
|
|
1478
1477
|
level: "info",
|
|
1479
1478
|
source: this.CLASS_NAME,
|
|
1480
1479
|
message: "consolidationStarting"
|
|
@@ -1489,7 +1488,7 @@ class RemoteSyncStateHelper {
|
|
|
1489
1488
|
async getVerifiableSyncPointerStore() {
|
|
1490
1489
|
if (core.Is.stringValue(this._synchronisedStorageKey)) {
|
|
1491
1490
|
try {
|
|
1492
|
-
await this.
|
|
1491
|
+
await this._loggingComponent?.log({
|
|
1493
1492
|
level: "info",
|
|
1494
1493
|
source: this.CLASS_NAME,
|
|
1495
1494
|
message: "verifiableSyncPointerStoreRetrieving",
|
|
@@ -1500,7 +1499,7 @@ class RemoteSyncStateHelper {
|
|
|
1500
1499
|
const syncPointerStore = await this._verifiableSyncPointerStorageConnector.get(this._synchronisedStorageKey, { includeData: true });
|
|
1501
1500
|
if (core.Is.uint8Array(syncPointerStore.data)) {
|
|
1502
1501
|
const syncPointer = core.ObjectHelper.fromBytes(syncPointerStore.data);
|
|
1503
|
-
await this.
|
|
1502
|
+
await this._loggingComponent?.log({
|
|
1504
1503
|
level: "info",
|
|
1505
1504
|
source: this.CLASS_NAME,
|
|
1506
1505
|
message: "verifiableSyncPointerStoreRetrieved",
|
|
@@ -1516,7 +1515,7 @@ class RemoteSyncStateHelper {
|
|
|
1516
1515
|
throw err;
|
|
1517
1516
|
}
|
|
1518
1517
|
}
|
|
1519
|
-
await this.
|
|
1518
|
+
await this._loggingComponent?.log({
|
|
1520
1519
|
level: "info",
|
|
1521
1520
|
source: this.CLASS_NAME,
|
|
1522
1521
|
message: "verifiableSyncPointerStoreNotFound",
|
|
@@ -1538,7 +1537,7 @@ class RemoteSyncStateHelper {
|
|
|
1538
1537
|
*/
|
|
1539
1538
|
async storeVerifiableSyncPointerStore(syncPointerStore) {
|
|
1540
1539
|
if (core.Is.stringValue(this._nodeIdentity) && core.Is.stringValue(this._synchronisedStorageKey)) {
|
|
1541
|
-
await this.
|
|
1540
|
+
await this._loggingComponent?.log({
|
|
1542
1541
|
level: "info",
|
|
1543
1542
|
source: this.CLASS_NAME,
|
|
1544
1543
|
message: "verifiableSyncPointerStoreStoring",
|
|
@@ -1556,7 +1555,7 @@ class RemoteSyncStateHelper {
|
|
|
1556
1555
|
* @returns The id of the sync state.
|
|
1557
1556
|
*/
|
|
1558
1557
|
async storeRemoteSyncState(syncState) {
|
|
1559
|
-
await this.
|
|
1558
|
+
await this._loggingComponent?.log({
|
|
1560
1559
|
level: "info",
|
|
1561
1560
|
source: this.CLASS_NAME,
|
|
1562
1561
|
message: "syncStateStoring",
|
|
@@ -1599,7 +1598,7 @@ class RemoteSyncStateHelper {
|
|
|
1599
1598
|
*/
|
|
1600
1599
|
async getSyncState(syncPointerId) {
|
|
1601
1600
|
try {
|
|
1602
|
-
await this.
|
|
1601
|
+
await this._loggingComponent?.log({
|
|
1603
1602
|
level: "info",
|
|
1604
1603
|
source: this.CLASS_NAME,
|
|
1605
1604
|
message: "syncStateRetrieving",
|
|
@@ -1609,7 +1608,7 @@ class RemoteSyncStateHelper {
|
|
|
1609
1608
|
});
|
|
1610
1609
|
const syncState = await this._blobStorageHelper.loadBlob(syncPointerId);
|
|
1611
1610
|
if (core.Is.object(syncState)) {
|
|
1612
|
-
await this.
|
|
1611
|
+
await this._loggingComponent?.log({
|
|
1613
1612
|
level: "info",
|
|
1614
1613
|
source: this.CLASS_NAME,
|
|
1615
1614
|
message: "syncStateRetrieved",
|
|
@@ -1622,7 +1621,7 @@ class RemoteSyncStateHelper {
|
|
|
1622
1621
|
}
|
|
1623
1622
|
}
|
|
1624
1623
|
catch (error) {
|
|
1625
|
-
await this.
|
|
1624
|
+
await this._loggingComponent?.log({
|
|
1626
1625
|
level: "warn",
|
|
1627
1626
|
source: this.CLASS_NAME,
|
|
1628
1627
|
message: "getSyncStateError",
|
|
@@ -1632,7 +1631,7 @@ class RemoteSyncStateHelper {
|
|
|
1632
1631
|
error: core.BaseError.fromError(error)
|
|
1633
1632
|
});
|
|
1634
1633
|
}
|
|
1635
|
-
await this.
|
|
1634
|
+
await this._loggingComponent?.log({
|
|
1636
1635
|
level: "info",
|
|
1637
1636
|
source: this.CLASS_NAME,
|
|
1638
1637
|
message: "syncStateNotFound",
|
|
@@ -1704,7 +1703,7 @@ class RemoteSyncStateHelper {
|
|
|
1704
1703
|
// Remove the batch response storage ids for the storage key
|
|
1705
1704
|
// as we have consolidated the changes
|
|
1706
1705
|
delete this._batchResponseStorageIds[response.storageKey];
|
|
1707
|
-
await this.
|
|
1706
|
+
await this._loggingComponent?.log({
|
|
1708
1707
|
level: "info",
|
|
1709
1708
|
source: this.CLASS_NAME,
|
|
1710
1709
|
message: "consolidationCompleted"
|
|
@@ -1717,7 +1716,7 @@ class RemoteSyncStateHelper {
|
|
|
1717
1716
|
* @param response The item response to handle.
|
|
1718
1717
|
*/
|
|
1719
1718
|
async handleLocalItemResponse(response) {
|
|
1720
|
-
await this.
|
|
1719
|
+
await this._loggingComponent?.log({
|
|
1721
1720
|
level: "info",
|
|
1722
1721
|
source: this.CLASS_NAME,
|
|
1723
1722
|
message: "createChangeSetRespondingItem",
|
|
@@ -1771,10 +1770,10 @@ class SynchronisedStorageService {
|
|
|
1771
1770
|
*/
|
|
1772
1771
|
CLASS_NAME = "SynchronisedStorageService";
|
|
1773
1772
|
/**
|
|
1774
|
-
* The logging
|
|
1773
|
+
* The logging component to use for logging.
|
|
1775
1774
|
* @internal
|
|
1776
1775
|
*/
|
|
1777
|
-
|
|
1776
|
+
_loggingComponent;
|
|
1778
1777
|
/**
|
|
1779
1778
|
* The event bus component.
|
|
1780
1779
|
* @internal
|
|
@@ -1868,7 +1867,7 @@ class SynchronisedStorageService {
|
|
|
1868
1867
|
core.Guards.object(this.CLASS_NAME, "options", options);
|
|
1869
1868
|
core.Guards.object(this.CLASS_NAME, "options.config", options.config);
|
|
1870
1869
|
this._eventBusComponent = core.ComponentFactory.get(options.eventBusComponentType ?? "event-bus");
|
|
1871
|
-
this.
|
|
1870
|
+
this._loggingComponent = core.ComponentFactory.getIfExists(options.loggingComponentType ?? "logging");
|
|
1872
1871
|
this._vaultConnector = vaultModels.VaultConnectorFactory.get(options.vaultConnectorType ?? "vault");
|
|
1873
1872
|
this._localSyncSnapshotEntryEntityStorage = entityStorageModels.EntityStorageConnectorFactory.get(options.syncSnapshotStorageConnectorType ?? "sync-snapshot-entry");
|
|
1874
1873
|
this._verifiableSyncPointerStorageConnector = verifiableStorageModels.VerifiableStorageConnectorFactory.get(options.verifiableStorageConnectorType ?? "verifiable-storage");
|
|
@@ -1897,10 +1896,10 @@ class SynchronisedStorageService {
|
|
|
1897
1896
|
this._trustedSynchronisedStorageComponent =
|
|
1898
1897
|
core.ComponentFactory.get(options.trustedSynchronisedStorageComponentType);
|
|
1899
1898
|
}
|
|
1900
|
-
this._blobStorageHelper = new BlobStorageHelper(this.
|
|
1901
|
-
this._changeSetHelper = new ChangeSetHelper(this.
|
|
1902
|
-
this._localSyncStateHelper = new LocalSyncStateHelper(this.
|
|
1903
|
-
this._remoteSyncStateHelper = new RemoteSyncStateHelper(this.
|
|
1899
|
+
this._blobStorageHelper = new BlobStorageHelper(this._loggingComponent, this._vaultConnector, this._blobStorageConnector, this._config.blobStorageEncryptionKeyId, this._config.isTrustedNode);
|
|
1900
|
+
this._changeSetHelper = new ChangeSetHelper(this._loggingComponent, this._eventBusComponent, this._identityConnector, this._blobStorageHelper, this._config.synchronisedStorageMethodId);
|
|
1901
|
+
this._localSyncStateHelper = new LocalSyncStateHelper(this._loggingComponent, this._localSyncSnapshotEntryEntityStorage, this._changeSetHelper);
|
|
1902
|
+
this._remoteSyncStateHelper = new RemoteSyncStateHelper(this._loggingComponent, this._eventBusComponent, this._verifiableSyncPointerStorageConnector, this._blobStorageHelper, this._changeSetHelper, this._config.isTrustedNode, this._config.maxConsolidations);
|
|
1904
1903
|
this._serviceStarted = false;
|
|
1905
1904
|
this._activeStorageKeys = {};
|
|
1906
1905
|
this._eventBusComponent.subscribe(synchronisedStorageModels.SynchronisedStorageTopics.RegisterStorageKey, async (event) => this.registerStorageKey(event.data));
|
|
@@ -1985,7 +1984,7 @@ class SynchronisedStorageService {
|
|
|
1985
1984
|
throw new core.GeneralError(this.CLASS_NAME, "notTrustedNode");
|
|
1986
1985
|
}
|
|
1987
1986
|
core.Guards.object(this.CLASS_NAME, "syncChangeSet", syncChangeSet);
|
|
1988
|
-
await this.
|
|
1987
|
+
await this._loggingComponent?.log({
|
|
1989
1988
|
level: "info",
|
|
1990
1989
|
source: this.CLASS_NAME,
|
|
1991
1990
|
message: "syncChangeSetForRemoteNode",
|
|
@@ -2014,7 +2013,7 @@ class SynchronisedStorageService {
|
|
|
2014
2013
|
*/
|
|
2015
2014
|
async startEntitySync(storageKey) {
|
|
2016
2015
|
try {
|
|
2017
|
-
await this.
|
|
2016
|
+
await this._loggingComponent?.log({
|
|
2018
2017
|
level: "info",
|
|
2019
2018
|
source: this.CLASS_NAME,
|
|
2020
2019
|
message: "startEntitySync",
|
|
@@ -2028,7 +2027,7 @@ class SynchronisedStorageService {
|
|
|
2028
2027
|
await this.updateFromLocalSyncState(storageKey);
|
|
2029
2028
|
}
|
|
2030
2029
|
catch (error) {
|
|
2031
|
-
await this.
|
|
2030
|
+
await this._loggingComponent?.log({
|
|
2032
2031
|
level: "error",
|
|
2033
2032
|
source: this.CLASS_NAME,
|
|
2034
2033
|
message: "entitySyncFailed",
|
|
@@ -2043,7 +2042,7 @@ class SynchronisedStorageService {
|
|
|
2043
2042
|
* @internal
|
|
2044
2043
|
*/
|
|
2045
2044
|
async updateFromRemoteSyncState(storageKey) {
|
|
2046
|
-
await this.
|
|
2045
|
+
await this._loggingComponent?.log({
|
|
2047
2046
|
level: "info",
|
|
2048
2047
|
source: this.CLASS_NAME,
|
|
2049
2048
|
message: "updateFromRemoteSyncState",
|
|
@@ -2069,7 +2068,7 @@ class SynchronisedStorageService {
|
|
|
2069
2068
|
* @internal
|
|
2070
2069
|
*/
|
|
2071
2070
|
async updateFromLocalSyncState(storageKey) {
|
|
2072
|
-
await this.
|
|
2071
|
+
await this._loggingComponent?.log({
|
|
2073
2072
|
level: "info",
|
|
2074
2073
|
source: this.CLASS_NAME,
|
|
2075
2074
|
message: "updateFromLocalSyncState",
|
|
@@ -2083,7 +2082,7 @@ class SynchronisedStorageService {
|
|
|
2083
2082
|
if (core.Is.arrayValue(localChangeSnapshot.changes)) {
|
|
2084
2083
|
await this._remoteSyncStateHelper.buildChangeSet(storageKey, localChangeSnapshot.changes, async (syncChangeSet, changeSetStorageId) => {
|
|
2085
2084
|
if (core.Is.empty(syncChangeSet) && core.Is.empty(changeSetStorageId)) {
|
|
2086
|
-
await this.
|
|
2085
|
+
await this._loggingComponent?.log({
|
|
2087
2086
|
level: "info",
|
|
2088
2087
|
source: this.CLASS_NAME,
|
|
2089
2088
|
message: "builtStorageChangeSetNone",
|
|
@@ -2093,7 +2092,7 @@ class SynchronisedStorageService {
|
|
|
2093
2092
|
});
|
|
2094
2093
|
}
|
|
2095
2094
|
else {
|
|
2096
|
-
await this.
|
|
2095
|
+
await this._loggingComponent?.log({
|
|
2097
2096
|
level: "info",
|
|
2098
2097
|
source: this.CLASS_NAME,
|
|
2099
2098
|
message: "builtStorageChangeSet",
|
|
@@ -2113,7 +2112,7 @@ class SynchronisedStorageService {
|
|
|
2113
2112
|
core.Is.object(syncChangeSet)) {
|
|
2114
2113
|
// If we are not a trusted node, we need to send the changes to the trusted node
|
|
2115
2114
|
// and then remove the local change snapshot
|
|
2116
|
-
await this.
|
|
2115
|
+
await this._loggingComponent?.log({
|
|
2117
2116
|
level: "info",
|
|
2118
2117
|
source: this.CLASS_NAME,
|
|
2119
2118
|
message: "sendingChangeSetToTrustedNode",
|
|
@@ -2129,7 +2128,7 @@ class SynchronisedStorageService {
|
|
|
2129
2128
|
});
|
|
2130
2129
|
}
|
|
2131
2130
|
else {
|
|
2132
|
-
await this.
|
|
2131
|
+
await this._loggingComponent?.log({
|
|
2133
2132
|
level: "info",
|
|
2134
2133
|
source: this.CLASS_NAME,
|
|
2135
2134
|
message: "updateFromLocalSyncStateNoChanges",
|
|
@@ -2158,7 +2157,7 @@ class SynchronisedStorageService {
|
|
|
2158
2157
|
SynchronisedStorageService._DEFAULT_CONSOLIDATION_BATCH_SIZE);
|
|
2159
2158
|
}
|
|
2160
2159
|
catch (error) {
|
|
2161
|
-
await this.
|
|
2160
|
+
await this._loggingComponent?.log({
|
|
2162
2161
|
level: "error",
|
|
2163
2162
|
source: this.CLASS_NAME,
|
|
2164
2163
|
message: "consolidationSyncFailed",
|
|
@@ -2172,7 +2171,7 @@ class SynchronisedStorageService {
|
|
|
2172
2171
|
* @internal
|
|
2173
2172
|
*/
|
|
2174
2173
|
async registerStorageKey(syncRegisterStorageKey) {
|
|
2175
|
-
await this.
|
|
2174
|
+
await this._loggingComponent?.log({
|
|
2176
2175
|
level: "info",
|
|
2177
2176
|
source: this.CLASS_NAME,
|
|
2178
2177
|
message: "registerStorageKey",
|
|
@@ -2194,7 +2193,7 @@ class SynchronisedStorageService {
|
|
|
2194
2193
|
*/
|
|
2195
2194
|
async activateStorageKey(storageKey) {
|
|
2196
2195
|
if (!core.Is.empty(this._activeStorageKeys[storageKey]) && !this._activeStorageKeys[storageKey]) {
|
|
2197
|
-
await this.
|
|
2196
|
+
await this._loggingComponent?.log({
|
|
2198
2197
|
level: "info",
|
|
2199
2198
|
source: this.CLASS_NAME,
|
|
2200
2199
|
message: "activateStorageKey",
|