@agirails/sdk 2.5.3 → 2.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ACTPClient.d.ts +18 -0
- package/dist/ACTPClient.d.ts.map +1 -1
- package/dist/ACTPClient.js +72 -23
- package/dist/ACTPClient.js.map +1 -1
- package/dist/adapters/BasicAdapter.d.ts +15 -0
- package/dist/adapters/BasicAdapter.d.ts.map +1 -1
- package/dist/adapters/BasicAdapter.js +33 -4
- package/dist/adapters/BasicAdapter.js.map +1 -1
- package/dist/adapters/StandardAdapter.d.ts +20 -3
- package/dist/adapters/StandardAdapter.d.ts.map +1 -1
- package/dist/adapters/StandardAdapter.js +90 -12
- package/dist/adapters/StandardAdapter.js.map +1 -1
- package/dist/cli/commands/publish.js +16 -4
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/register.js +16 -4
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/tx.js +31 -3
- package/dist/cli/commands/tx.js.map +1 -1
- package/dist/config/networks.d.ts +10 -2
- package/dist/config/networks.d.ts.map +1 -1
- package/dist/config/networks.js +31 -22
- package/dist/config/networks.js.map +1 -1
- package/dist/level0/request.d.ts.map +1 -1
- package/dist/level0/request.js +2 -1
- package/dist/level0/request.js.map +1 -1
- package/dist/runtime/BlockchainRuntime.d.ts.map +1 -1
- package/dist/runtime/BlockchainRuntime.js +11 -5
- package/dist/runtime/BlockchainRuntime.js.map +1 -1
- package/dist/utils/IPFSClient.d.ts +3 -1
- package/dist/utils/IPFSClient.d.ts.map +1 -1
- package/dist/utils/IPFSClient.js +27 -7
- package/dist/utils/IPFSClient.js.map +1 -1
- package/dist/wallet/AutoWalletProvider.d.ts +11 -1
- package/dist/wallet/AutoWalletProvider.d.ts.map +1 -1
- package/dist/wallet/AutoWalletProvider.js +84 -19
- package/dist/wallet/AutoWalletProvider.js.map +1 -1
- package/dist/wallet/IWalletProvider.d.ts +34 -0
- package/dist/wallet/IWalletProvider.d.ts.map +1 -1
- package/dist/wallet/SmartWalletRouter.d.ts +128 -0
- package/dist/wallet/SmartWalletRouter.d.ts.map +1 -0
- package/dist/wallet/SmartWalletRouter.js +248 -0
- package/dist/wallet/SmartWalletRouter.js.map +1 -0
- package/dist/wallet/aa/DualNonceManager.d.ts +26 -1
- package/dist/wallet/aa/DualNonceManager.d.ts.map +1 -1
- package/dist/wallet/aa/DualNonceManager.js +140 -6
- package/dist/wallet/aa/DualNonceManager.js.map +1 -1
- package/package.json +3 -6
- package/src/ACTPClient.ts +0 -1579
- package/src/abi/ACTPKernel.json +0 -1356
- package/src/abi/AgentRegistry.json +0 -915
- package/src/abi/ERC20.json +0 -40
- package/src/abi/EscrowVault.json +0 -134
- package/src/abi/IdentityRegistry.json +0 -316
- package/src/adapters/AdapterRegistry.ts +0 -173
- package/src/adapters/AdapterRouter.ts +0 -416
- package/src/adapters/BaseAdapter.ts +0 -498
- package/src/adapters/BasicAdapter.ts +0 -514
- package/src/adapters/IAdapter.ts +0 -292
- package/src/adapters/StandardAdapter.ts +0 -555
- package/src/adapters/X402Adapter.ts +0 -731
- package/src/adapters/index.ts +0 -60
- package/src/builders/DeliveryProofBuilder.ts +0 -327
- package/src/builders/QuoteBuilder.ts +0 -483
- package/src/builders/index.ts +0 -17
- package/src/cli/commands/balance.ts +0 -110
- package/src/cli/commands/batch.ts +0 -487
- package/src/cli/commands/config.ts +0 -231
- package/src/cli/commands/deploy-check.ts +0 -364
- package/src/cli/commands/deploy-env.ts +0 -120
- package/src/cli/commands/diff.ts +0 -141
- package/src/cli/commands/init.ts +0 -469
- package/src/cli/commands/mint.ts +0 -116
- package/src/cli/commands/pay.ts +0 -113
- package/src/cli/commands/publish.ts +0 -475
- package/src/cli/commands/pull.ts +0 -124
- package/src/cli/commands/register.ts +0 -247
- package/src/cli/commands/simulate.ts +0 -345
- package/src/cli/commands/time.ts +0 -302
- package/src/cli/commands/tx.ts +0 -448
- package/src/cli/commands/watch.ts +0 -211
- package/src/cli/index.ts +0 -134
- package/src/cli/utils/client.ts +0 -252
- package/src/cli/utils/config.ts +0 -389
- package/src/cli/utils/output.ts +0 -465
- package/src/cli/utils/wallet.ts +0 -109
- package/src/config/agirailsmd.ts +0 -262
- package/src/config/networks.ts +0 -275
- package/src/config/pendingPublish.ts +0 -237
- package/src/config/publishPipeline.ts +0 -359
- package/src/config/syncOperations.ts +0 -279
- package/src/erc8004/ERC8004Bridge.ts +0 -462
- package/src/erc8004/ReputationReporter.ts +0 -468
- package/src/erc8004/index.ts +0 -61
- package/src/errors/index.ts +0 -427
- package/src/index.ts +0 -364
- package/src/level0/Provider.ts +0 -117
- package/src/level0/ServiceDirectory.ts +0 -131
- package/src/level0/index.ts +0 -10
- package/src/level0/provide.ts +0 -132
- package/src/level0/request.ts +0 -432
- package/src/level1/Agent.ts +0 -1426
- package/src/level1/index.ts +0 -10
- package/src/level1/pricing/PriceCalculator.ts +0 -255
- package/src/level1/pricing/PricingStrategy.ts +0 -198
- package/src/level1/types/Job.ts +0 -179
- package/src/level1/types/Options.ts +0 -291
- package/src/level1/types/index.ts +0 -8
- package/src/protocol/ACTPKernel.ts +0 -808
- package/src/protocol/AgentRegistry.ts +0 -559
- package/src/protocol/DIDManager.ts +0 -629
- package/src/protocol/DIDResolver.ts +0 -554
- package/src/protocol/EASHelper.ts +0 -378
- package/src/protocol/EscrowVault.ts +0 -255
- package/src/protocol/EventMonitor.ts +0 -204
- package/src/protocol/MessageSigner.ts +0 -510
- package/src/protocol/ProofGenerator.ts +0 -339
- package/src/protocol/QuoteBuilder.ts +0 -15
- package/src/registry/AgentRegistryClient.ts +0 -202
- package/src/runtime/BlockchainRuntime.ts +0 -1015
- package/src/runtime/IACTPRuntime.ts +0 -306
- package/src/runtime/MockRuntime.ts +0 -1298
- package/src/runtime/MockStateManager.ts +0 -577
- package/src/runtime/index.ts +0 -25
- package/src/runtime/types/MockState.ts +0 -237
- package/src/storage/ArchiveBundleBuilder.ts +0 -561
- package/src/storage/ArweaveClient.ts +0 -946
- package/src/storage/FilebaseClient.ts +0 -790
- package/src/storage/index.ts +0 -96
- package/src/storage/types.ts +0 -348
- package/src/types/adapter.ts +0 -310
- package/src/types/agent.ts +0 -79
- package/src/types/did.ts +0 -223
- package/src/types/eip712.ts +0 -175
- package/src/types/erc8004.ts +0 -293
- package/src/types/escrow.ts +0 -27
- package/src/types/index.ts +0 -17
- package/src/types/message.ts +0 -145
- package/src/types/state.ts +0 -87
- package/src/types/transaction.ts +0 -69
- package/src/types/x402.ts +0 -251
- package/src/utils/ErrorRecoveryGuide.ts +0 -676
- package/src/utils/Helpers.ts +0 -688
- package/src/utils/IPFSClient.ts +0 -368
- package/src/utils/Logger.ts +0 -484
- package/src/utils/NonceManager.ts +0 -591
- package/src/utils/RateLimiter.ts +0 -534
- package/src/utils/ReceivedNonceTracker.ts +0 -567
- package/src/utils/SDKLifecycle.ts +0 -416
- package/src/utils/SecureNonce.ts +0 -78
- package/src/utils/Semaphore.ts +0 -276
- package/src/utils/UsedAttestationTracker.ts +0 -385
- package/src/utils/canonicalJson.ts +0 -38
- package/src/utils/circuitBreaker.ts +0 -324
- package/src/utils/computeTypeHash.ts +0 -48
- package/src/utils/fsSafe.ts +0 -80
- package/src/utils/index.ts +0 -80
- package/src/utils/retry.ts +0 -364
- package/src/utils/security.ts +0 -418
- package/src/utils/validation.ts +0 -540
- package/src/wallet/AutoWalletProvider.ts +0 -299
- package/src/wallet/EOAWalletProvider.ts +0 -69
- package/src/wallet/IWalletProvider.ts +0 -135
- package/src/wallet/aa/BundlerClient.ts +0 -274
- package/src/wallet/aa/DualNonceManager.ts +0 -173
- package/src/wallet/aa/PaymasterClient.ts +0 -174
- package/src/wallet/aa/TransactionBatcher.ts +0 -353
- package/src/wallet/aa/UserOpBuilder.ts +0 -246
- package/src/wallet/aa/constants.ts +0 -60
- package/src/wallet/keystore.ts +0 -240
|
@@ -1,416 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDKLifecycle - Proper cleanup and resource management
|
|
3
|
-
*
|
|
4
|
-
* SECURITY FIX (M-8): Ensures proper cleanup on SDK shutdown:
|
|
5
|
-
* - Connection cleanup
|
|
6
|
-
* - Pending request handling
|
|
7
|
-
* - Memory release
|
|
8
|
-
* - Graceful shutdown
|
|
9
|
-
*
|
|
10
|
-
* @module utils/SDKLifecycle
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { sdkLogger, Logger } from './Logger';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Disposable resource interface
|
|
17
|
-
*/
|
|
18
|
-
export interface Disposable {
|
|
19
|
-
/** Cleanup method */
|
|
20
|
-
dispose(): Promise<void> | void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Shutdown handler function
|
|
25
|
-
*/
|
|
26
|
-
export type ShutdownHandler = () => Promise<void> | void;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Lifecycle event types
|
|
30
|
-
*/
|
|
31
|
-
export type LifecycleEvent =
|
|
32
|
-
| 'initializing'
|
|
33
|
-
| 'ready'
|
|
34
|
-
| 'shutting-down'
|
|
35
|
-
| 'shutdown'
|
|
36
|
-
| 'error';
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Lifecycle event listener
|
|
40
|
-
*/
|
|
41
|
-
export type LifecycleListener = (event: LifecycleEvent, data?: unknown) => void;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* SDK Lifecycle Manager
|
|
45
|
-
*
|
|
46
|
-
* Manages SDK initialization, shutdown, and resource cleanup.
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```typescript
|
|
50
|
-
* const lifecycle = new SDKLifecycle();
|
|
51
|
-
*
|
|
52
|
-
* // Register cleanup handlers
|
|
53
|
-
* lifecycle.onShutdown(async () => {
|
|
54
|
-
* await closeConnections();
|
|
55
|
-
* });
|
|
56
|
-
*
|
|
57
|
-
* // Register disposable resources
|
|
58
|
-
* lifecycle.registerDisposable(myResource);
|
|
59
|
-
*
|
|
60
|
-
* // Later, initiate shutdown
|
|
61
|
-
* await lifecycle.shutdown();
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
export class SDKLifecycle {
|
|
65
|
-
private state: LifecycleEvent = 'initializing';
|
|
66
|
-
private shutdownHandlers: ShutdownHandler[] = [];
|
|
67
|
-
private disposables: Disposable[] = [];
|
|
68
|
-
private listeners: LifecycleListener[] = [];
|
|
69
|
-
private shutdownPromise: Promise<void> | null = null;
|
|
70
|
-
private readonly logger: Logger;
|
|
71
|
-
private isShuttingDown = false;
|
|
72
|
-
|
|
73
|
-
// SECURITY FIX (NEW-HIGH-2): Store handler references for cleanup
|
|
74
|
-
private processHandlers: {
|
|
75
|
-
sigint?: () => void;
|
|
76
|
-
sigterm?: () => void;
|
|
77
|
-
uncaughtException?: (error: Error) => void;
|
|
78
|
-
unhandledRejection?: (reason: unknown) => void;
|
|
79
|
-
} = {};
|
|
80
|
-
private processHandlersRegistered = false;
|
|
81
|
-
|
|
82
|
-
constructor(logger?: Logger) {
|
|
83
|
-
this.logger = logger ?? sdkLogger.child('Lifecycle');
|
|
84
|
-
|
|
85
|
-
// Register process shutdown handlers
|
|
86
|
-
this.registerProcessHandlers();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Get current lifecycle state
|
|
91
|
-
*/
|
|
92
|
-
getState(): LifecycleEvent {
|
|
93
|
-
return this.state;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Check if SDK is ready for operations
|
|
98
|
-
*/
|
|
99
|
-
isReady(): boolean {
|
|
100
|
-
return this.state === 'ready';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Mark SDK as ready
|
|
105
|
-
*/
|
|
106
|
-
markReady(): void {
|
|
107
|
-
this.state = 'ready';
|
|
108
|
-
this.emit('ready');
|
|
109
|
-
this.logger.info('SDK ready');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Register a shutdown handler
|
|
114
|
-
*
|
|
115
|
-
* @param handler - Function to call during shutdown
|
|
116
|
-
* @returns Unregister function
|
|
117
|
-
*/
|
|
118
|
-
onShutdown(handler: ShutdownHandler): () => void {
|
|
119
|
-
this.shutdownHandlers.push(handler);
|
|
120
|
-
|
|
121
|
-
return () => {
|
|
122
|
-
const index = this.shutdownHandlers.indexOf(handler);
|
|
123
|
-
if (index > -1) {
|
|
124
|
-
this.shutdownHandlers.splice(index, 1);
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Register a disposable resource
|
|
131
|
-
*
|
|
132
|
-
* @param disposable - Resource with dispose() method
|
|
133
|
-
* @returns Unregister function
|
|
134
|
-
*/
|
|
135
|
-
registerDisposable(disposable: Disposable): () => void {
|
|
136
|
-
this.disposables.push(disposable);
|
|
137
|
-
|
|
138
|
-
return () => {
|
|
139
|
-
const index = this.disposables.indexOf(disposable);
|
|
140
|
-
if (index > -1) {
|
|
141
|
-
this.disposables.splice(index, 1);
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Add lifecycle event listener
|
|
148
|
-
*
|
|
149
|
-
* @param listener - Event listener function
|
|
150
|
-
* @returns Unregister function
|
|
151
|
-
*/
|
|
152
|
-
addListener(listener: LifecycleListener): () => void {
|
|
153
|
-
this.listeners.push(listener);
|
|
154
|
-
|
|
155
|
-
return () => {
|
|
156
|
-
const index = this.listeners.indexOf(listener);
|
|
157
|
-
if (index > -1) {
|
|
158
|
-
this.listeners.splice(index, 1);
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Emit lifecycle event
|
|
165
|
-
*/
|
|
166
|
-
private emit(event: LifecycleEvent, data?: unknown): void {
|
|
167
|
-
for (const listener of this.listeners) {
|
|
168
|
-
try {
|
|
169
|
-
listener(event, data);
|
|
170
|
-
} catch (error) {
|
|
171
|
-
this.logger.error('Lifecycle listener error', { event }, error as Error);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Initiate graceful shutdown
|
|
178
|
-
*
|
|
179
|
-
* @param timeout - Maximum time to wait for cleanup (ms)
|
|
180
|
-
* @returns Promise that resolves when shutdown is complete
|
|
181
|
-
*/
|
|
182
|
-
async shutdown(timeout = 30000): Promise<void> {
|
|
183
|
-
// Prevent multiple shutdown calls
|
|
184
|
-
if (this.shutdownPromise) {
|
|
185
|
-
return this.shutdownPromise;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (this.isShuttingDown) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
this.isShuttingDown = true;
|
|
193
|
-
this.state = 'shutting-down';
|
|
194
|
-
this.emit('shutting-down');
|
|
195
|
-
this.logger.info('SDK shutting down...');
|
|
196
|
-
|
|
197
|
-
this.shutdownPromise = this.executeShutdown(timeout);
|
|
198
|
-
return this.shutdownPromise;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Execute shutdown sequence
|
|
203
|
-
*/
|
|
204
|
-
private async executeShutdown(timeout: number): Promise<void> {
|
|
205
|
-
const startTime = Date.now();
|
|
206
|
-
const errors: Error[] = [];
|
|
207
|
-
|
|
208
|
-
// Create timeout promise
|
|
209
|
-
const timeoutPromise = new Promise<void>((_, reject) => {
|
|
210
|
-
setTimeout(() => {
|
|
211
|
-
reject(new Error(`Shutdown timed out after ${timeout}ms`));
|
|
212
|
-
}, timeout);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
try {
|
|
216
|
-
// Run shutdown handlers first (in reverse order - LIFO)
|
|
217
|
-
const handlersPromise = (async () => {
|
|
218
|
-
for (let i = this.shutdownHandlers.length - 1; i >= 0; i--) {
|
|
219
|
-
try {
|
|
220
|
-
const elapsed = Date.now() - startTime;
|
|
221
|
-
if (elapsed >= timeout) {
|
|
222
|
-
this.logger.warn('Shutdown timeout reached, skipping remaining handlers');
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
const handler = this.shutdownHandlers[i];
|
|
227
|
-
await handler();
|
|
228
|
-
} catch (error) {
|
|
229
|
-
this.logger.error('Shutdown handler error', {}, error as Error);
|
|
230
|
-
errors.push(error as Error);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Dispose resources (in reverse order)
|
|
235
|
-
for (let i = this.disposables.length - 1; i >= 0; i--) {
|
|
236
|
-
try {
|
|
237
|
-
const elapsed = Date.now() - startTime;
|
|
238
|
-
if (elapsed >= timeout) {
|
|
239
|
-
this.logger.warn('Shutdown timeout reached, skipping remaining disposables');
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const disposable = this.disposables[i];
|
|
244
|
-
await disposable.dispose();
|
|
245
|
-
} catch (error) {
|
|
246
|
-
this.logger.error('Disposable cleanup error', {}, error as Error);
|
|
247
|
-
errors.push(error as Error);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
})();
|
|
251
|
-
|
|
252
|
-
// Race against timeout
|
|
253
|
-
await Promise.race([handlersPromise, timeoutPromise]);
|
|
254
|
-
|
|
255
|
-
} catch (error) {
|
|
256
|
-
if ((error as Error).message.includes('timed out')) {
|
|
257
|
-
this.logger.warn('Shutdown timed out, forcing cleanup');
|
|
258
|
-
} else {
|
|
259
|
-
errors.push(error as Error);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// SECURITY FIX (NEW-HIGH-2): Remove process handlers to prevent memory leaks
|
|
264
|
-
this.unregisterProcessHandlers();
|
|
265
|
-
|
|
266
|
-
// Clear registrations
|
|
267
|
-
this.shutdownHandlers = [];
|
|
268
|
-
this.disposables = [];
|
|
269
|
-
|
|
270
|
-
this.state = 'shutdown';
|
|
271
|
-
this.emit('shutdown');
|
|
272
|
-
this.logger.info('SDK shutdown complete', { errors: errors.length });
|
|
273
|
-
|
|
274
|
-
if (errors.length > 0) {
|
|
275
|
-
this.logger.error('Shutdown completed with errors', {
|
|
276
|
-
errorCount: errors.length,
|
|
277
|
-
errors: errors.map((e) => e.message),
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Register process-level shutdown handlers
|
|
284
|
-
*
|
|
285
|
-
* SECURITY FIX (NEW-HIGH-2): Store handler references for cleanup
|
|
286
|
-
* to prevent memory leaks when multiple SDKLifecycle instances are created.
|
|
287
|
-
*/
|
|
288
|
-
private registerProcessHandlers(): void {
|
|
289
|
-
// Only register in Node.js environment
|
|
290
|
-
if (typeof process === 'undefined') {
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// SECURITY FIX (NEW-HIGH-2): Prevent duplicate registrations
|
|
295
|
-
if (this.processHandlersRegistered) {
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// SECURITY FIX (NEW-HIGH-2): Create named handlers we can remove later
|
|
300
|
-
this.processHandlers.sigint = () => {
|
|
301
|
-
this.logger.info('Received SIGINT, initiating shutdown');
|
|
302
|
-
this.shutdown().then(() => {
|
|
303
|
-
process.exit(0);
|
|
304
|
-
}).catch((error) => {
|
|
305
|
-
this.logger.error('Shutdown error', {}, error);
|
|
306
|
-
process.exit(1);
|
|
307
|
-
});
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
this.processHandlers.sigterm = () => {
|
|
311
|
-
this.logger.info('Received SIGTERM, initiating shutdown');
|
|
312
|
-
this.shutdown().then(() => {
|
|
313
|
-
process.exit(0);
|
|
314
|
-
}).catch((error) => {
|
|
315
|
-
this.logger.error('Shutdown error', {}, error);
|
|
316
|
-
process.exit(1);
|
|
317
|
-
});
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
this.processHandlers.uncaughtException = (error: Error) => {
|
|
321
|
-
this.logger.error('Uncaught exception', {}, error);
|
|
322
|
-
this.emit('error', error);
|
|
323
|
-
this.shutdown().finally(() => {
|
|
324
|
-
process.exit(1);
|
|
325
|
-
});
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
this.processHandlers.unhandledRejection = (reason: unknown) => {
|
|
329
|
-
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
330
|
-
this.logger.error('Unhandled rejection', {}, error);
|
|
331
|
-
this.emit('error', error);
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
// Handle termination signals
|
|
335
|
-
process.on('SIGINT', this.processHandlers.sigint);
|
|
336
|
-
process.on('SIGTERM', this.processHandlers.sigterm);
|
|
337
|
-
|
|
338
|
-
// Handle uncaught errors
|
|
339
|
-
process.on('uncaughtException', this.processHandlers.uncaughtException);
|
|
340
|
-
process.on('unhandledRejection', this.processHandlers.unhandledRejection);
|
|
341
|
-
|
|
342
|
-
this.processHandlersRegistered = true;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Unregister process-level shutdown handlers
|
|
347
|
-
*
|
|
348
|
-
* SECURITY FIX (NEW-HIGH-2): Remove handlers to prevent memory leaks
|
|
349
|
-
*/
|
|
350
|
-
private unregisterProcessHandlers(): void {
|
|
351
|
-
if (typeof process === 'undefined' || !this.processHandlersRegistered) {
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (this.processHandlers.sigint) {
|
|
356
|
-
process.removeListener('SIGINT', this.processHandlers.sigint);
|
|
357
|
-
}
|
|
358
|
-
if (this.processHandlers.sigterm) {
|
|
359
|
-
process.removeListener('SIGTERM', this.processHandlers.sigterm);
|
|
360
|
-
}
|
|
361
|
-
if (this.processHandlers.uncaughtException) {
|
|
362
|
-
process.removeListener('uncaughtException', this.processHandlers.uncaughtException);
|
|
363
|
-
}
|
|
364
|
-
if (this.processHandlers.unhandledRejection) {
|
|
365
|
-
process.removeListener('unhandledRejection', this.processHandlers.unhandledRejection);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
this.processHandlers = {};
|
|
369
|
-
this.processHandlersRegistered = false;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Create a disposable wrapper for any cleanup function
|
|
374
|
-
*/
|
|
375
|
-
static createDisposable(cleanup: () => Promise<void> | void): Disposable {
|
|
376
|
-
return {
|
|
377
|
-
dispose: cleanup,
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Global SDK lifecycle manager instance
|
|
384
|
-
*/
|
|
385
|
-
export const sdkLifecycle = new SDKLifecycle();
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Convenience function to run cleanup on shutdown
|
|
389
|
-
*
|
|
390
|
-
* @example
|
|
391
|
-
* ```typescript
|
|
392
|
-
* const cleanup = onShutdown(async () => {
|
|
393
|
-
* await closeDatabase();
|
|
394
|
-
* });
|
|
395
|
-
*
|
|
396
|
-
* // Later, to remove the handler:
|
|
397
|
-
* cleanup();
|
|
398
|
-
* ```
|
|
399
|
-
*/
|
|
400
|
-
export function onShutdown(handler: ShutdownHandler): () => void {
|
|
401
|
-
return sdkLifecycle.onShutdown(handler);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Convenience function to register disposable
|
|
406
|
-
*/
|
|
407
|
-
export function registerDisposable(disposable: Disposable): () => void {
|
|
408
|
-
return sdkLifecycle.registerDisposable(disposable);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Convenience function to shutdown SDK
|
|
413
|
-
*/
|
|
414
|
-
export function shutdownSDK(timeout?: number): Promise<void> {
|
|
415
|
-
return sdkLifecycle.shutdown(timeout);
|
|
416
|
-
}
|
package/src/utils/SecureNonce.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SecureNonce - Cryptographically secure nonce generation
|
|
3
|
-
*
|
|
4
|
-
* SECURITY FIX (NEW-H-3): Provides secure random nonce generation
|
|
5
|
-
* to prevent weak randomness vulnerabilities in EIP-712 message signing.
|
|
6
|
-
*
|
|
7
|
-
* Reference: V7 Re-Audit NEW-H-3 (Weak Random Nonce Generation)
|
|
8
|
-
*
|
|
9
|
-
* @module utils/SecureNonce
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { ethers } from 'ethers';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Generate a cryptographically secure random nonce (bytes32)
|
|
16
|
-
*
|
|
17
|
-
* Uses ethers.js randomBytes() which:
|
|
18
|
-
* - Uses Node.js crypto.randomBytes() (CSPRNG)
|
|
19
|
-
* - Uses Web Crypto API in browsers (window.crypto.getRandomValues)
|
|
20
|
-
* - Guaranteed to be cryptographically secure
|
|
21
|
-
*
|
|
22
|
-
* @returns 32-byte hex string (0x...)
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* import { generateSecureNonce } from '@agirails/sdk';
|
|
27
|
-
*
|
|
28
|
-
* const nonce = generateSecureNonce();
|
|
29
|
-
* console.log(nonce); // 0x1234...abcd (64 hex chars)
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export function generateSecureNonce(): string {
|
|
33
|
-
return ethers.hexlify(ethers.randomBytes(32));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Validate nonce format (must be bytes32)
|
|
38
|
-
*
|
|
39
|
-
* @param nonce - Nonce to validate
|
|
40
|
-
* @returns true if valid bytes32 format
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```typescript
|
|
44
|
-
* isValidNonce('0x' + '00'.repeat(32)); // true
|
|
45
|
-
* isValidNonce('0x1234'); // false (too short)
|
|
46
|
-
* isValidNonce('not-hex'); // false (invalid format)
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
export function isValidNonce(nonce: string): boolean {
|
|
50
|
-
return /^0x[a-fA-F0-9]{64}$/.test(nonce);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Generate an array of secure nonces
|
|
55
|
-
*
|
|
56
|
-
* @param count - Number of nonces to generate
|
|
57
|
-
* @returns Array of bytes32 hex strings
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```typescript
|
|
61
|
-
* const nonces = generateSecureNonces(10);
|
|
62
|
-
* console.log(nonces.length); // 10
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
export function generateSecureNonces(count: number): string[] {
|
|
66
|
-
if (count <= 0) {
|
|
67
|
-
throw new Error('Count must be positive');
|
|
68
|
-
}
|
|
69
|
-
if (count > 10000) {
|
|
70
|
-
throw new Error('Count exceeds maximum allowed (10000)');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const nonces: string[] = [];
|
|
74
|
-
for (let i = 0; i < count; i++) {
|
|
75
|
-
nonces.push(generateSecureNonce());
|
|
76
|
-
}
|
|
77
|
-
return nonces;
|
|
78
|
-
}
|