@originals/sdk 1.4.2 → 1.4.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 (212) hide show
  1. package/package.json +4 -1
  2. package/.eslintrc.json +0 -33
  3. package/src/adapters/FeeOracleMock.ts +0 -9
  4. package/src/adapters/index.ts +0 -5
  5. package/src/adapters/providers/OrdHttpProvider.ts +0 -126
  6. package/src/adapters/providers/OrdMockProvider.ts +0 -101
  7. package/src/adapters/types.ts +0 -66
  8. package/src/bitcoin/BitcoinManager.ts +0 -330
  9. package/src/bitcoin/BroadcastClient.ts +0 -54
  10. package/src/bitcoin/OrdinalsClient.ts +0 -119
  11. package/src/bitcoin/PSBTBuilder.ts +0 -106
  12. package/src/bitcoin/fee-calculation.ts +0 -38
  13. package/src/bitcoin/providers/OrdNodeProvider.ts +0 -92
  14. package/src/bitcoin/providers/OrdinalsProvider.ts +0 -56
  15. package/src/bitcoin/providers/types.ts +0 -59
  16. package/src/bitcoin/transactions/commit.ts +0 -465
  17. package/src/bitcoin/transactions/index.ts +0 -13
  18. package/src/bitcoin/transfer.ts +0 -43
  19. package/src/bitcoin/utxo-selection.ts +0 -322
  20. package/src/bitcoin/utxo.ts +0 -113
  21. package/src/contexts/credentials-v1.json +0 -237
  22. package/src/contexts/credentials-v2-examples.json +0 -5
  23. package/src/contexts/credentials-v2.json +0 -340
  24. package/src/contexts/credentials.json +0 -237
  25. package/src/contexts/data-integrity-v2.json +0 -81
  26. package/src/contexts/dids.json +0 -58
  27. package/src/contexts/ed255192020.json +0 -93
  28. package/src/contexts/ordinals-plus.json +0 -23
  29. package/src/contexts/originals.json +0 -22
  30. package/src/core/OriginalsSDK.ts +0 -416
  31. package/src/crypto/Multikey.ts +0 -194
  32. package/src/crypto/Signer.ts +0 -254
  33. package/src/crypto/noble-init.ts +0 -121
  34. package/src/did/BtcoDidResolver.ts +0 -227
  35. package/src/did/DIDManager.ts +0 -694
  36. package/src/did/Ed25519Verifier.ts +0 -68
  37. package/src/did/KeyManager.ts +0 -236
  38. package/src/did/WebVHManager.ts +0 -498
  39. package/src/did/createBtcoDidDocument.ts +0 -59
  40. package/src/did/providers/OrdinalsClientProviderAdapter.ts +0 -68
  41. package/src/events/EventEmitter.ts +0 -222
  42. package/src/events/index.ts +0 -19
  43. package/src/events/types.ts +0 -331
  44. package/src/examples/basic-usage.ts +0 -78
  45. package/src/examples/create-module-original.ts +0 -435
  46. package/src/examples/full-lifecycle-flow.ts +0 -514
  47. package/src/examples/run.ts +0 -60
  48. package/src/index.ts +0 -150
  49. package/src/kinds/KindRegistry.ts +0 -290
  50. package/src/kinds/index.ts +0 -74
  51. package/src/kinds/types.ts +0 -470
  52. package/src/kinds/validators/AgentValidator.ts +0 -257
  53. package/src/kinds/validators/AppValidator.ts +0 -211
  54. package/src/kinds/validators/DatasetValidator.ts +0 -242
  55. package/src/kinds/validators/DocumentValidator.ts +0 -311
  56. package/src/kinds/validators/MediaValidator.ts +0 -269
  57. package/src/kinds/validators/ModuleValidator.ts +0 -225
  58. package/src/kinds/validators/base.ts +0 -276
  59. package/src/kinds/validators/index.ts +0 -12
  60. package/src/lifecycle/BatchOperations.ts +0 -373
  61. package/src/lifecycle/LifecycleManager.ts +0 -2126
  62. package/src/lifecycle/OriginalsAsset.ts +0 -524
  63. package/src/lifecycle/ProvenanceQuery.ts +0 -280
  64. package/src/lifecycle/ResourceVersioning.ts +0 -163
  65. package/src/migration/MigrationManager.ts +0 -527
  66. package/src/migration/audit/AuditLogger.ts +0 -176
  67. package/src/migration/checkpoint/CheckpointManager.ts +0 -112
  68. package/src/migration/checkpoint/CheckpointStorage.ts +0 -101
  69. package/src/migration/index.ts +0 -33
  70. package/src/migration/operations/BaseMigration.ts +0 -126
  71. package/src/migration/operations/PeerToBtcoMigration.ts +0 -105
  72. package/src/migration/operations/PeerToWebvhMigration.ts +0 -62
  73. package/src/migration/operations/WebvhToBtcoMigration.ts +0 -105
  74. package/src/migration/rollback/RollbackManager.ts +0 -170
  75. package/src/migration/state/StateMachine.ts +0 -92
  76. package/src/migration/state/StateTracker.ts +0 -156
  77. package/src/migration/types.ts +0 -344
  78. package/src/migration/validation/BitcoinValidator.ts +0 -107
  79. package/src/migration/validation/CredentialValidator.ts +0 -62
  80. package/src/migration/validation/DIDCompatibilityValidator.ts +0 -151
  81. package/src/migration/validation/LifecycleValidator.ts +0 -64
  82. package/src/migration/validation/StorageValidator.ts +0 -79
  83. package/src/migration/validation/ValidationPipeline.ts +0 -213
  84. package/src/resources/ResourceManager.ts +0 -655
  85. package/src/resources/index.ts +0 -21
  86. package/src/resources/types.ts +0 -202
  87. package/src/storage/LocalStorageAdapter.ts +0 -61
  88. package/src/storage/MemoryStorageAdapter.ts +0 -29
  89. package/src/storage/StorageAdapter.ts +0 -25
  90. package/src/storage/index.ts +0 -3
  91. package/src/types/bitcoin.ts +0 -98
  92. package/src/types/common.ts +0 -92
  93. package/src/types/credentials.ts +0 -88
  94. package/src/types/did.ts +0 -31
  95. package/src/types/external-shims.d.ts +0 -53
  96. package/src/types/index.ts +0 -7
  97. package/src/types/network.ts +0 -175
  98. package/src/utils/EventLogger.ts +0 -298
  99. package/src/utils/Logger.ts +0 -322
  100. package/src/utils/MetricsCollector.ts +0 -358
  101. package/src/utils/bitcoin-address.ts +0 -130
  102. package/src/utils/cbor.ts +0 -12
  103. package/src/utils/encoding.ts +0 -127
  104. package/src/utils/hash.ts +0 -6
  105. package/src/utils/retry.ts +0 -46
  106. package/src/utils/satoshi-validation.ts +0 -196
  107. package/src/utils/serialization.ts +0 -96
  108. package/src/utils/telemetry.ts +0 -40
  109. package/src/utils/validation.ts +0 -119
  110. package/src/vc/CredentialManager.ts +0 -918
  111. package/src/vc/Issuer.ts +0 -100
  112. package/src/vc/Verifier.ts +0 -47
  113. package/src/vc/cryptosuites/bbs.ts +0 -253
  114. package/src/vc/cryptosuites/bbsSimple.ts +0 -21
  115. package/src/vc/cryptosuites/eddsa.ts +0 -99
  116. package/src/vc/documentLoader.ts +0 -67
  117. package/src/vc/proofs/data-integrity.ts +0 -33
  118. package/src/vc/utils/jsonld.ts +0 -18
  119. package/tests/__mocks__/bbs-signatures.js +0 -17
  120. package/tests/__mocks__/mf-base58.js +0 -24
  121. package/tests/fixtures/did-documents.ts +0 -247
  122. package/tests/index.test.ts +0 -21
  123. package/tests/integration/BatchOperations.test.ts +0 -531
  124. package/tests/integration/CompleteLifecycle.e2e.test.ts +0 -735
  125. package/tests/integration/CredentialManager.test.ts +0 -42
  126. package/tests/integration/DIDManager.test.ts +0 -41
  127. package/tests/integration/DidPeerToWebVhFlow.test.ts +0 -351
  128. package/tests/integration/Events.test.ts +0 -435
  129. package/tests/integration/Lifecycle.transfer.btco.integration.test.ts +0 -25
  130. package/tests/integration/LifecycleManager.test.ts +0 -21
  131. package/tests/integration/MultikeyFlow.test.ts +0 -52
  132. package/tests/integration/TelemetryIntegration.test.ts +0 -395
  133. package/tests/integration/WebVhPublish.test.ts +0 -48
  134. package/tests/integration/createTypedOriginal.test.ts +0 -379
  135. package/tests/integration/migration/peer-to-webvh.test.ts +0 -172
  136. package/tests/manual/test-commit-creation.ts +0 -323
  137. package/tests/mocks/MockKeyStore.ts +0 -38
  138. package/tests/mocks/adapters/MemoryStorageAdapter.ts +0 -24
  139. package/tests/mocks/adapters/MockFeeOracle.ts +0 -11
  140. package/tests/mocks/adapters/MockOrdinalsProvider.ts +0 -76
  141. package/tests/mocks/adapters/OrdMockProvider.test.ts +0 -176
  142. package/tests/mocks/adapters/index.ts +0 -6
  143. package/tests/performance/BatchOperations.perf.test.ts +0 -403
  144. package/tests/performance/logging.perf.test.ts +0 -336
  145. package/tests/sdk.test.ts +0 -43
  146. package/tests/security/bitcoin-penetration-tests.test.ts +0 -622
  147. package/tests/setup.bun.ts +0 -69
  148. package/tests/setup.jest.ts +0 -23
  149. package/tests/stress/batch-operations-stress.test.ts +0 -571
  150. package/tests/unit/adapters/FeeOracleMock.test.ts +0 -40
  151. package/tests/unit/bitcoin/BitcoinManager.test.ts +0 -293
  152. package/tests/unit/bitcoin/BroadcastClient.test.ts +0 -52
  153. package/tests/unit/bitcoin/OrdNodeProvider.test.ts +0 -53
  154. package/tests/unit/bitcoin/OrdinalsClient.test.ts +0 -381
  155. package/tests/unit/bitcoin/OrdinalsClientProvider.test.ts +0 -102
  156. package/tests/unit/bitcoin/PSBTBuilder.test.ts +0 -84
  157. package/tests/unit/bitcoin/fee-calculation.test.ts +0 -261
  158. package/tests/unit/bitcoin/transactions/commit.test.ts +0 -649
  159. package/tests/unit/bitcoin/transfer.test.ts +0 -31
  160. package/tests/unit/bitcoin/utxo-selection-new.test.ts +0 -502
  161. package/tests/unit/bitcoin/utxo.more.test.ts +0 -39
  162. package/tests/unit/bitcoin/utxo.selection.test.ts +0 -38
  163. package/tests/unit/core/OriginalsSDK.test.ts +0 -152
  164. package/tests/unit/crypto/Multikey.test.ts +0 -206
  165. package/tests/unit/crypto/Signer.test.ts +0 -408
  166. package/tests/unit/did/BtcoDidResolver.test.ts +0 -611
  167. package/tests/unit/did/DIDManager.more.test.ts +0 -43
  168. package/tests/unit/did/DIDManager.test.ts +0 -185
  169. package/tests/unit/did/Ed25519Verifier.test.ts +0 -160
  170. package/tests/unit/did/KeyManager.test.ts +0 -452
  171. package/tests/unit/did/OrdinalsClientProviderAdapter.test.ts +0 -45
  172. package/tests/unit/did/WebVHManager.test.ts +0 -435
  173. package/tests/unit/did/createBtcoDidDocument.test.ts +0 -67
  174. package/tests/unit/did/providers/OrdinalsClientProviderAdapter.test.ts +0 -159
  175. package/tests/unit/events/EventEmitter.test.ts +0 -407
  176. package/tests/unit/kinds/KindRegistry.test.ts +0 -329
  177. package/tests/unit/kinds/types.test.ts +0 -409
  178. package/tests/unit/kinds/validators.test.ts +0 -651
  179. package/tests/unit/lifecycle/BatchOperations.test.ts +0 -527
  180. package/tests/unit/lifecycle/LifecycleManager.cleanapi.test.ts +0 -441
  181. package/tests/unit/lifecycle/LifecycleManager.keymanagement.test.ts +0 -312
  182. package/tests/unit/lifecycle/LifecycleManager.prov.test.ts +0 -18
  183. package/tests/unit/lifecycle/LifecycleManager.test.ts +0 -213
  184. package/tests/unit/lifecycle/LifecycleManager.transfer.unit.test.ts +0 -30
  185. package/tests/unit/lifecycle/OriginalsAsset.test.ts +0 -176
  186. package/tests/unit/lifecycle/ProvenanceQuery.test.ts +0 -577
  187. package/tests/unit/lifecycle/ResourceVersioning.test.ts +0 -651
  188. package/tests/unit/resources/ResourceManager.test.ts +0 -740
  189. package/tests/unit/storage/MemoryStorageAdapter.test.ts +0 -93
  190. package/tests/unit/types/network.test.ts +0 -255
  191. package/tests/unit/utils/EventIntegration.test.ts +0 -384
  192. package/tests/unit/utils/Logger.test.ts +0 -473
  193. package/tests/unit/utils/MetricsCollector.test.ts +0 -358
  194. package/tests/unit/utils/bitcoin-address.test.ts +0 -250
  195. package/tests/unit/utils/cbor.test.ts +0 -35
  196. package/tests/unit/utils/encoding.test.ts +0 -318
  197. package/tests/unit/utils/hash.test.ts +0 -12
  198. package/tests/unit/utils/retry.test.ts +0 -100
  199. package/tests/unit/utils/satoshi-validation.test.ts +0 -354
  200. package/tests/unit/utils/serialization.test.ts +0 -124
  201. package/tests/unit/utils/telemetry.test.ts +0 -52
  202. package/tests/unit/utils/validation.test.ts +0 -141
  203. package/tests/unit/vc/CredentialManager.helpers.test.ts +0 -527
  204. package/tests/unit/vc/CredentialManager.test.ts +0 -487
  205. package/tests/unit/vc/Issuer.test.ts +0 -107
  206. package/tests/unit/vc/Verifier.test.ts +0 -525
  207. package/tests/unit/vc/bbs.test.ts +0 -282
  208. package/tests/unit/vc/cryptosuites/eddsa.test.ts +0 -398
  209. package/tests/unit/vc/documentLoader.test.ts +0 -121
  210. package/tests/unit/vc/proofs/data-integrity.test.ts +0 -24
  211. package/tsconfig.json +0 -31
  212. package/tsconfig.test.json +0 -15
@@ -1,23 +0,0 @@
1
- // Ensure globalThis.crypto is available for noble libraries in Node test env
2
- import { webcrypto } from 'node:crypto';
3
- import * as ed25519 from '@noble/ed25519';
4
- import { createHash } from 'node:crypto';
5
-
6
- // Ensure Jest matchers are properly extended
7
- import 'jest';
8
-
9
- if (typeof globalThis.crypto === 'undefined') {
10
- // @ts-ignore
11
- globalThis.crypto = webcrypto as unknown as Crypto;
12
- }
13
-
14
- // Configure noble ed25519 to use sha512 via Node crypto
15
- // @ts-ignore
16
- ed25519.etc.sha512Sync = (...msgs: Uint8Array[]) => {
17
- const hasher = createHash('sha512');
18
- for (const m of msgs) hasher.update(Buffer.from(m));
19
- return new Uint8Array(hasher.digest());
20
- };
21
-
22
-
23
-
@@ -1,571 +0,0 @@
1
- /**
2
- * Batch Operations Stress and Load Testing
3
- *
4
- * This test suite performs stress testing on batch operations,
5
- * migration processes, and concurrent transaction handling.
6
- */
7
-
8
- import { describe, it, expect, beforeEach } from 'bun:test';
9
- import { OriginalsSDK } from '../../src/core/OriginalsSDK';
10
- import { OrdMockProvider } from '../../src/adapters/providers/OrdMockProvider';
11
- import { BatchOperationExecutor } from '../../src/lifecycle/BatchOperations';
12
- import { MemoryKeyStore } from '../../src/storage/MemoryKeyStore';
13
- import type { AssetResource, OriginalsConfig } from '../../src/types';
14
-
15
- describe('Batch Operations Stress Tests', () => {
16
- let sdk: OriginalsSDK;
17
- let config: OriginalsConfig;
18
-
19
- beforeEach(() => {
20
- config = {
21
- network: 'regtest',
22
- defaultKeyType: 'ES256K',
23
- ordinalsProvider: new OrdMockProvider(),
24
- enableLogging: false
25
- };
26
- sdk = OriginalsSDK.create(config);
27
- });
28
-
29
- describe('1. Batch Size Scaling Tests', () => {
30
- it('should handle 10 assets (baseline)', async () => {
31
- const batchSize = 10;
32
- const resourcesList = createTestResourcesList(batchSize);
33
-
34
- const startTime = Date.now();
35
- const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
36
- continueOnError: false,
37
- maxConcurrent: 1
38
- });
39
- const duration = Date.now() - startTime;
40
-
41
- expect(result.successful).toHaveLength(batchSize);
42
- expect(result.failed).toHaveLength(0);
43
-
44
- logPerformanceMetrics('10 assets batch', batchSize, duration, result);
45
- }, 30000);
46
-
47
- it('should handle 100 assets (typical load)', async () => {
48
- const batchSize = 100;
49
- const resourcesList = createTestResourcesList(batchSize);
50
-
51
- const startTime = Date.now();
52
- const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
53
- continueOnError: true,
54
- maxConcurrent: 5
55
- });
56
- const duration = Date.now() - startTime;
57
-
58
- expect(result.totalProcessed).toBe(batchSize);
59
- expect(result.successful.length + result.failed.length).toBe(batchSize);
60
-
61
- logPerformanceMetrics('100 assets batch', batchSize, duration, result);
62
- }, 60000);
63
-
64
- it('should handle 1000 assets (stress test)', async () => {
65
- const batchSize = 1000;
66
- const resourcesList = createTestResourcesList(batchSize);
67
-
68
- const startTime = Date.now();
69
- const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
70
- continueOnError: true,
71
- maxConcurrent: 10
72
- });
73
- const duration = Date.now() - startTime;
74
-
75
- expect(result.totalProcessed).toBe(batchSize);
76
-
77
- logPerformanceMetrics('1000 assets batch', batchSize, duration, result);
78
-
79
- // Performance expectations
80
- const avgTimePerAsset = duration / batchSize;
81
- expect(avgTimePerAsset).toBeLessThan(100); // Should average < 100ms per asset
82
-
83
- console.log(`[STRESS] Average time per asset: ${avgTimePerAsset.toFixed(2)}ms`);
84
- }, 120000);
85
-
86
- it('should handle 10000 assets (breaking point test)', async () => {
87
- const batchSize = 10000;
88
- const resourcesList = createTestResourcesList(batchSize);
89
-
90
- const startTime = Date.now();
91
- const startMemory = process.memoryUsage().heapUsed;
92
-
93
- const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
94
- continueOnError: true,
95
- maxConcurrent: 20,
96
- timeoutMs: 60000
97
- });
98
-
99
- const duration = Date.now() - startTime;
100
- const endMemory = process.memoryUsage().heapUsed;
101
- const memoryDelta = (endMemory - startMemory) / 1024 / 1024; // MB
102
-
103
- expect(result.totalProcessed).toBe(batchSize);
104
-
105
- logPerformanceMetrics('10000 assets batch', batchSize, duration, result);
106
-
107
- console.log(`[STRESS] Memory usage: ${memoryDelta.toFixed(2)}MB`);
108
- console.log(`[STRESS] Memory per asset: ${(memoryDelta / batchSize * 1024).toFixed(2)}KB`);
109
-
110
- // Memory should not grow unreasonably
111
- expect(memoryDelta).toBeLessThan(500); // Should use < 500MB for 10k assets
112
- }, 300000);
113
- });
114
-
115
- describe('2. Concurrent Batch Operation Tests', () => {
116
- it('should handle 1 concurrent batch (baseline)', async () => {
117
- const result = await runConcurrentBatches(1, 50);
118
-
119
- expect(result.allSuccessful).toBeGreaterThan(0);
120
-
121
- logConcurrencyMetrics('1 concurrent batch', 1, 50, result);
122
- }, 60000);
123
-
124
- it('should handle 10 concurrent batches', async () => {
125
- const result = await runConcurrentBatches(10, 20);
126
-
127
- expect(result.allSuccessful).toBeGreaterThan(0);
128
-
129
- logConcurrencyMetrics('10 concurrent batches', 10, 20, result);
130
- }, 120000);
131
-
132
- it('should handle 100 concurrent batches (high concurrency)', async () => {
133
- const result = await runConcurrentBatches(100, 10);
134
-
135
- expect(result.totalBatches).toBe(100);
136
-
137
- logConcurrencyMetrics('100 concurrent batches', 100, 10, result);
138
-
139
- // Calculate error rate
140
- const errorRate = (result.allFailed / result.totalItems) * 100;
141
- expect(errorRate).toBeLessThan(5); // < 5% error rate acceptable under high load
142
-
143
- console.log(`[STRESS] Error rate under high concurrency: ${errorRate.toFixed(2)}%`);
144
- }, 300000);
145
-
146
- it('should handle mixed concurrent operations', async () => {
147
- const operations = [
148
- sdk.lifecycle.batchCreateAssets(createTestResourcesList(50)),
149
- sdk.lifecycle.batchCreateAssets(createTestResourcesList(50)),
150
- sdk.lifecycle.batchCreateAssets(createTestResourcesList(50)),
151
- ];
152
-
153
- const startTime = Date.now();
154
- const results = await Promise.all(operations);
155
- const duration = Date.now() - startTime;
156
-
157
- const totalSuccessful = results.reduce((sum, r) => sum + r.successful.length, 0);
158
- const totalFailed = results.reduce((sum, r) => sum + r.failed.length, 0);
159
-
160
- console.log(`[STRESS] Mixed concurrent operations:`);
161
- console.log(` - Total successful: ${totalSuccessful}`);
162
- console.log(` - Total failed: ${totalFailed}`);
163
- console.log(` - Duration: ${duration}ms`);
164
- console.log(` - Throughput: ${(totalSuccessful / (duration / 1000)).toFixed(2)} assets/sec`);
165
- }, 120000);
166
- });
167
-
168
- describe('3. Batch Inscription Stress Tests', () => {
169
- it('should handle batch inscription with single transaction mode', async () => {
170
- // Create assets first
171
- const resourcesList = createTestResourcesList(10);
172
- const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
173
-
174
- expect(createResult.successful).toHaveLength(10);
175
-
176
- const assets = createResult.successful.map(s => s.result);
177
-
178
- // Inscribe in batch with single transaction
179
- const startTime = Date.now();
180
- const inscribeResult = await sdk.lifecycle.batchInscribeOnBitcoin(assets, {
181
- singleTransaction: true,
182
- feeRate: 10,
183
- continueOnError: false
184
- });
185
- const duration = Date.now() - startTime;
186
-
187
- expect(inscribeResult.successful).toHaveLength(10);
188
-
189
- console.log(`[STRESS] Batch inscription (single tx):`);
190
- console.log(` - Assets: 10`);
191
- console.log(` - Duration: ${duration}ms`);
192
- console.log(` - Mode: Single transaction`);
193
- }, 60000);
194
-
195
- it('should handle batch inscription with individual transactions', async () => {
196
- const resourcesList = createTestResourcesList(10);
197
- const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
198
- const assets = createResult.successful.map(s => s.result);
199
-
200
- const startTime = Date.now();
201
- const inscribeResult = await sdk.lifecycle.batchInscribeOnBitcoin(assets, {
202
- singleTransaction: false,
203
- feeRate: 10,
204
- continueOnError: true,
205
- maxConcurrent: 3
206
- });
207
- const duration = Date.now() - startTime;
208
-
209
- expect(inscribeResult.totalProcessed).toBe(10);
210
-
211
- console.log(`[STRESS] Batch inscription (individual txs):`);
212
- console.log(` - Assets: 10`);
213
- console.log(` - Duration: ${duration}ms`);
214
- console.log(` - Mode: Individual transactions`);
215
- console.log(` - Concurrency: 3`);
216
- }, 60000);
217
-
218
- it('should compare cost savings between modes', async () => {
219
- const resourcesList = createTestResourcesList(50);
220
- const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
221
- const assets = createResult.successful.map(s => s.result);
222
-
223
- // Test single transaction mode
224
- const singleTxStart = Date.now();
225
- const singleTxResult = await sdk.lifecycle.batchInscribeOnBitcoin(
226
- assets.slice(0, 25),
227
- {
228
- singleTransaction: true,
229
- feeRate: 10
230
- }
231
- );
232
- const singleTxDuration = Date.now() - singleTxStart;
233
-
234
- // Test individual transaction mode
235
- const individualTxStart = Date.now();
236
- const individualTxResult = await sdk.lifecycle.batchInscribeOnBitcoin(
237
- assets.slice(25, 50),
238
- {
239
- singleTransaction: false,
240
- feeRate: 10,
241
- maxConcurrent: 5
242
- }
243
- );
244
- const individualTxDuration = Date.now() - individualTxStart;
245
-
246
- console.log(`[STRESS] Cost comparison:`);
247
- console.log(` Single TX mode:`);
248
- console.log(` - Duration: ${singleTxDuration}ms`);
249
- console.log(` - Assets: 25`);
250
- console.log(` Individual TX mode:`);
251
- console.log(` - Duration: ${individualTxDuration}ms`);
252
- console.log(` - Assets: 25`);
253
- console.log(` - Concurrency: 5`);
254
- console.log(` Performance ratio: ${(individualTxDuration / singleTxDuration).toFixed(2)}x`);
255
- }, 120000);
256
- });
257
-
258
- describe('4. Migration Operation Stress Tests', () => {
259
- it('should handle 1000 assets migrating through layers', async () => {
260
- const batchSize = 1000;
261
- const resourcesList = createTestResourcesList(batchSize);
262
-
263
- // Create assets (did:peer layer)
264
- const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList, {
265
- maxConcurrent: 10
266
- });
267
-
268
- expect(createResult.successful).toHaveLength(batchSize);
269
-
270
- const startTime = Date.now();
271
- let migratedCount = 0;
272
-
273
- // Migrate to did:webvh layer
274
- for (const { result: asset } of createResult.successful.slice(0, 100)) {
275
- try {
276
- await sdk.lifecycle.publishToWeb(asset, 'localhost:3000');
277
- migratedCount++;
278
- } catch (error) {
279
- // Expected to fail in test environment
280
- }
281
- }
282
-
283
- const duration = Date.now() - startTime;
284
-
285
- console.log(`[STRESS] Migration stress test:`);
286
- console.log(` - Assets created: ${batchSize}`);
287
- console.log(` - Assets migrated: ${migratedCount}`);
288
- console.log(` - Duration: ${duration}ms`);
289
- console.log(` - Avg time per migration: ${migratedCount > 0 ? (duration / migratedCount).toFixed(2) : 'N/A'}ms`);
290
- }, 120000);
291
-
292
- it('should handle concurrent migrations', async () => {
293
- const resourcesList = createTestResourcesList(30);
294
- const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
295
- const assets = createResult.successful.map(s => s.result);
296
-
297
- const startTime = Date.now();
298
-
299
- // Attempt concurrent migrations
300
- const migrations = assets.slice(0, 10).map(asset =>
301
- sdk.lifecycle.publishToWeb(asset, 'localhost:3000').catch(e => e)
302
- );
303
-
304
- await Promise.allSettled(migrations);
305
-
306
- const duration = Date.now() - startTime;
307
-
308
- console.log(`[STRESS] Concurrent migrations:`);
309
- console.log(` - Concurrent operations: 10`);
310
- console.log(` - Duration: ${duration}ms`);
311
- }, 60000);
312
- });
313
-
314
- describe('5. Error Recovery and Retry Stress Tests', () => {
315
- it('should handle batch with 50% failure rate and retry', async () => {
316
- const executor = new BatchOperationExecutor();
317
- let callCount = 0;
318
-
319
- const items = Array.from({ length: 100 }, (_, i) => i);
320
-
321
- const result = await executor.execute(
322
- items,
323
- async (item) => {
324
- callCount++;
325
- // Simulate 50% failure on first attempt
326
- if (callCount % 2 === 0 && callCount <= 100) {
327
- throw new Error('Simulated failure');
328
- }
329
- return item * 2;
330
- },
331
- {
332
- continueOnError: true,
333
- retryCount: 2,
334
- retryDelay: 10,
335
- maxConcurrent: 5
336
- }
337
- );
338
-
339
- console.log(`[STRESS] Error recovery test:`);
340
- console.log(` - Total items: 100`);
341
- console.log(` - Successful: ${result.successful.length}`);
342
- console.log(` - Failed: ${result.failed.length}`);
343
- console.log(` - Total calls (with retries): ${callCount}`);
344
- console.log(` - Duration: ${result.totalDuration}ms`);
345
- }, 60000);
346
-
347
- it('should handle exponential backoff under stress', async () => {
348
- const executor = new BatchOperationExecutor();
349
- const retryTimes: number[] = [];
350
-
351
- const items = Array.from({ length: 10 }, (_, i) => i);
352
-
353
- await executor.execute(
354
- items,
355
- async (item, index) => {
356
- retryTimes.push(Date.now());
357
- if (retryTimes.length <= 20) { // Fail first few
358
- throw new Error('Force retry');
359
- }
360
- return item;
361
- },
362
- {
363
- continueOnError: true,
364
- retryCount: 3,
365
- retryDelay: 100,
366
- maxConcurrent: 1
367
- }
368
- );
369
-
370
- // Analyze retry delays
371
- const delays: number[] = [];
372
- for (let i = 1; i < Math.min(retryTimes.length, 10); i++) {
373
- delays.push(retryTimes[i] - retryTimes[i - 1]);
374
- }
375
-
376
- console.log(`[STRESS] Exponential backoff analysis:`);
377
- console.log(` - Retry delays: ${delays.map(d => d + 'ms').join(', ')}`);
378
- console.log(` - Average delay: ${(delays.reduce((a, b) => a + b, 0) / delays.length).toFixed(2)}ms`);
379
- }, 30000);
380
- });
381
-
382
- describe('6. Memory and Resource Tests', () => {
383
- it('should not leak memory during repeated batch operations', async () => {
384
- const iterations = 10;
385
- const batchSize = 100;
386
-
387
- const memoryReadings: number[] = [];
388
-
389
- for (let i = 0; i < iterations; i++) {
390
- const resourcesList = createTestResourcesList(batchSize);
391
-
392
- await sdk.lifecycle.batchCreateAssets(resourcesList, {
393
- maxConcurrent: 5
394
- });
395
-
396
- // Force garbage collection if available
397
- if (global.gc) {
398
- global.gc();
399
- }
400
-
401
- const memUsage = process.memoryUsage().heapUsed / 1024 / 1024; // MB
402
- memoryReadings.push(memUsage);
403
-
404
- console.log(`[STRESS] Iteration ${i + 1}: ${memUsage.toFixed(2)}MB`);
405
- }
406
-
407
- // Check for memory leak (memory shouldn't grow linearly)
408
- const firstHalf = memoryReadings.slice(0, 5).reduce((a, b) => a + b) / 5;
409
- const secondHalf = memoryReadings.slice(5).reduce((a, b) => a + b) / 5;
410
- const growth = ((secondHalf - firstHalf) / firstHalf) * 100;
411
-
412
- console.log(`[STRESS] Memory growth: ${growth.toFixed(2)}%`);
413
- expect(Math.abs(growth)).toBeLessThan(50); // Memory shouldn't grow > 50%
414
- }, 180000);
415
-
416
- it('should handle resource cleanup after timeout', async () => {
417
- const executor = new BatchOperationExecutor();
418
-
419
- const result = await executor.execute(
420
- [1, 2, 3, 4, 5],
421
- async (item) => {
422
- // Simulate long-running operation
423
- await new Promise(resolve => setTimeout(resolve, 100));
424
- return item * 2;
425
- },
426
- {
427
- timeoutMs: 50, // Timeout before completion
428
- continueOnError: true
429
- }
430
- );
431
-
432
- expect(result.failed.length).toBeGreaterThan(0);
433
- console.log(`[STRESS] Timeout handling: ${result.failed.length} operations timed out`);
434
- }, 10000);
435
- });
436
-
437
- describe('7. Throughput Benchmarks', () => {
438
- it('should measure peak throughput for asset creation', async () => {
439
- const testDuration = 5000; // 5 seconds
440
- const startTime = Date.now();
441
- let totalCreated = 0;
442
-
443
- while (Date.now() - startTime < testDuration) {
444
- const batch = createTestResourcesList(10);
445
- const result = await sdk.lifecycle.batchCreateAssets(batch, {
446
- maxConcurrent: 5
447
- });
448
- totalCreated += result.successful.length;
449
- }
450
-
451
- const actualDuration = Date.now() - startTime;
452
- const throughput = (totalCreated / actualDuration) * 1000; // per second
453
-
454
- console.log(`[BENCHMARK] Asset creation throughput:`);
455
- console.log(` - Total created: ${totalCreated}`);
456
- console.log(` - Duration: ${actualDuration}ms`);
457
- console.log(` - Throughput: ${throughput.toFixed(2)} assets/sec`);
458
-
459
- expect(throughput).toBeGreaterThan(10); // Should create at least 10 assets/sec
460
- }, 10000);
461
- });
462
- });
463
-
464
- // Helper functions
465
-
466
- function createTestResourcesList(count: number): AssetResource[][] {
467
- return Array.from({ length: count }, (_, i) => [
468
- {
469
- id: `resource-${i}-${Date.now()}`,
470
- type: 'DigitalArt',
471
- contentType: 'application/json',
472
- hash: Buffer.from(`hash-${i}`).toString('hex'),
473
- content: JSON.stringify({ test: `data-${i}` })
474
- }
475
- ]);
476
- }
477
-
478
- interface ConcurrencyResult {
479
- totalBatches: number;
480
- totalItems: number;
481
- allSuccessful: number;
482
- allFailed: number;
483
- duration: number;
484
- avgBatchDuration: number;
485
- }
486
-
487
- async function runConcurrentBatches(
488
- batchCount: number,
489
- itemsPerBatch: number
490
- ): Promise<ConcurrencyResult> {
491
- const config: OriginalsConfig = {
492
- network: 'regtest',
493
- defaultKeyType: 'ES256K',
494
- ordinalsProvider: new OrdMockProvider(),
495
- enableLogging: false
496
- };
497
-
498
- const startTime = Date.now();
499
-
500
- const batches = Array.from({ length: batchCount }, () => {
501
- const sdk = OriginalsSDK.create(config);
502
- const resourcesList = createTestResourcesList(itemsPerBatch);
503
- return sdk.lifecycle.batchCreateAssets(resourcesList, {
504
- maxConcurrent: 1,
505
- continueOnError: true
506
- });
507
- });
508
-
509
- const results = await Promise.all(batches);
510
- const duration = Date.now() - startTime;
511
-
512
- const allSuccessful = results.reduce((sum, r) => sum + r.successful.length, 0);
513
- const allFailed = results.reduce((sum, r) => sum + r.failed.length, 0);
514
- const avgBatchDuration = results.reduce((sum, r) => sum + r.totalDuration, 0) / batchCount;
515
-
516
- return {
517
- totalBatches: batchCount,
518
- totalItems: batchCount * itemsPerBatch,
519
- allSuccessful,
520
- allFailed,
521
- duration,
522
- avgBatchDuration
523
- };
524
- }
525
-
526
- function logPerformanceMetrics(
527
- testName: string,
528
- itemCount: number,
529
- duration: number,
530
- result: any
531
- ): void {
532
- const throughput = (itemCount / duration) * 1000; // items per second
533
-
534
- console.log(`\n[PERFORMANCE] ${testName}:`);
535
- console.log(` - Total items: ${itemCount}`);
536
- console.log(` - Successful: ${result.successful.length}`);
537
- console.log(` - Failed: ${result.failed.length}`);
538
- console.log(` - Duration: ${duration}ms`);
539
- console.log(` - Throughput: ${throughput.toFixed(2)} items/sec`);
540
- console.log(` - Avg time per item: ${(duration / itemCount).toFixed(2)}ms`);
541
- }
542
-
543
- function logConcurrencyMetrics(
544
- testName: string,
545
- batchCount: number,
546
- itemsPerBatch: number,
547
- result: ConcurrencyResult
548
- ): void {
549
- const throughput = (result.totalItems / result.duration) * 1000;
550
-
551
- console.log(`\n[CONCURRENCY] ${testName}:`);
552
- console.log(` - Concurrent batches: ${batchCount}`);
553
- console.log(` - Items per batch: ${itemsPerBatch}`);
554
- console.log(` - Total items: ${result.totalItems}`);
555
- console.log(` - Successful: ${result.allSuccessful}`);
556
- console.log(` - Failed: ${result.allFailed}`);
557
- console.log(` - Total duration: ${result.duration}ms`);
558
- console.log(` - Avg batch duration: ${result.avgBatchDuration.toFixed(2)}ms`);
559
- console.log(` - Overall throughput: ${throughput.toFixed(2)} items/sec`);
560
- }
561
-
562
- console.log('\n=== Batch Operations Stress Test Suite Complete ===\n');
563
- console.log('This test suite validates performance and stability under:');
564
- console.log('- Varying batch sizes (10 to 10,000 assets)');
565
- console.log('- High concurrency (up to 100 concurrent batches)');
566
- console.log('- Batch inscription modes (single tx vs individual txs)');
567
- console.log('- Migration operations under load');
568
- console.log('- Error recovery and retry mechanisms');
569
- console.log('- Memory and resource management');
570
- console.log('- Throughput benchmarks');
571
- console.log('\n=================================================\n');
@@ -1,40 +0,0 @@
1
- import { describe, test, expect } from 'bun:test';
2
- import { FeeOracleMock } from '../../../src/adapters/FeeOracleMock';
3
-
4
- describe('FeeOracleMock', () => {
5
- test('constructor initializes with default fee rate', async () => {
6
- const oracle = new FeeOracleMock();
7
- const rate = await oracle.estimateFeeRate();
8
- expect(rate).toBe(7);
9
- });
10
-
11
- test('constructor accepts custom fee rate', async () => {
12
- const oracle = new FeeOracleMock(10);
13
- const rate = await oracle.estimateFeeRate();
14
- expect(rate).toBe(10);
15
- });
16
-
17
- test('estimateFeeRate returns rate for 1 block', async () => {
18
- const oracle = new FeeOracleMock(7);
19
- const rate = await oracle.estimateFeeRate(1);
20
- expect(rate).toBe(7);
21
- });
22
-
23
- test('estimateFeeRate decreases for higher target blocks', async () => {
24
- const oracle = new FeeOracleMock(7);
25
- const rate = await oracle.estimateFeeRate(3);
26
- expect(rate).toBe(5); // 7 - (3 - 1) = 5
27
- });
28
-
29
- test('estimateFeeRate returns minimum of 1', async () => {
30
- const oracle = new FeeOracleMock(2);
31
- const rate = await oracle.estimateFeeRate(10);
32
- expect(rate).toBe(1); // Math.max(1, 2 - 9) = 1
33
- });
34
-
35
- test('estimateFeeRate works without target blocks parameter', async () => {
36
- const oracle = new FeeOracleMock(5);
37
- const rate = await oracle.estimateFeeRate();
38
- expect(rate).toBe(5);
39
- });
40
- });