@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.
- package/package.json +4 -1
- package/.eslintrc.json +0 -33
- package/src/adapters/FeeOracleMock.ts +0 -9
- package/src/adapters/index.ts +0 -5
- package/src/adapters/providers/OrdHttpProvider.ts +0 -126
- package/src/adapters/providers/OrdMockProvider.ts +0 -101
- package/src/adapters/types.ts +0 -66
- package/src/bitcoin/BitcoinManager.ts +0 -330
- package/src/bitcoin/BroadcastClient.ts +0 -54
- package/src/bitcoin/OrdinalsClient.ts +0 -119
- package/src/bitcoin/PSBTBuilder.ts +0 -106
- package/src/bitcoin/fee-calculation.ts +0 -38
- package/src/bitcoin/providers/OrdNodeProvider.ts +0 -92
- package/src/bitcoin/providers/OrdinalsProvider.ts +0 -56
- package/src/bitcoin/providers/types.ts +0 -59
- package/src/bitcoin/transactions/commit.ts +0 -465
- package/src/bitcoin/transactions/index.ts +0 -13
- package/src/bitcoin/transfer.ts +0 -43
- package/src/bitcoin/utxo-selection.ts +0 -322
- package/src/bitcoin/utxo.ts +0 -113
- package/src/contexts/credentials-v1.json +0 -237
- package/src/contexts/credentials-v2-examples.json +0 -5
- package/src/contexts/credentials-v2.json +0 -340
- package/src/contexts/credentials.json +0 -237
- package/src/contexts/data-integrity-v2.json +0 -81
- package/src/contexts/dids.json +0 -58
- package/src/contexts/ed255192020.json +0 -93
- package/src/contexts/ordinals-plus.json +0 -23
- package/src/contexts/originals.json +0 -22
- package/src/core/OriginalsSDK.ts +0 -416
- package/src/crypto/Multikey.ts +0 -194
- package/src/crypto/Signer.ts +0 -254
- package/src/crypto/noble-init.ts +0 -121
- package/src/did/BtcoDidResolver.ts +0 -227
- package/src/did/DIDManager.ts +0 -694
- package/src/did/Ed25519Verifier.ts +0 -68
- package/src/did/KeyManager.ts +0 -236
- package/src/did/WebVHManager.ts +0 -498
- package/src/did/createBtcoDidDocument.ts +0 -59
- package/src/did/providers/OrdinalsClientProviderAdapter.ts +0 -68
- package/src/events/EventEmitter.ts +0 -222
- package/src/events/index.ts +0 -19
- package/src/events/types.ts +0 -331
- package/src/examples/basic-usage.ts +0 -78
- package/src/examples/create-module-original.ts +0 -435
- package/src/examples/full-lifecycle-flow.ts +0 -514
- package/src/examples/run.ts +0 -60
- package/src/index.ts +0 -150
- package/src/kinds/KindRegistry.ts +0 -290
- package/src/kinds/index.ts +0 -74
- package/src/kinds/types.ts +0 -470
- package/src/kinds/validators/AgentValidator.ts +0 -257
- package/src/kinds/validators/AppValidator.ts +0 -211
- package/src/kinds/validators/DatasetValidator.ts +0 -242
- package/src/kinds/validators/DocumentValidator.ts +0 -311
- package/src/kinds/validators/MediaValidator.ts +0 -269
- package/src/kinds/validators/ModuleValidator.ts +0 -225
- package/src/kinds/validators/base.ts +0 -276
- package/src/kinds/validators/index.ts +0 -12
- package/src/lifecycle/BatchOperations.ts +0 -373
- package/src/lifecycle/LifecycleManager.ts +0 -2126
- package/src/lifecycle/OriginalsAsset.ts +0 -524
- package/src/lifecycle/ProvenanceQuery.ts +0 -280
- package/src/lifecycle/ResourceVersioning.ts +0 -163
- package/src/migration/MigrationManager.ts +0 -527
- package/src/migration/audit/AuditLogger.ts +0 -176
- package/src/migration/checkpoint/CheckpointManager.ts +0 -112
- package/src/migration/checkpoint/CheckpointStorage.ts +0 -101
- package/src/migration/index.ts +0 -33
- package/src/migration/operations/BaseMigration.ts +0 -126
- package/src/migration/operations/PeerToBtcoMigration.ts +0 -105
- package/src/migration/operations/PeerToWebvhMigration.ts +0 -62
- package/src/migration/operations/WebvhToBtcoMigration.ts +0 -105
- package/src/migration/rollback/RollbackManager.ts +0 -170
- package/src/migration/state/StateMachine.ts +0 -92
- package/src/migration/state/StateTracker.ts +0 -156
- package/src/migration/types.ts +0 -344
- package/src/migration/validation/BitcoinValidator.ts +0 -107
- package/src/migration/validation/CredentialValidator.ts +0 -62
- package/src/migration/validation/DIDCompatibilityValidator.ts +0 -151
- package/src/migration/validation/LifecycleValidator.ts +0 -64
- package/src/migration/validation/StorageValidator.ts +0 -79
- package/src/migration/validation/ValidationPipeline.ts +0 -213
- package/src/resources/ResourceManager.ts +0 -655
- package/src/resources/index.ts +0 -21
- package/src/resources/types.ts +0 -202
- package/src/storage/LocalStorageAdapter.ts +0 -61
- package/src/storage/MemoryStorageAdapter.ts +0 -29
- package/src/storage/StorageAdapter.ts +0 -25
- package/src/storage/index.ts +0 -3
- package/src/types/bitcoin.ts +0 -98
- package/src/types/common.ts +0 -92
- package/src/types/credentials.ts +0 -88
- package/src/types/did.ts +0 -31
- package/src/types/external-shims.d.ts +0 -53
- package/src/types/index.ts +0 -7
- package/src/types/network.ts +0 -175
- package/src/utils/EventLogger.ts +0 -298
- package/src/utils/Logger.ts +0 -322
- package/src/utils/MetricsCollector.ts +0 -358
- package/src/utils/bitcoin-address.ts +0 -130
- package/src/utils/cbor.ts +0 -12
- package/src/utils/encoding.ts +0 -127
- package/src/utils/hash.ts +0 -6
- package/src/utils/retry.ts +0 -46
- package/src/utils/satoshi-validation.ts +0 -196
- package/src/utils/serialization.ts +0 -96
- package/src/utils/telemetry.ts +0 -40
- package/src/utils/validation.ts +0 -119
- package/src/vc/CredentialManager.ts +0 -918
- package/src/vc/Issuer.ts +0 -100
- package/src/vc/Verifier.ts +0 -47
- package/src/vc/cryptosuites/bbs.ts +0 -253
- package/src/vc/cryptosuites/bbsSimple.ts +0 -21
- package/src/vc/cryptosuites/eddsa.ts +0 -99
- package/src/vc/documentLoader.ts +0 -67
- package/src/vc/proofs/data-integrity.ts +0 -33
- package/src/vc/utils/jsonld.ts +0 -18
- package/tests/__mocks__/bbs-signatures.js +0 -17
- package/tests/__mocks__/mf-base58.js +0 -24
- package/tests/fixtures/did-documents.ts +0 -247
- package/tests/index.test.ts +0 -21
- package/tests/integration/BatchOperations.test.ts +0 -531
- package/tests/integration/CompleteLifecycle.e2e.test.ts +0 -735
- package/tests/integration/CredentialManager.test.ts +0 -42
- package/tests/integration/DIDManager.test.ts +0 -41
- package/tests/integration/DidPeerToWebVhFlow.test.ts +0 -351
- package/tests/integration/Events.test.ts +0 -435
- package/tests/integration/Lifecycle.transfer.btco.integration.test.ts +0 -25
- package/tests/integration/LifecycleManager.test.ts +0 -21
- package/tests/integration/MultikeyFlow.test.ts +0 -52
- package/tests/integration/TelemetryIntegration.test.ts +0 -395
- package/tests/integration/WebVhPublish.test.ts +0 -48
- package/tests/integration/createTypedOriginal.test.ts +0 -379
- package/tests/integration/migration/peer-to-webvh.test.ts +0 -172
- package/tests/manual/test-commit-creation.ts +0 -323
- package/tests/mocks/MockKeyStore.ts +0 -38
- package/tests/mocks/adapters/MemoryStorageAdapter.ts +0 -24
- package/tests/mocks/adapters/MockFeeOracle.ts +0 -11
- package/tests/mocks/adapters/MockOrdinalsProvider.ts +0 -76
- package/tests/mocks/adapters/OrdMockProvider.test.ts +0 -176
- package/tests/mocks/adapters/index.ts +0 -6
- package/tests/performance/BatchOperations.perf.test.ts +0 -403
- package/tests/performance/logging.perf.test.ts +0 -336
- package/tests/sdk.test.ts +0 -43
- package/tests/security/bitcoin-penetration-tests.test.ts +0 -622
- package/tests/setup.bun.ts +0 -69
- package/tests/setup.jest.ts +0 -23
- package/tests/stress/batch-operations-stress.test.ts +0 -571
- package/tests/unit/adapters/FeeOracleMock.test.ts +0 -40
- package/tests/unit/bitcoin/BitcoinManager.test.ts +0 -293
- package/tests/unit/bitcoin/BroadcastClient.test.ts +0 -52
- package/tests/unit/bitcoin/OrdNodeProvider.test.ts +0 -53
- package/tests/unit/bitcoin/OrdinalsClient.test.ts +0 -381
- package/tests/unit/bitcoin/OrdinalsClientProvider.test.ts +0 -102
- package/tests/unit/bitcoin/PSBTBuilder.test.ts +0 -84
- package/tests/unit/bitcoin/fee-calculation.test.ts +0 -261
- package/tests/unit/bitcoin/transactions/commit.test.ts +0 -649
- package/tests/unit/bitcoin/transfer.test.ts +0 -31
- package/tests/unit/bitcoin/utxo-selection-new.test.ts +0 -502
- package/tests/unit/bitcoin/utxo.more.test.ts +0 -39
- package/tests/unit/bitcoin/utxo.selection.test.ts +0 -38
- package/tests/unit/core/OriginalsSDK.test.ts +0 -152
- package/tests/unit/crypto/Multikey.test.ts +0 -206
- package/tests/unit/crypto/Signer.test.ts +0 -408
- package/tests/unit/did/BtcoDidResolver.test.ts +0 -611
- package/tests/unit/did/DIDManager.more.test.ts +0 -43
- package/tests/unit/did/DIDManager.test.ts +0 -185
- package/tests/unit/did/Ed25519Verifier.test.ts +0 -160
- package/tests/unit/did/KeyManager.test.ts +0 -452
- package/tests/unit/did/OrdinalsClientProviderAdapter.test.ts +0 -45
- package/tests/unit/did/WebVHManager.test.ts +0 -435
- package/tests/unit/did/createBtcoDidDocument.test.ts +0 -67
- package/tests/unit/did/providers/OrdinalsClientProviderAdapter.test.ts +0 -159
- package/tests/unit/events/EventEmitter.test.ts +0 -407
- package/tests/unit/kinds/KindRegistry.test.ts +0 -329
- package/tests/unit/kinds/types.test.ts +0 -409
- package/tests/unit/kinds/validators.test.ts +0 -651
- package/tests/unit/lifecycle/BatchOperations.test.ts +0 -527
- package/tests/unit/lifecycle/LifecycleManager.cleanapi.test.ts +0 -441
- package/tests/unit/lifecycle/LifecycleManager.keymanagement.test.ts +0 -312
- package/tests/unit/lifecycle/LifecycleManager.prov.test.ts +0 -18
- package/tests/unit/lifecycle/LifecycleManager.test.ts +0 -213
- package/tests/unit/lifecycle/LifecycleManager.transfer.unit.test.ts +0 -30
- package/tests/unit/lifecycle/OriginalsAsset.test.ts +0 -176
- package/tests/unit/lifecycle/ProvenanceQuery.test.ts +0 -577
- package/tests/unit/lifecycle/ResourceVersioning.test.ts +0 -651
- package/tests/unit/resources/ResourceManager.test.ts +0 -740
- package/tests/unit/storage/MemoryStorageAdapter.test.ts +0 -93
- package/tests/unit/types/network.test.ts +0 -255
- package/tests/unit/utils/EventIntegration.test.ts +0 -384
- package/tests/unit/utils/Logger.test.ts +0 -473
- package/tests/unit/utils/MetricsCollector.test.ts +0 -358
- package/tests/unit/utils/bitcoin-address.test.ts +0 -250
- package/tests/unit/utils/cbor.test.ts +0 -35
- package/tests/unit/utils/encoding.test.ts +0 -318
- package/tests/unit/utils/hash.test.ts +0 -12
- package/tests/unit/utils/retry.test.ts +0 -100
- package/tests/unit/utils/satoshi-validation.test.ts +0 -354
- package/tests/unit/utils/serialization.test.ts +0 -124
- package/tests/unit/utils/telemetry.test.ts +0 -52
- package/tests/unit/utils/validation.test.ts +0 -141
- package/tests/unit/vc/CredentialManager.helpers.test.ts +0 -527
- package/tests/unit/vc/CredentialManager.test.ts +0 -487
- package/tests/unit/vc/Issuer.test.ts +0 -107
- package/tests/unit/vc/Verifier.test.ts +0 -525
- package/tests/unit/vc/bbs.test.ts +0 -282
- package/tests/unit/vc/cryptosuites/eddsa.test.ts +0 -398
- package/tests/unit/vc/documentLoader.test.ts +0 -121
- package/tests/unit/vc/proofs/data-integrity.test.ts +0 -24
- package/tsconfig.json +0 -31
- package/tsconfig.test.json +0 -15
package/src/utils/Logger.ts
DELETED
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced Logger for Originals SDK
|
|
3
|
-
*
|
|
4
|
-
* Features:
|
|
5
|
-
* - Multiple log levels (debug, info, warn, error)
|
|
6
|
-
* - Child loggers with hierarchical context
|
|
7
|
-
* - Performance timing with startTimer
|
|
8
|
-
* - Multiple output destinations
|
|
9
|
-
* - Data sanitization for sensitive information
|
|
10
|
-
* - Async-safe operations
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { OriginalsConfig } from '../types';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Log level type
|
|
17
|
-
*/
|
|
18
|
-
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Structured log entry
|
|
22
|
-
*/
|
|
23
|
-
export interface LogEntry {
|
|
24
|
-
timestamp: string;
|
|
25
|
-
level: LogLevel;
|
|
26
|
-
context: string;
|
|
27
|
-
message: string;
|
|
28
|
-
data?: any;
|
|
29
|
-
duration?: number; // For performance tracking
|
|
30
|
-
traceId?: string; // For request correlation
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Log output interface for custom outputs
|
|
35
|
-
*/
|
|
36
|
-
export interface LogOutput {
|
|
37
|
-
write(entry: LogEntry): void | Promise<void>;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Console log output implementation
|
|
42
|
-
*/
|
|
43
|
-
export class ConsoleLogOutput implements LogOutput {
|
|
44
|
-
write(entry: LogEntry): void {
|
|
45
|
-
const timestamp = entry.timestamp;
|
|
46
|
-
const level = entry.level.toUpperCase().padEnd(5);
|
|
47
|
-
const context = entry.context;
|
|
48
|
-
const message = entry.message;
|
|
49
|
-
const durationStr = entry.duration !== undefined ? ` (${entry.duration.toFixed(2)}ms)` : '';
|
|
50
|
-
const dataStr = entry.data ? ` ${JSON.stringify(entry.data)}` : '';
|
|
51
|
-
|
|
52
|
-
const logMessage = `[${timestamp}] ${level} [${context}] ${message}${durationStr}${dataStr}`;
|
|
53
|
-
|
|
54
|
-
switch (entry.level) {
|
|
55
|
-
case 'debug':
|
|
56
|
-
console.debug(logMessage);
|
|
57
|
-
break;
|
|
58
|
-
case 'info':
|
|
59
|
-
console.info(logMessage);
|
|
60
|
-
break;
|
|
61
|
-
case 'warn':
|
|
62
|
-
console.warn(logMessage);
|
|
63
|
-
break;
|
|
64
|
-
case 'error':
|
|
65
|
-
console.error(logMessage);
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* File log output implementation (async)
|
|
73
|
-
*/
|
|
74
|
-
export class FileLogOutput implements LogOutput {
|
|
75
|
-
private buffer: string[] = [];
|
|
76
|
-
private flushTimeout: any = null;
|
|
77
|
-
private readonly flushInterval = 1000; // Flush every 1 second
|
|
78
|
-
|
|
79
|
-
constructor(private filePath: string) {}
|
|
80
|
-
|
|
81
|
-
async write(entry: LogEntry): Promise<void> {
|
|
82
|
-
// Format as JSON line
|
|
83
|
-
const line = JSON.stringify(entry) + '\n';
|
|
84
|
-
this.buffer.push(line);
|
|
85
|
-
|
|
86
|
-
// Schedule flush
|
|
87
|
-
if (!this.flushTimeout) {
|
|
88
|
-
this.flushTimeout = setTimeout(() => this.flush(), this.flushInterval);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private async flush(): Promise<void> {
|
|
93
|
-
if (this.buffer.length === 0) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const lines = this.buffer.join('');
|
|
98
|
-
this.buffer = [];
|
|
99
|
-
this.flushTimeout = null;
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
// Use Bun's file API for efficient file writing
|
|
103
|
-
const file = Bun.file(this.filePath);
|
|
104
|
-
const exists = await file.exists();
|
|
105
|
-
|
|
106
|
-
if (exists) {
|
|
107
|
-
// Append to existing file
|
|
108
|
-
const content = await file.text();
|
|
109
|
-
await Bun.write(this.filePath, content + lines);
|
|
110
|
-
} else {
|
|
111
|
-
// Create new file
|
|
112
|
-
await Bun.write(this.filePath, lines);
|
|
113
|
-
}
|
|
114
|
-
} catch (err) {
|
|
115
|
-
// Fallback to console on file write error
|
|
116
|
-
console.error('Failed to write log file:', err);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Main Logger class
|
|
123
|
-
*/
|
|
124
|
-
export class Logger {
|
|
125
|
-
private outputs: LogOutput[] = [];
|
|
126
|
-
private minLevel: LogLevel;
|
|
127
|
-
private includeTimestamps: boolean;
|
|
128
|
-
private includeContext: boolean;
|
|
129
|
-
private sanitizeLogs: boolean;
|
|
130
|
-
|
|
131
|
-
// Log level priorities
|
|
132
|
-
private static readonly LEVEL_PRIORITY: Record<LogLevel, number> = {
|
|
133
|
-
debug: 0,
|
|
134
|
-
info: 1,
|
|
135
|
-
warn: 2,
|
|
136
|
-
error: 3
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
constructor(
|
|
140
|
-
private context: string,
|
|
141
|
-
config: OriginalsConfig
|
|
142
|
-
) {
|
|
143
|
-
this.minLevel = config.logging?.level || 'info';
|
|
144
|
-
this.includeTimestamps = config.logging?.includeTimestamps !== false;
|
|
145
|
-
this.includeContext = config.logging?.includeContext !== false;
|
|
146
|
-
this.sanitizeLogs = config.logging?.sanitizeLogs !== false;
|
|
147
|
-
|
|
148
|
-
// Set up default outputs
|
|
149
|
-
if (config.logging?.outputs && config.logging.outputs.length > 0) {
|
|
150
|
-
this.outputs = [...config.logging.outputs];
|
|
151
|
-
} else {
|
|
152
|
-
// Default to console output
|
|
153
|
-
this.outputs = [new ConsoleLogOutput()];
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Log a debug message
|
|
159
|
-
*/
|
|
160
|
-
debug(message: string, data?: any): void {
|
|
161
|
-
this.log('debug', message, data);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Log an info message
|
|
166
|
-
*/
|
|
167
|
-
info(message: string, data?: any): void {
|
|
168
|
-
this.log('info', message, data);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Log a warning message
|
|
173
|
-
*/
|
|
174
|
-
warn(message: string, data?: any): void {
|
|
175
|
-
this.log('warn', message, data);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Log an error message
|
|
180
|
-
*/
|
|
181
|
-
error(message: string, error?: Error, data?: any): void {
|
|
182
|
-
const errorData = error ? {
|
|
183
|
-
...data,
|
|
184
|
-
error: {
|
|
185
|
-
name: error.name,
|
|
186
|
-
message: error.message,
|
|
187
|
-
stack: error.stack
|
|
188
|
-
}
|
|
189
|
-
} : data;
|
|
190
|
-
|
|
191
|
-
this.log('error', message, errorData);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Start a timer for performance tracking
|
|
196
|
-
* Returns a function that stops the timer and logs the duration
|
|
197
|
-
*/
|
|
198
|
-
startTimer(operation: string): () => void {
|
|
199
|
-
const startTime = performance.now();
|
|
200
|
-
|
|
201
|
-
return () => {
|
|
202
|
-
const duration = performance.now() - startTime;
|
|
203
|
-
this.log('debug', `${operation} completed`, undefined, duration);
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Create a child logger with nested context
|
|
209
|
-
*/
|
|
210
|
-
child(childContext: string): Logger {
|
|
211
|
-
const newLogger = Object.create(Logger.prototype);
|
|
212
|
-
newLogger.context = `${this.context}:${childContext}`;
|
|
213
|
-
newLogger.outputs = this.outputs;
|
|
214
|
-
newLogger.minLevel = this.minLevel;
|
|
215
|
-
newLogger.includeTimestamps = this.includeTimestamps;
|
|
216
|
-
newLogger.includeContext = this.includeContext;
|
|
217
|
-
newLogger.sanitizeLogs = this.sanitizeLogs;
|
|
218
|
-
return newLogger;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Set a single output (replaces existing outputs)
|
|
223
|
-
*/
|
|
224
|
-
setOutput(output: LogOutput): void {
|
|
225
|
-
this.outputs = [output];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Add an output to the existing outputs
|
|
230
|
-
*/
|
|
231
|
-
addOutput(output: LogOutput): void {
|
|
232
|
-
this.outputs.push(output);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Internal log method
|
|
237
|
-
*/
|
|
238
|
-
private log(level: LogLevel, message: string, data?: any, duration?: number): void {
|
|
239
|
-
// Check if we should log this level
|
|
240
|
-
if (Logger.LEVEL_PRIORITY[level] < Logger.LEVEL_PRIORITY[this.minLevel]) {
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Sanitize data if needed
|
|
245
|
-
const sanitizedData = this.sanitizeLogs ? this.sanitize(data) : data;
|
|
246
|
-
|
|
247
|
-
// Create log entry
|
|
248
|
-
const entry: LogEntry = {
|
|
249
|
-
timestamp: this.includeTimestamps ? new Date().toISOString() : '',
|
|
250
|
-
level,
|
|
251
|
-
context: this.includeContext ? this.context : '',
|
|
252
|
-
message,
|
|
253
|
-
data: sanitizedData,
|
|
254
|
-
duration
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
// Write to all outputs (fire and forget for async outputs)
|
|
258
|
-
for (const output of this.outputs) {
|
|
259
|
-
try {
|
|
260
|
-
const result = output.write(entry);
|
|
261
|
-
// If result is a promise, don't await it (non-blocking)
|
|
262
|
-
if (result instanceof Promise) {
|
|
263
|
-
result.catch(err => {
|
|
264
|
-
// Silently fail for async outputs to avoid blocking
|
|
265
|
-
if (typeof console !== 'undefined' && console.error) {
|
|
266
|
-
console.error('Log output error:', err);
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
} catch (err) {
|
|
271
|
-
// Continue even if one output fails
|
|
272
|
-
if (typeof console !== 'undefined' && console.error) {
|
|
273
|
-
console.error('Log output error:', err);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Sanitize sensitive data from logs
|
|
281
|
-
*/
|
|
282
|
-
private sanitize(data: any): any {
|
|
283
|
-
if (!data) {
|
|
284
|
-
return data;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Handle arrays
|
|
288
|
-
if (Array.isArray(data)) {
|
|
289
|
-
return data.map(item => this.sanitize(item));
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Handle objects
|
|
293
|
-
if (typeof data === 'object') {
|
|
294
|
-
const sanitized: any = {};
|
|
295
|
-
|
|
296
|
-
for (const [key, value] of Object.entries(data)) {
|
|
297
|
-
const lowerKey = key.toLowerCase();
|
|
298
|
-
|
|
299
|
-
// Sanitize sensitive keys
|
|
300
|
-
if (
|
|
301
|
-
lowerKey.includes('private') ||
|
|
302
|
-
lowerKey.includes('key') ||
|
|
303
|
-
lowerKey.includes('secret') ||
|
|
304
|
-
lowerKey.includes('password') ||
|
|
305
|
-
lowerKey.includes('token') ||
|
|
306
|
-
lowerKey.includes('credential')
|
|
307
|
-
) {
|
|
308
|
-
sanitized[key] = '[REDACTED]';
|
|
309
|
-
} else {
|
|
310
|
-
// Recursively sanitize nested objects
|
|
311
|
-
sanitized[key] = this.sanitize(value);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return sanitized;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Return primitive values as-is
|
|
319
|
-
return data;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Metrics Collector for Originals SDK
|
|
3
|
-
*
|
|
4
|
-
* Features:
|
|
5
|
-
* - Track operation counts and performance
|
|
6
|
-
* - Asset lifecycle metrics (created, migrated, transferred)
|
|
7
|
-
* - Error tracking by error code
|
|
8
|
-
* - Cache statistics (optional)
|
|
9
|
-
* - Export in JSON and Prometheus formats
|
|
10
|
-
* - Memory-efficient storage
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { LayerType } from '../types';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Operation-specific metrics
|
|
17
|
-
*/
|
|
18
|
-
export interface OperationMetrics {
|
|
19
|
-
count: number;
|
|
20
|
-
totalTime: number;
|
|
21
|
-
avgTime: number;
|
|
22
|
-
minTime: number;
|
|
23
|
-
maxTime: number;
|
|
24
|
-
errorCount: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Complete metrics snapshot
|
|
29
|
-
*/
|
|
30
|
-
export interface Metrics {
|
|
31
|
-
// Asset operations
|
|
32
|
-
assetsCreated: number;
|
|
33
|
-
assetsMigrated: Record<string, number>; // by layer transition (e.g., "peer→webvh": 5)
|
|
34
|
-
assetsTransferred: number;
|
|
35
|
-
|
|
36
|
-
// Operation performance
|
|
37
|
-
operationTimes: Record<string, OperationMetrics>;
|
|
38
|
-
|
|
39
|
-
// Error tracking
|
|
40
|
-
errors: Record<string, number>; // by error code
|
|
41
|
-
|
|
42
|
-
// Cache statistics (if caching is implemented)
|
|
43
|
-
cacheStats?: {
|
|
44
|
-
hits: number;
|
|
45
|
-
misses: number;
|
|
46
|
-
hitRate: number;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
// System metrics
|
|
50
|
-
startTime: string;
|
|
51
|
-
uptime: number; // milliseconds
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* MetricsCollector class
|
|
56
|
-
*/
|
|
57
|
-
export class MetricsCollector {
|
|
58
|
-
private assetsCreatedCount = 0;
|
|
59
|
-
private assetsMigratedMap: Map<string, number> = new Map();
|
|
60
|
-
private assetsTransferredCount = 0;
|
|
61
|
-
|
|
62
|
-
private operationMetrics: Map<string, {
|
|
63
|
-
count: number;
|
|
64
|
-
totalTime: number;
|
|
65
|
-
minTime: number;
|
|
66
|
-
maxTime: number;
|
|
67
|
-
errorCount: number;
|
|
68
|
-
}> = new Map();
|
|
69
|
-
|
|
70
|
-
private errorCounts: Map<string, number> = new Map();
|
|
71
|
-
|
|
72
|
-
private cacheHits = 0;
|
|
73
|
-
private cacheMisses = 0;
|
|
74
|
-
|
|
75
|
-
private readonly startTime: string;
|
|
76
|
-
|
|
77
|
-
constructor() {
|
|
78
|
-
this.startTime = new Date().toISOString();
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Record an operation with timing and success status
|
|
83
|
-
*/
|
|
84
|
-
recordOperation(operation: string, duration: number, success: boolean): void {
|
|
85
|
-
if (!this.operationMetrics.has(operation)) {
|
|
86
|
-
this.operationMetrics.set(operation, {
|
|
87
|
-
count: 0,
|
|
88
|
-
totalTime: 0,
|
|
89
|
-
minTime: Infinity,
|
|
90
|
-
maxTime: -Infinity,
|
|
91
|
-
errorCount: 0
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const metrics = this.operationMetrics.get(operation)!;
|
|
96
|
-
metrics.count++;
|
|
97
|
-
metrics.totalTime += duration;
|
|
98
|
-
metrics.minTime = Math.min(metrics.minTime, duration);
|
|
99
|
-
metrics.maxTime = Math.max(metrics.maxTime, duration);
|
|
100
|
-
|
|
101
|
-
if (!success) {
|
|
102
|
-
metrics.errorCount++;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Start tracking an operation, returns completion function
|
|
108
|
-
*/
|
|
109
|
-
startOperation(operation: string): () => void {
|
|
110
|
-
const startTime = performance.now();
|
|
111
|
-
|
|
112
|
-
return (success: boolean = true) => {
|
|
113
|
-
const duration = performance.now() - startTime;
|
|
114
|
-
this.recordOperation(operation, duration, success);
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Record an asset creation
|
|
120
|
-
*/
|
|
121
|
-
recordAssetCreated(): void {
|
|
122
|
-
this.assetsCreatedCount++;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Record an asset migration between layers
|
|
127
|
-
*/
|
|
128
|
-
recordMigration(from: LayerType, to: LayerType): void {
|
|
129
|
-
// Create transition key
|
|
130
|
-
const fromShort = from.split(':')[1]; // "peer", "webvh", "btco"
|
|
131
|
-
const toShort = to.split(':')[1];
|
|
132
|
-
const transitionKey = `${fromShort}→${toShort}`;
|
|
133
|
-
|
|
134
|
-
const current = this.assetsMigratedMap.get(transitionKey) || 0;
|
|
135
|
-
this.assetsMigratedMap.set(transitionKey, current + 1);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Record an asset transfer
|
|
140
|
-
*/
|
|
141
|
-
recordTransfer(): void {
|
|
142
|
-
this.assetsTransferredCount++;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Record an error by error code
|
|
147
|
-
*/
|
|
148
|
-
recordError(code: string, operation?: string): void {
|
|
149
|
-
// Track error by code
|
|
150
|
-
const current = this.errorCounts.get(code) || 0;
|
|
151
|
-
this.errorCounts.set(code, current + 1);
|
|
152
|
-
|
|
153
|
-
// If operation is provided, increment its error count
|
|
154
|
-
if (operation && this.operationMetrics.has(operation)) {
|
|
155
|
-
this.operationMetrics.get(operation)!.errorCount++;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Record a cache hit
|
|
161
|
-
*/
|
|
162
|
-
recordCacheHit(): void {
|
|
163
|
-
this.cacheHits++;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Record a cache miss
|
|
168
|
-
*/
|
|
169
|
-
recordCacheMiss(): void {
|
|
170
|
-
this.cacheMisses++;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Get a snapshot of all metrics
|
|
175
|
-
*/
|
|
176
|
-
getMetrics(): Metrics {
|
|
177
|
-
const operationTimes: Record<string, OperationMetrics> = {};
|
|
178
|
-
|
|
179
|
-
for (const [operation, metrics] of this.operationMetrics.entries()) {
|
|
180
|
-
operationTimes[operation] = {
|
|
181
|
-
count: metrics.count,
|
|
182
|
-
totalTime: metrics.totalTime,
|
|
183
|
-
avgTime: metrics.count > 0 ? metrics.totalTime / metrics.count : 0,
|
|
184
|
-
minTime: metrics.minTime === Infinity ? 0 : metrics.minTime,
|
|
185
|
-
maxTime: metrics.maxTime === -Infinity ? 0 : metrics.maxTime,
|
|
186
|
-
errorCount: metrics.errorCount
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const assetsMigrated: Record<string, number> = {};
|
|
191
|
-
for (const [key, count] of this.assetsMigratedMap.entries()) {
|
|
192
|
-
assetsMigrated[key] = count;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const errors: Record<string, number> = {};
|
|
196
|
-
for (const [code, count] of this.errorCounts.entries()) {
|
|
197
|
-
errors[code] = count;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const totalCacheRequests = this.cacheHits + this.cacheMisses;
|
|
201
|
-
const cacheStats = totalCacheRequests > 0 ? {
|
|
202
|
-
hits: this.cacheHits,
|
|
203
|
-
misses: this.cacheMisses,
|
|
204
|
-
hitRate: this.cacheHits / totalCacheRequests
|
|
205
|
-
} : undefined;
|
|
206
|
-
|
|
207
|
-
return {
|
|
208
|
-
assetsCreated: this.assetsCreatedCount,
|
|
209
|
-
assetsMigrated,
|
|
210
|
-
assetsTransferred: this.assetsTransferredCount,
|
|
211
|
-
operationTimes,
|
|
212
|
-
errors,
|
|
213
|
-
cacheStats,
|
|
214
|
-
startTime: this.startTime,
|
|
215
|
-
uptime: Date.now() - new Date(this.startTime).getTime()
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Get metrics for a specific operation
|
|
221
|
-
*/
|
|
222
|
-
getOperationMetrics(operation: string): OperationMetrics | null {
|
|
223
|
-
const metrics = this.operationMetrics.get(operation);
|
|
224
|
-
|
|
225
|
-
if (!metrics) {
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return {
|
|
230
|
-
count: metrics.count,
|
|
231
|
-
totalTime: metrics.totalTime,
|
|
232
|
-
avgTime: metrics.count > 0 ? metrics.totalTime / metrics.count : 0,
|
|
233
|
-
minTime: metrics.minTime === Infinity ? 0 : metrics.minTime,
|
|
234
|
-
maxTime: metrics.maxTime === -Infinity ? 0 : metrics.maxTime,
|
|
235
|
-
errorCount: metrics.errorCount
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Reset all metrics
|
|
241
|
-
*/
|
|
242
|
-
reset(): void {
|
|
243
|
-
this.assetsCreatedCount = 0;
|
|
244
|
-
this.assetsMigratedMap.clear();
|
|
245
|
-
this.assetsTransferredCount = 0;
|
|
246
|
-
this.operationMetrics.clear();
|
|
247
|
-
this.errorCounts.clear();
|
|
248
|
-
this.cacheHits = 0;
|
|
249
|
-
this.cacheMisses = 0;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Export metrics in the specified format
|
|
254
|
-
*/
|
|
255
|
-
export(format: 'json' | 'prometheus'): string {
|
|
256
|
-
if (format === 'json') {
|
|
257
|
-
return this.exportJSON();
|
|
258
|
-
} else if (format === 'prometheus') {
|
|
259
|
-
return this.exportPrometheus();
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
throw new Error(`Unsupported export format: ${format}`);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Export metrics as JSON
|
|
267
|
-
*/
|
|
268
|
-
private exportJSON(): string {
|
|
269
|
-
return JSON.stringify(this.getMetrics(), null, 2);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Export metrics in Prometheus format
|
|
274
|
-
*/
|
|
275
|
-
private exportPrometheus(): string {
|
|
276
|
-
const lines: string[] = [];
|
|
277
|
-
const metrics = this.getMetrics();
|
|
278
|
-
|
|
279
|
-
// Asset metrics
|
|
280
|
-
lines.push('# HELP originals_assets_created_total Total number of assets created');
|
|
281
|
-
lines.push('# TYPE originals_assets_created_total counter');
|
|
282
|
-
lines.push(`originals_assets_created_total ${metrics.assetsCreated}`);
|
|
283
|
-
lines.push('');
|
|
284
|
-
|
|
285
|
-
lines.push('# HELP originals_assets_transferred_total Total number of assets transferred');
|
|
286
|
-
lines.push('# TYPE originals_assets_transferred_total counter');
|
|
287
|
-
lines.push(`originals_assets_transferred_total ${metrics.assetsTransferred}`);
|
|
288
|
-
lines.push('');
|
|
289
|
-
|
|
290
|
-
// Migration metrics
|
|
291
|
-
lines.push('# HELP originals_assets_migrated_total Total number of assets migrated by layer transition');
|
|
292
|
-
lines.push('# TYPE originals_assets_migrated_total counter');
|
|
293
|
-
for (const [transition, count] of Object.entries(metrics.assetsMigrated)) {
|
|
294
|
-
const [from, to] = transition.split('→');
|
|
295
|
-
lines.push(`originals_assets_migrated_total{from="${from}",to="${to}"} ${count}`);
|
|
296
|
-
}
|
|
297
|
-
lines.push('');
|
|
298
|
-
|
|
299
|
-
// Operation metrics
|
|
300
|
-
for (const [operation, opMetrics] of Object.entries(metrics.operationTimes)) {
|
|
301
|
-
const safeOpName = operation.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
302
|
-
|
|
303
|
-
lines.push(`# HELP originals_operation_${safeOpName}_total Total number of ${operation} operations`);
|
|
304
|
-
lines.push(`# TYPE originals_operation_${safeOpName}_total counter`);
|
|
305
|
-
lines.push(`originals_operation_${safeOpName}_total ${opMetrics.count}`);
|
|
306
|
-
lines.push('');
|
|
307
|
-
|
|
308
|
-
lines.push(`# HELP originals_operation_${safeOpName}_duration_milliseconds Duration of ${operation} operations`);
|
|
309
|
-
lines.push(`# TYPE originals_operation_${safeOpName}_duration_milliseconds summary`);
|
|
310
|
-
lines.push(`originals_operation_${safeOpName}_duration_milliseconds{quantile="0.0"} ${opMetrics.minTime}`);
|
|
311
|
-
lines.push(`originals_operation_${safeOpName}_duration_milliseconds{quantile="0.5"} ${opMetrics.avgTime}`);
|
|
312
|
-
lines.push(`originals_operation_${safeOpName}_duration_milliseconds{quantile="1.0"} ${opMetrics.maxTime}`);
|
|
313
|
-
lines.push(`originals_operation_${safeOpName}_duration_milliseconds_sum ${opMetrics.totalTime}`);
|
|
314
|
-
lines.push(`originals_operation_${safeOpName}_duration_milliseconds_count ${opMetrics.count}`);
|
|
315
|
-
lines.push('');
|
|
316
|
-
|
|
317
|
-
lines.push(`# HELP originals_operation_${safeOpName}_errors_total Total number of errors in ${operation} operations`);
|
|
318
|
-
lines.push(`# TYPE originals_operation_${safeOpName}_errors_total counter`);
|
|
319
|
-
lines.push(`originals_operation_${safeOpName}_errors_total ${opMetrics.errorCount}`);
|
|
320
|
-
lines.push('');
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Error metrics
|
|
324
|
-
lines.push('# HELP originals_errors_total Total number of errors by code');
|
|
325
|
-
lines.push('# TYPE originals_errors_total counter');
|
|
326
|
-
for (const [code, count] of Object.entries(metrics.errors)) {
|
|
327
|
-
lines.push(`originals_errors_total{code="${code}"} ${count}`);
|
|
328
|
-
}
|
|
329
|
-
lines.push('');
|
|
330
|
-
|
|
331
|
-
// Cache metrics
|
|
332
|
-
if (metrics.cacheStats) {
|
|
333
|
-
lines.push('# HELP originals_cache_hits_total Total number of cache hits');
|
|
334
|
-
lines.push('# TYPE originals_cache_hits_total counter');
|
|
335
|
-
lines.push(`originals_cache_hits_total ${metrics.cacheStats.hits}`);
|
|
336
|
-
lines.push('');
|
|
337
|
-
|
|
338
|
-
lines.push('# HELP originals_cache_misses_total Total number of cache misses');
|
|
339
|
-
lines.push('# TYPE originals_cache_misses_total counter');
|
|
340
|
-
lines.push(`originals_cache_misses_total ${metrics.cacheStats.misses}`);
|
|
341
|
-
lines.push('');
|
|
342
|
-
|
|
343
|
-
lines.push('# HELP originals_cache_hit_rate Cache hit rate');
|
|
344
|
-
lines.push('# TYPE originals_cache_hit_rate gauge');
|
|
345
|
-
lines.push(`originals_cache_hit_rate ${metrics.cacheStats.hitRate}`);
|
|
346
|
-
lines.push('');
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
// System metrics
|
|
350
|
-
lines.push('# HELP originals_uptime_milliseconds SDK uptime in milliseconds');
|
|
351
|
-
lines.push('# TYPE originals_uptime_milliseconds gauge');
|
|
352
|
-
lines.push(`originals_uptime_milliseconds ${metrics.uptime}`);
|
|
353
|
-
lines.push('');
|
|
354
|
-
|
|
355
|
-
return lines.join('\n');
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|