@originals/sdk 1.8.2 → 1.8.3

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.
Files changed (144) hide show
  1. package/package.json +5 -6
  2. package/src/adapters/FeeOracleMock.ts +0 -9
  3. package/src/adapters/index.ts +0 -5
  4. package/src/adapters/providers/OrdHttpProvider.ts +0 -126
  5. package/src/adapters/providers/OrdMockProvider.ts +0 -101
  6. package/src/adapters/types.ts +0 -66
  7. package/src/bitcoin/BitcoinManager.ts +0 -329
  8. package/src/bitcoin/BroadcastClient.ts +0 -54
  9. package/src/bitcoin/OrdinalsClient.ts +0 -120
  10. package/src/bitcoin/PSBTBuilder.ts +0 -106
  11. package/src/bitcoin/fee-calculation.ts +0 -38
  12. package/src/bitcoin/providers/OrdNodeProvider.ts +0 -92
  13. package/src/bitcoin/providers/OrdinalsProvider.ts +0 -56
  14. package/src/bitcoin/providers/types.ts +0 -59
  15. package/src/bitcoin/transactions/commit.ts +0 -465
  16. package/src/bitcoin/transactions/index.ts +0 -13
  17. package/src/bitcoin/transfer.ts +0 -43
  18. package/src/bitcoin/utxo-selection.ts +0 -322
  19. package/src/bitcoin/utxo.ts +0 -113
  20. package/src/cel/ExternalReferenceManager.ts +0 -87
  21. package/src/cel/OriginalsCel.ts +0 -460
  22. package/src/cel/algorithms/createEventLog.ts +0 -68
  23. package/src/cel/algorithms/deactivateEventLog.ts +0 -109
  24. package/src/cel/algorithms/index.ts +0 -11
  25. package/src/cel/algorithms/updateEventLog.ts +0 -99
  26. package/src/cel/algorithms/verifyEventLog.ts +0 -306
  27. package/src/cel/algorithms/witnessEvent.ts +0 -87
  28. package/src/cel/cli/create.ts +0 -330
  29. package/src/cel/cli/index.ts +0 -383
  30. package/src/cel/cli/inspect.ts +0 -549
  31. package/src/cel/cli/migrate.ts +0 -473
  32. package/src/cel/cli/verify.ts +0 -249
  33. package/src/cel/hash.ts +0 -71
  34. package/src/cel/index.ts +0 -16
  35. package/src/cel/layers/BtcoCelManager.ts +0 -408
  36. package/src/cel/layers/PeerCelManager.ts +0 -371
  37. package/src/cel/layers/WebVHCelManager.ts +0 -361
  38. package/src/cel/layers/index.ts +0 -27
  39. package/src/cel/serialization/cbor.ts +0 -189
  40. package/src/cel/serialization/index.ts +0 -10
  41. package/src/cel/serialization/json.ts +0 -209
  42. package/src/cel/types.ts +0 -160
  43. package/src/cel/witnesses/BitcoinWitness.ts +0 -184
  44. package/src/cel/witnesses/HttpWitness.ts +0 -241
  45. package/src/cel/witnesses/WitnessService.ts +0 -51
  46. package/src/cel/witnesses/index.ts +0 -11
  47. package/src/contexts/credentials-v1.json +0 -237
  48. package/src/contexts/credentials-v2-examples.json +0 -5
  49. package/src/contexts/credentials-v2.json +0 -340
  50. package/src/contexts/credentials.json +0 -237
  51. package/src/contexts/data-integrity-v2.json +0 -81
  52. package/src/contexts/dids.json +0 -58
  53. package/src/contexts/ed255192020.json +0 -93
  54. package/src/contexts/ordinals-plus.json +0 -23
  55. package/src/contexts/originals.json +0 -22
  56. package/src/core/OriginalsSDK.ts +0 -420
  57. package/src/crypto/Multikey.ts +0 -194
  58. package/src/crypto/Signer.ts +0 -262
  59. package/src/crypto/noble-init.ts +0 -138
  60. package/src/did/BtcoDidResolver.ts +0 -231
  61. package/src/did/DIDManager.ts +0 -705
  62. package/src/did/Ed25519Verifier.ts +0 -68
  63. package/src/did/KeyManager.ts +0 -239
  64. package/src/did/WebVHManager.ts +0 -499
  65. package/src/did/createBtcoDidDocument.ts +0 -60
  66. package/src/did/providers/OrdinalsClientProviderAdapter.ts +0 -68
  67. package/src/events/EventEmitter.ts +0 -222
  68. package/src/events/index.ts +0 -19
  69. package/src/events/types.ts +0 -331
  70. package/src/examples/basic-usage.ts +0 -78
  71. package/src/examples/create-module-original.ts +0 -435
  72. package/src/examples/full-lifecycle-flow.ts +0 -514
  73. package/src/examples/run.ts +0 -60
  74. package/src/index.ts +0 -204
  75. package/src/kinds/KindRegistry.ts +0 -320
  76. package/src/kinds/index.ts +0 -74
  77. package/src/kinds/types.ts +0 -470
  78. package/src/kinds/validators/AgentValidator.ts +0 -257
  79. package/src/kinds/validators/AppValidator.ts +0 -211
  80. package/src/kinds/validators/DatasetValidator.ts +0 -242
  81. package/src/kinds/validators/DocumentValidator.ts +0 -311
  82. package/src/kinds/validators/MediaValidator.ts +0 -269
  83. package/src/kinds/validators/ModuleValidator.ts +0 -225
  84. package/src/kinds/validators/base.ts +0 -276
  85. package/src/kinds/validators/index.ts +0 -12
  86. package/src/lifecycle/BatchOperations.ts +0 -381
  87. package/src/lifecycle/LifecycleManager.ts +0 -2156
  88. package/src/lifecycle/OriginalsAsset.ts +0 -524
  89. package/src/lifecycle/ProvenanceQuery.ts +0 -280
  90. package/src/lifecycle/ResourceVersioning.ts +0 -163
  91. package/src/migration/MigrationManager.ts +0 -587
  92. package/src/migration/audit/AuditLogger.ts +0 -176
  93. package/src/migration/checkpoint/CheckpointManager.ts +0 -112
  94. package/src/migration/checkpoint/CheckpointStorage.ts +0 -101
  95. package/src/migration/index.ts +0 -33
  96. package/src/migration/operations/BaseMigration.ts +0 -126
  97. package/src/migration/operations/PeerToBtcoMigration.ts +0 -105
  98. package/src/migration/operations/PeerToWebvhMigration.ts +0 -62
  99. package/src/migration/operations/WebvhToBtcoMigration.ts +0 -105
  100. package/src/migration/rollback/RollbackManager.ts +0 -170
  101. package/src/migration/state/StateMachine.ts +0 -92
  102. package/src/migration/state/StateTracker.ts +0 -156
  103. package/src/migration/types.ts +0 -356
  104. package/src/migration/validation/BitcoinValidator.ts +0 -107
  105. package/src/migration/validation/CredentialValidator.ts +0 -62
  106. package/src/migration/validation/DIDCompatibilityValidator.ts +0 -151
  107. package/src/migration/validation/LifecycleValidator.ts +0 -64
  108. package/src/migration/validation/StorageValidator.ts +0 -79
  109. package/src/migration/validation/ValidationPipeline.ts +0 -213
  110. package/src/resources/ResourceManager.ts +0 -655
  111. package/src/resources/index.ts +0 -21
  112. package/src/resources/types.ts +0 -202
  113. package/src/storage/LocalStorageAdapter.ts +0 -64
  114. package/src/storage/MemoryStorageAdapter.ts +0 -29
  115. package/src/storage/StorageAdapter.ts +0 -25
  116. package/src/storage/index.ts +0 -3
  117. package/src/types/bitcoin.ts +0 -98
  118. package/src/types/common.ts +0 -92
  119. package/src/types/credentials.ts +0 -89
  120. package/src/types/did.ts +0 -31
  121. package/src/types/external-shims.d.ts +0 -53
  122. package/src/types/index.ts +0 -7
  123. package/src/types/network.ts +0 -178
  124. package/src/utils/EventLogger.ts +0 -298
  125. package/src/utils/Logger.ts +0 -324
  126. package/src/utils/MetricsCollector.ts +0 -358
  127. package/src/utils/bitcoin-address.ts +0 -132
  128. package/src/utils/cbor.ts +0 -31
  129. package/src/utils/encoding.ts +0 -135
  130. package/src/utils/hash.ts +0 -12
  131. package/src/utils/retry.ts +0 -46
  132. package/src/utils/satoshi-validation.ts +0 -196
  133. package/src/utils/serialization.ts +0 -102
  134. package/src/utils/telemetry.ts +0 -44
  135. package/src/utils/validation.ts +0 -123
  136. package/src/vc/CredentialManager.ts +0 -955
  137. package/src/vc/Issuer.ts +0 -105
  138. package/src/vc/Verifier.ts +0 -54
  139. package/src/vc/cryptosuites/bbs.ts +0 -253
  140. package/src/vc/cryptosuites/bbsSimple.ts +0 -21
  141. package/src/vc/cryptosuites/eddsa.ts +0 -99
  142. package/src/vc/documentLoader.ts +0 -81
  143. package/src/vc/proofs/data-integrity.ts +0 -33
  144. package/src/vc/utils/jsonld.ts +0 -18
@@ -1,62 +0,0 @@
1
- /**
2
- * PeerToWebvhMigration - Handles migration from did:peer to did:webvh
3
- */
4
-
5
- import {
6
- MigrationOptions,
7
- CostEstimate,
8
- MigrationStateEnum
9
- } from '../types';
10
- import { DIDDocument } from '../../types';
11
- import { BaseMigration } from './BaseMigration';
12
-
13
- export class PeerToWebvhMigration extends BaseMigration {
14
- /**
15
- * Execute peer → webvh migration
16
- */
17
- async executeMigration(
18
- options: MigrationOptions,
19
- migrationId: string
20
- ): Promise<{ targetDid: string; didDocument: DIDDocument }> {
21
- // Resolve source DID
22
- const sourceDid = await this.resolveSourceDid(options.sourceDid);
23
-
24
- // Validate domain is provided
25
- if (!options.domain) {
26
- throw new Error('Domain is required for webvh migrations');
27
- }
28
-
29
- await this.updateStateWithRetry(migrationId, {
30
- state: MigrationStateEnum.IN_PROGRESS,
31
- currentOperation: 'Creating webvh DID document',
32
- progress: 30
33
- });
34
-
35
- // Migrate DID document to webvh
36
- const migratedDoc = await this.didManager.migrateToDIDWebVH(sourceDid, options.domain);
37
-
38
- await this.updateStateWithRetry(migrationId, {
39
- currentOperation: 'Migration completed',
40
- progress: 100,
41
- targetDid: migratedDoc.id
42
- });
43
-
44
- return {
45
- targetDid: migratedDoc.id,
46
- didDocument: migratedDoc
47
- };
48
- }
49
-
50
- /**
51
- * Estimate cost for peer → webvh migration
52
- */
53
- async estimateCost(options: MigrationOptions): Promise<CostEstimate> {
54
- // Web hosting is typically negligible cost
55
- return {
56
- storageCost: 0,
57
- networkFees: 0,
58
- totalCost: 0,
59
- currency: 'sats'
60
- };
61
- }
62
- }
@@ -1,105 +0,0 @@
1
- /**
2
- * WebvhToBtcoMigration - Handles migration from did:webvh to did:btco
3
- */
4
-
5
- import {
6
- MigrationOptions,
7
- CostEstimate,
8
- MigrationStateEnum
9
- } from '../types';
10
- import { DIDDocument, OriginalsConfig } from '../../types';
11
- import { BaseMigration } from './BaseMigration';
12
- import { BitcoinManager } from '../../bitcoin/BitcoinManager';
13
- import { DIDManager } from '../../did/DIDManager';
14
- import { CredentialManager } from '../../vc/CredentialManager';
15
- import { StateTracker } from '../state/StateTracker';
16
-
17
- export class WebvhToBtcoMigration extends BaseMigration {
18
- private bitcoinManager: BitcoinManager;
19
-
20
- constructor(
21
- config: OriginalsConfig,
22
- didManager: DIDManager,
23
- credentialManager: CredentialManager,
24
- stateTracker: StateTracker,
25
- bitcoinManager: BitcoinManager
26
- ) {
27
- super(config, didManager, credentialManager, stateTracker);
28
- this.bitcoinManager = bitcoinManager;
29
- }
30
-
31
- /**
32
- * Execute webvh → btco migration
33
- */
34
- async executeMigration(
35
- options: MigrationOptions,
36
- migrationId: string
37
- ): Promise<{ targetDid: string; didDocument: DIDDocument }> {
38
- // Resolve source DID
39
- const sourceDid = await this.resolveSourceDid(options.sourceDid);
40
-
41
- await this.updateStateWithRetry(migrationId, {
42
- state: MigrationStateEnum.IN_PROGRESS,
43
- currentOperation: 'Creating Bitcoin inscription',
44
- progress: 30
45
- });
46
-
47
- // Create Bitcoin inscription with DID document
48
- const manifest = {
49
- didDocument: sourceDid,
50
- migrationId,
51
- timestamp: new Date().toISOString()
52
- };
53
- const payload = Buffer.from(JSON.stringify(manifest));
54
-
55
- await this.updateStateWithRetry(migrationId, {
56
- state: MigrationStateEnum.ANCHORING,
57
- currentOperation: 'Anchoring to Bitcoin',
58
- progress: 50
59
- });
60
-
61
- const inscription = await this.bitcoinManager.inscribeData(
62
- payload,
63
- 'application/json',
64
- options.feeRate
65
- );
66
-
67
- // Use satoshi identifier or inscription ID
68
- const satoshiId = inscription.satoshi || inscription.inscriptionId.split('i')[0];
69
-
70
- await this.updateStateWithRetry(migrationId, {
71
- currentOperation: 'Creating btco DID document',
72
- progress: 80
73
- });
74
-
75
- // Migrate DID document to btco
76
- const migratedDoc = await this.didManager.migrateToDIDBTCO(sourceDid, satoshiId);
77
-
78
- await this.updateStateWithRetry(migrationId, {
79
- currentOperation: 'Migration completed',
80
- progress: 100,
81
- targetDid: migratedDoc.id
82
- });
83
-
84
- return {
85
- targetDid: migratedDoc.id,
86
- didDocument: migratedDoc
87
- };
88
- }
89
-
90
- /**
91
- * Estimate cost for webvh → btco migration
92
- */
93
- async estimateCost(options: MigrationOptions): Promise<CostEstimate> {
94
- const feeRate = options.feeRate || 10; // default 10 sat/vB
95
- const estimatedSize = 1024; // ~1KB for typical DID document
96
- const networkFees = estimatedSize * feeRate;
97
-
98
- return {
99
- storageCost: 0,
100
- networkFees,
101
- totalCost: networkFees,
102
- currency: 'sats'
103
- };
104
- }
105
- }
@@ -1,170 +0,0 @@
1
- /**
2
- * RollbackManager - Handles migration rollbacks
3
- */
4
-
5
- import {
6
- MigrationStateEnum,
7
- RollbackResult,
8
- MigrationError,
9
- MigrationErrorType,
10
- IRollbackManager
11
- } from '../types';
12
- import { OriginalsConfig } from '../../types';
13
- import { CheckpointManager } from '../checkpoint/CheckpointManager';
14
- import { DIDManager } from '../../did/DIDManager';
15
-
16
- export class RollbackManager implements IRollbackManager {
17
- constructor(
18
- private config: OriginalsConfig,
19
- private checkpointManager: CheckpointManager,
20
- private didManager: DIDManager
21
- ) {}
22
-
23
- /**
24
- * Rollback a migration to its checkpoint state
25
- */
26
- async rollback(migrationId: string, checkpointId: string): Promise<RollbackResult> {
27
- const startTime = Date.now();
28
- const errors: MigrationError[] = [];
29
-
30
- try {
31
- // Retrieve checkpoint
32
- const checkpoint = await this.checkpointManager.getCheckpoint(checkpointId);
33
- if (!checkpoint) {
34
- const error: MigrationError = {
35
- type: MigrationErrorType.ROLLBACK_ERROR,
36
- code: 'CHECKPOINT_NOT_FOUND',
37
- message: `Checkpoint ${checkpointId} not found`,
38
- migrationId,
39
- timestamp: Date.now()
40
- };
41
- errors.push(error);
42
-
43
- return {
44
- success: false,
45
- migrationId,
46
- checkpointId,
47
- restoredState: MigrationStateEnum.QUARANTINED,
48
- duration: Date.now() - startTime,
49
- errors
50
- };
51
- }
52
-
53
- // Verify checkpoint belongs to this migration
54
- if (checkpoint.migrationId !== migrationId) {
55
- const error: MigrationError = {
56
- type: MigrationErrorType.ROLLBACK_ERROR,
57
- code: 'CHECKPOINT_MISMATCH',
58
- message: `Checkpoint ${checkpointId} does not belong to migration ${migrationId}`,
59
- migrationId,
60
- timestamp: Date.now()
61
- };
62
- errors.push(error);
63
-
64
- return {
65
- success: false,
66
- migrationId,
67
- checkpointId,
68
- restoredState: MigrationStateEnum.QUARANTINED,
69
- duration: Date.now() - startTime,
70
- errors
71
- };
72
- }
73
-
74
- // Perform rollback based on source layer
75
- await this.performLayerSpecificRollback(checkpoint);
76
-
77
- // Clean up any partial migration artifacts
78
- await this.cleanupMigrationArtifacts(migrationId);
79
-
80
- const duration = Date.now() - startTime;
81
-
82
- // Verify rollback success
83
- if (errors.length === 0) {
84
- return {
85
- success: true,
86
- migrationId,
87
- checkpointId,
88
- restoredState: MigrationStateEnum.ROLLED_BACK,
89
- duration,
90
- errors: []
91
- };
92
- } else {
93
- return {
94
- success: false,
95
- migrationId,
96
- checkpointId,
97
- restoredState: MigrationStateEnum.QUARANTINED,
98
- duration,
99
- errors
100
- };
101
- }
102
- } catch (error) {
103
- const rollbackError: MigrationError = {
104
- type: MigrationErrorType.ROLLBACK_ERROR,
105
- code: 'ROLLBACK_FAILED',
106
- message: 'Rollback operation failed',
107
- technicalDetails: error instanceof Error ? error.message : String(error),
108
- migrationId,
109
- timestamp: Date.now()
110
- };
111
- errors.push(rollbackError);
112
-
113
- return {
114
- success: false,
115
- migrationId,
116
- checkpointId,
117
- restoredState: MigrationStateEnum.QUARANTINED,
118
- duration: Date.now() - startTime,
119
- errors
120
- };
121
- }
122
- }
123
-
124
- /**
125
- * Perform layer-specific rollback operations
126
- */
127
- private async performLayerSpecificRollback(checkpoint: any): Promise<void> {
128
- // For now, rollback mainly involves:
129
- // 1. Ensuring source DID is still valid (it should be, as we don't delete it)
130
- // 2. Cleaning up any partial artifacts on target layer
131
- // 3. Restoring any modified state
132
-
133
- // Verify source DID still resolves
134
- const sourceDid = await this.didManager.resolveDID(checkpoint.sourceDid);
135
- if (!sourceDid) {
136
- throw new Error(`Source DID ${checkpoint.sourceDid} could not be resolved during rollback`);
137
- }
138
-
139
- // Layer-specific cleanup would go here
140
- // For peer → webvh: Remove any published resources
141
- // For webvh → btco: Nothing to do (Bitcoin tx cannot be reversed)
142
- // For peer → btco: Nothing to do (Bitcoin tx cannot be reversed)
143
- }
144
-
145
- /**
146
- * Clean up migration artifacts
147
- */
148
- private async cleanupMigrationArtifacts(migrationId: string): Promise<void> {
149
- // Clean up any temporary files, partial uploads, etc.
150
- // This is a placeholder for actual cleanup logic
151
- }
152
-
153
- /**
154
- * Check if a rollback is possible
155
- */
156
- async canRollback(migrationId: string, checkpointId: string): Promise<boolean> {
157
- try {
158
- const checkpoint = await this.checkpointManager.getCheckpoint(checkpointId);
159
- if (!checkpoint || checkpoint.migrationId !== migrationId) {
160
- return false;
161
- }
162
-
163
- // Bitcoin transactions cannot be rolled back
164
- // But we can still restore the source DID to working state
165
- return true;
166
- } catch (error) {
167
- return false;
168
- }
169
- }
170
- }
@@ -1,92 +0,0 @@
1
- /**
2
- * StateMachine - Defines valid migration state transitions
3
- */
4
-
5
- import { MigrationStateEnum } from '../types';
6
-
7
- export class StateMachine {
8
- private transitions: Map<MigrationStateEnum, MigrationStateEnum[]>;
9
-
10
- constructor() {
11
- this.transitions = this.initializeTransitions();
12
- }
13
-
14
- /**
15
- * Initialize valid state transitions
16
- */
17
- private initializeTransitions(): Map<MigrationStateEnum, MigrationStateEnum[]> {
18
- const transitions = new Map<MigrationStateEnum, MigrationStateEnum[]>();
19
-
20
- // PENDING can transition to VALIDATING or FAILED
21
- transitions.set(MigrationStateEnum.PENDING, [
22
- MigrationStateEnum.VALIDATING,
23
- MigrationStateEnum.FAILED
24
- ]);
25
-
26
- // VALIDATING can transition to CHECKPOINTED or FAILED
27
- transitions.set(MigrationStateEnum.VALIDATING, [
28
- MigrationStateEnum.CHECKPOINTED,
29
- MigrationStateEnum.FAILED
30
- ]);
31
-
32
- // CHECKPOINTED can transition to IN_PROGRESS or FAILED
33
- transitions.set(MigrationStateEnum.CHECKPOINTED, [
34
- MigrationStateEnum.IN_PROGRESS,
35
- MigrationStateEnum.FAILED
36
- ]);
37
-
38
- // IN_PROGRESS can transition to ANCHORING (for btco), COMPLETED, or FAILED
39
- transitions.set(MigrationStateEnum.IN_PROGRESS, [
40
- MigrationStateEnum.ANCHORING,
41
- MigrationStateEnum.COMPLETED,
42
- MigrationStateEnum.FAILED
43
- ]);
44
-
45
- // ANCHORING can transition to COMPLETED or FAILED
46
- transitions.set(MigrationStateEnum.ANCHORING, [
47
- MigrationStateEnum.COMPLETED,
48
- MigrationStateEnum.FAILED
49
- ]);
50
-
51
- // FAILED can transition to ROLLED_BACK or QUARANTINED
52
- transitions.set(MigrationStateEnum.FAILED, [
53
- MigrationStateEnum.ROLLED_BACK,
54
- MigrationStateEnum.QUARANTINED
55
- ]);
56
-
57
- // COMPLETED, ROLLED_BACK, and QUARANTINED are terminal states
58
- transitions.set(MigrationStateEnum.COMPLETED, []);
59
- transitions.set(MigrationStateEnum.ROLLED_BACK, []);
60
- transitions.set(MigrationStateEnum.QUARANTINED, []);
61
-
62
- return transitions;
63
- }
64
-
65
- /**
66
- * Check if a state transition is valid
67
- */
68
- canTransition(fromState: MigrationStateEnum, toState: MigrationStateEnum): boolean {
69
- const validTransitions = this.transitions.get(fromState);
70
- if (!validTransitions) {
71
- return false;
72
- }
73
- return validTransitions.includes(toState);
74
- }
75
-
76
- /**
77
- * Get all valid transitions from a given state
78
- * Returns a copy to prevent external mutation of the transition table
79
- */
80
- getValidTransitions(fromState: MigrationStateEnum): MigrationStateEnum[] {
81
- const transitions = this.transitions.get(fromState);
82
- return transitions ? [...transitions] : [];
83
- }
84
-
85
- /**
86
- * Check if a state is terminal (no further transitions)
87
- */
88
- isTerminalState(state: MigrationStateEnum): boolean {
89
- const validTransitions = this.transitions.get(state);
90
- return !validTransitions || validTransitions.length === 0;
91
- }
92
- }
@@ -1,156 +0,0 @@
1
- /**
2
- * StateTracker - Tracks migration state throughout the migration lifecycle
3
- */
4
-
5
- import { v4 as uuidv4 } from 'uuid';
6
- import {
7
- MigrationOptions,
8
- MigrationState,
9
- MigrationStateEnum,
10
- IStateTracker
11
- } from '../types';
12
- import { OriginalsConfig } from '../../types';
13
- import { StateMachine } from './StateMachine';
14
-
15
- export class StateTracker implements IStateTracker {
16
- private states: Map<string, MigrationState>;
17
- private stateMachine: StateMachine;
18
-
19
- constructor(private config: OriginalsConfig) {
20
- this.states = new Map();
21
- this.stateMachine = new StateMachine();
22
- }
23
-
24
- /**
25
- * Create a new migration state
26
- */
27
- async createMigration(options: MigrationOptions): Promise<MigrationState> {
28
- const migrationId = `mig_${uuidv4()}`;
29
- const sourceLayer = this.extractLayer(options.sourceDid);
30
-
31
- if (!sourceLayer) {
32
- throw new Error(`Invalid source DID format: ${options.sourceDid}`);
33
- }
34
-
35
- const state: MigrationState = {
36
- migrationId,
37
- state: MigrationStateEnum.PENDING,
38
- sourceDid: options.sourceDid,
39
- sourceLayer,
40
- targetLayer: options.targetLayer,
41
- progress: 0,
42
- currentOperation: 'Initializing migration',
43
- startTime: Date.now()
44
- };
45
-
46
- this.states.set(migrationId, state);
47
- return state;
48
- }
49
-
50
- /**
51
- * Update migration state
52
- */
53
- async updateState(migrationId: string, updates: Partial<MigrationState>): Promise<void> {
54
- const currentState = this.states.get(migrationId);
55
- if (!currentState) {
56
- throw new Error(`Migration ${migrationId} not found`);
57
- }
58
-
59
- // Validate state transition if state is being updated
60
- if (updates.state && updates.state !== currentState.state) {
61
- if (!this.stateMachine.canTransition(currentState.state, updates.state)) {
62
- throw new Error(
63
- `Invalid state transition from ${currentState.state} to ${updates.state}`
64
- );
65
- }
66
- }
67
-
68
- // Update the state
69
- const updatedState = {
70
- ...currentState,
71
- ...updates
72
- };
73
-
74
- // Set end time if migration is completed, failed, or rolled back
75
- if (
76
- updatedState.state === MigrationStateEnum.COMPLETED ||
77
- updatedState.state === MigrationStateEnum.FAILED ||
78
- updatedState.state === MigrationStateEnum.ROLLED_BACK ||
79
- updatedState.state === MigrationStateEnum.QUARANTINED
80
- ) {
81
- updatedState.endTime = Date.now();
82
- }
83
-
84
- this.states.set(migrationId, updatedState);
85
- }
86
-
87
- /**
88
- * Get migration state
89
- */
90
- async getState(migrationId: string): Promise<MigrationState | null> {
91
- return this.states.get(migrationId) || null;
92
- }
93
-
94
- /**
95
- * Query migration states by filters
96
- */
97
- async queryStates(filters: Partial<MigrationState>): Promise<MigrationState[]> {
98
- const results: MigrationState[] = [];
99
-
100
- for (const state of this.states.values()) {
101
- let matches = true;
102
-
103
- for (const [key, value] of Object.entries(filters)) {
104
- if (state[key as keyof MigrationState] !== value) {
105
- matches = false;
106
- break;
107
- }
108
- }
109
-
110
- if (matches) {
111
- results.push(state);
112
- }
113
- }
114
-
115
- return results;
116
- }
117
-
118
- /**
119
- * Get all active migrations
120
- */
121
- async getActiveMigrations(): Promise<MigrationState[]> {
122
- return this.queryStates({
123
- state: MigrationStateEnum.IN_PROGRESS
124
- });
125
- }
126
-
127
- /**
128
- * Clean up old completed migrations
129
- */
130
- async cleanupOldStates(olderThanMs: number = 7 * 24 * 60 * 60 * 1000): Promise<void> {
131
- const cutoffTime = Date.now() - olderThanMs;
132
- const toDelete: string[] = [];
133
-
134
- for (const [id, state] of this.states.entries()) {
135
- if (
136
- state.endTime &&
137
- state.endTime < cutoffTime &&
138
- (state.state === MigrationStateEnum.COMPLETED ||
139
- state.state === MigrationStateEnum.ROLLED_BACK)
140
- ) {
141
- toDelete.push(id);
142
- }
143
- }
144
-
145
- for (const id of toDelete) {
146
- this.states.delete(id);
147
- }
148
- }
149
-
150
- private extractLayer(did: string): 'peer' | 'webvh' | 'btco' | null {
151
- if (did.startsWith('did:peer:')) return 'peer';
152
- if (did.startsWith('did:webvh:')) return 'webvh';
153
- if (did.startsWith('did:btco:')) return 'btco';
154
- return null;
155
- }
156
- }