@sip-protocol/sdk 0.7.3 → 0.8.0
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/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +47556 -19603
- package/dist/browser.mjs +628 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
- package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48396 -19623
- package/dist/index.mjs +537 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +44 -11
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +252 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +47 -6
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +186 -33
- package/src/chains/solana/providers/index.ts +31 -0
- package/src/chains/solana/providers/interface.ts +61 -18
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +338 -67
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +83 -66
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +57 -6
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +23 -0
- package/src/compliance/range-sas.ts +398 -33
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +686 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +254 -4
- package/src/privacy-backends/interface.ts +649 -6
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash.ts +13 -17
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +414 -2
- package/src/privacy-backends/router.ts +283 -3
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +3 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +110 -29
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-2XIVXWHA.mjs +0 -1930
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-7RFRWDCW.mjs +0 -1504
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-F6F73W35.mjs +0 -16166
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-OFDBEIEK.mjs +0 -16166
- package/dist/chunk-SF7YSLF5.mjs +0 -1515
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/chunk-WWUSGOXE.mjs +0 -17129
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-B71aXVzk.d.ts +0 -13264
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-pOIIuwfV.d.mts +0 -13264
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-4O4K45VU.mjs +0 -46
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-NDABAZ6P.mjs +0 -56
- package/dist/solana-Q4NAVBTS.mjs +0 -46
- package/dist/solana-ZYO63LY5.mjs +0 -46
package/src/intent.ts
CHANGED
|
@@ -44,6 +44,9 @@ import {
|
|
|
44
44
|
isValidPrivacyLevel,
|
|
45
45
|
isValidStealthMetaAddress,
|
|
46
46
|
} from './validation'
|
|
47
|
+
import { createLogger } from './logger'
|
|
48
|
+
|
|
49
|
+
const log = createLogger('intent')
|
|
47
50
|
|
|
48
51
|
/**
|
|
49
52
|
* Options for creating a shielded intent
|
|
@@ -606,9 +609,9 @@ export async function createShieldedIntent(
|
|
|
606
609
|
// Placeholder mode with no senderSecret - use random bytes (won't verify)
|
|
607
610
|
effectiveOwnershipSig = randomBytes(64)
|
|
608
611
|
effectiveAuthSig = randomBytes(64)
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
'
|
|
612
|
+
log.warn(
|
|
613
|
+
{ allowPlaceholders: true, hasSenderSecret: false },
|
|
614
|
+
'Using placeholder signatures for proof generation - NOT cryptographically valid'
|
|
612
615
|
)
|
|
613
616
|
} else {
|
|
614
617
|
// Generate real ECDSA signatures using senderSecret
|
package/src/logger.ts
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Logger for SIP SDK
|
|
3
|
+
*
|
|
4
|
+
* Provides production-ready logging using pino with:
|
|
5
|
+
* - Structured JSON output for log aggregators
|
|
6
|
+
* - Configurable log levels via SIP_LOG_LEVEL
|
|
7
|
+
* - Silent mode for tests (SIP_LOG_SILENT=true)
|
|
8
|
+
* - Privacy-aware redaction of sensitive data
|
|
9
|
+
* - Child loggers for module-specific context
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { logger, createLogger } from '@sip-protocol/sdk'
|
|
14
|
+
*
|
|
15
|
+
* // Use global logger
|
|
16
|
+
* logger.info({ module: 'stealth' }, 'Generating stealth address')
|
|
17
|
+
*
|
|
18
|
+
* // Create module-specific logger
|
|
19
|
+
* const log = createLogger('stealth')
|
|
20
|
+
* log.info('Generating address')
|
|
21
|
+
* log.warn({ deprecated: 'createCommitment' }, 'Function deprecated')
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example Environment Configuration
|
|
25
|
+
* ```bash
|
|
26
|
+
* SIP_LOG_LEVEL=debug # trace, debug, info, warn, error, fatal, silent
|
|
27
|
+
* SIP_LOG_SILENT=true # Disable all logging (for tests)
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import pino, { type Logger as PinoLogger, type LoggerOptions } from 'pino'
|
|
32
|
+
|
|
33
|
+
// Re-export pino types for convenience
|
|
34
|
+
export type { Logger as PinoLogger } from 'pino'
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Log levels supported by the SDK
|
|
38
|
+
*/
|
|
39
|
+
export type SIPLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent'
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Configuration options for the SIP logger
|
|
43
|
+
*/
|
|
44
|
+
export interface SIPLoggerConfig {
|
|
45
|
+
/** Log level (default: from SIP_LOG_LEVEL env or 'info') */
|
|
46
|
+
level?: SIPLogLevel
|
|
47
|
+
/** Logger name (shown in logs) */
|
|
48
|
+
name?: string
|
|
49
|
+
/** Custom pino options */
|
|
50
|
+
options?: LoggerOptions
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Sensitive fields that should be redacted in logs
|
|
55
|
+
*/
|
|
56
|
+
const SENSITIVE_FIELDS = new Set([
|
|
57
|
+
'privateKey',
|
|
58
|
+
'secretKey',
|
|
59
|
+
'seed',
|
|
60
|
+
'mnemonic',
|
|
61
|
+
'password',
|
|
62
|
+
'secret',
|
|
63
|
+
'blindingFactor',
|
|
64
|
+
'viewingPrivateKey',
|
|
65
|
+
'spendingPrivateKey',
|
|
66
|
+
])
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Fields that should be partially redacted (show first/last chars)
|
|
70
|
+
*/
|
|
71
|
+
const PARTIAL_REDACT_FIELDS = new Set([
|
|
72
|
+
'address',
|
|
73
|
+
'publicKey',
|
|
74
|
+
'pubkey',
|
|
75
|
+
'from',
|
|
76
|
+
'to',
|
|
77
|
+
'owner',
|
|
78
|
+
'sender',
|
|
79
|
+
'recipient',
|
|
80
|
+
'wallet',
|
|
81
|
+
'signature',
|
|
82
|
+
'txHash',
|
|
83
|
+
'txSignature',
|
|
84
|
+
'transactionHash',
|
|
85
|
+
'stealthAddress',
|
|
86
|
+
'ephemeralPubkey',
|
|
87
|
+
])
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get the configured log level from environment
|
|
91
|
+
*/
|
|
92
|
+
function getLogLevel(): SIPLogLevel {
|
|
93
|
+
// Check for silent mode first
|
|
94
|
+
const silent = process.env.SIP_LOG_SILENT
|
|
95
|
+
if (silent === 'true' || silent === '1') {
|
|
96
|
+
return 'silent'
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Check for explicit level
|
|
100
|
+
const level = process.env.SIP_LOG_LEVEL?.toLowerCase()
|
|
101
|
+
const validLevels: SIPLogLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent']
|
|
102
|
+
if (level && validLevels.includes(level as SIPLogLevel)) {
|
|
103
|
+
return level as SIPLogLevel
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Default to warn in production, info otherwise
|
|
107
|
+
return process.env.NODE_ENV === 'production' ? 'warn' : 'info'
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if running in test environment
|
|
112
|
+
*/
|
|
113
|
+
function isTestEnvironment(): boolean {
|
|
114
|
+
return (
|
|
115
|
+
process.env.NODE_ENV === 'test' ||
|
|
116
|
+
process.env.VITEST === 'true' ||
|
|
117
|
+
process.env.JEST_WORKER_ID !== undefined ||
|
|
118
|
+
process.env.SIP_LOG_SILENT === 'true'
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Redact a string value for logging
|
|
124
|
+
*/
|
|
125
|
+
function redactValue(value: string, chars: number = 4): string {
|
|
126
|
+
if (!value || typeof value !== 'string') return '[invalid]'
|
|
127
|
+
if (value.length <= chars * 2 + 3) return value
|
|
128
|
+
return `${value.slice(0, chars)}...${value.slice(-chars)}`
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Custom serializer that redacts sensitive data
|
|
133
|
+
*/
|
|
134
|
+
function createRedactingSerializer() {
|
|
135
|
+
return {
|
|
136
|
+
// Redact sensitive object properties
|
|
137
|
+
obj: (obj: Record<string, unknown>): Record<string, unknown> => {
|
|
138
|
+
if (!obj || typeof obj !== 'object') return obj
|
|
139
|
+
|
|
140
|
+
const result: Record<string, unknown> = {}
|
|
141
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
142
|
+
const lowerKey = key.toLowerCase()
|
|
143
|
+
|
|
144
|
+
// Fully redact sensitive fields
|
|
145
|
+
if (SENSITIVE_FIELDS.has(key) || SENSITIVE_FIELDS.has(lowerKey)) {
|
|
146
|
+
result[key] = '[REDACTED]'
|
|
147
|
+
continue
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Partially redact address-like fields
|
|
151
|
+
if (
|
|
152
|
+
(PARTIAL_REDACT_FIELDS.has(key) || PARTIAL_REDACT_FIELDS.has(lowerKey)) &&
|
|
153
|
+
typeof value === 'string'
|
|
154
|
+
) {
|
|
155
|
+
result[key] = redactValue(value)
|
|
156
|
+
continue
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Recursively handle nested objects
|
|
160
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
161
|
+
result[key] = createRedactingSerializer().obj(value as Record<string, unknown>)
|
|
162
|
+
continue
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
result[key] = value
|
|
166
|
+
}
|
|
167
|
+
return result
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Create the base pino logger instance
|
|
174
|
+
*/
|
|
175
|
+
function createBaseLogger(config: SIPLoggerConfig = {}): PinoLogger {
|
|
176
|
+
const level = config.level ?? getLogLevel()
|
|
177
|
+
|
|
178
|
+
// In test environment, always use silent unless explicitly set
|
|
179
|
+
const effectiveLevel = isTestEnvironment() && !config.level ? 'silent' : level
|
|
180
|
+
|
|
181
|
+
const options: LoggerOptions = {
|
|
182
|
+
name: config.name ?? 'sip-sdk',
|
|
183
|
+
level: effectiveLevel,
|
|
184
|
+
formatters: {
|
|
185
|
+
level: (label) => ({ level: label }),
|
|
186
|
+
},
|
|
187
|
+
// Timestamp in ISO format for log aggregators
|
|
188
|
+
timestamp: pino.stdTimeFunctions.isoTime,
|
|
189
|
+
// Custom serializers for objects
|
|
190
|
+
serializers: createRedactingSerializer(),
|
|
191
|
+
...config.options,
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return pino(options)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Global SDK logger instance
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* import { logger } from '@sip-protocol/sdk'
|
|
203
|
+
*
|
|
204
|
+
* logger.info('SDK initialized')
|
|
205
|
+
* logger.warn({ deprecated: 'oldFunc' }, 'Function deprecated')
|
|
206
|
+
* logger.error({ err }, 'Operation failed')
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
export const logger = createBaseLogger()
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Create a child logger for a specific module
|
|
213
|
+
*
|
|
214
|
+
* Child loggers inherit the parent's configuration and add
|
|
215
|
+
* a 'module' field to all log entries.
|
|
216
|
+
*
|
|
217
|
+
* @param module - Module name to add to all log entries
|
|
218
|
+
* @param config - Optional additional configuration
|
|
219
|
+
* @returns Child logger instance
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* import { createLogger } from '@sip-protocol/sdk'
|
|
224
|
+
*
|
|
225
|
+
* const log = createLogger('stealth')
|
|
226
|
+
* log.info('Generating stealth address')
|
|
227
|
+
* // Output: {"level":"info","time":"...","module":"stealth","msg":"Generating stealth address"}
|
|
228
|
+
*
|
|
229
|
+
* log.warn({ deprecated: 'oldFunc', replacement: 'newFunc' }, 'Function deprecated')
|
|
230
|
+
* // Output: {"level":"warn","time":"...","module":"stealth","deprecated":"oldFunc","replacement":"newFunc","msg":"Function deprecated"}
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
export function createLogger(module: string, config?: SIPLoggerConfig): PinoLogger {
|
|
234
|
+
if (config) {
|
|
235
|
+
return createBaseLogger({ ...config, name: `sip-sdk:${module}` }).child({ module })
|
|
236
|
+
}
|
|
237
|
+
return logger.child({ module })
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Configure the global logger
|
|
242
|
+
*
|
|
243
|
+
* Note: This creates a new logger instance. Existing child loggers
|
|
244
|
+
* will not be affected.
|
|
245
|
+
*
|
|
246
|
+
* @param config - Logger configuration options
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* ```typescript
|
|
250
|
+
* import { configureLogger } from '@sip-protocol/sdk'
|
|
251
|
+
*
|
|
252
|
+
* // Enable debug logging
|
|
253
|
+
* configureLogger({ level: 'debug' })
|
|
254
|
+
*
|
|
255
|
+
* // Silent mode for tests
|
|
256
|
+
* configureLogger({ level: 'silent' })
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
export function configureLogger(config: SIPLoggerConfig): PinoLogger {
|
|
260
|
+
return createBaseLogger(config)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Silence all logging (useful for tests)
|
|
265
|
+
*
|
|
266
|
+
* @example
|
|
267
|
+
* ```typescript
|
|
268
|
+
* import { silenceLogger } from '@sip-protocol/sdk'
|
|
269
|
+
*
|
|
270
|
+
* beforeAll(() => {
|
|
271
|
+
* silenceLogger()
|
|
272
|
+
* })
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
export function silenceLogger(): void {
|
|
276
|
+
logger.level = 'silent'
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Set the log level at runtime
|
|
281
|
+
*
|
|
282
|
+
* @param level - New log level
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* import { setLogLevel } from '@sip-protocol/sdk'
|
|
287
|
+
*
|
|
288
|
+
* setLogLevel('debug') // Enable verbose logging
|
|
289
|
+
* setLogLevel('error') // Only show errors
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
export function setLogLevel(level: SIPLogLevel): void {
|
|
293
|
+
logger.level = level
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Get the current log level
|
|
298
|
+
*
|
|
299
|
+
* @returns Current log level
|
|
300
|
+
*/
|
|
301
|
+
export function getLogLevelName(): SIPLogLevel {
|
|
302
|
+
return logger.level as SIPLogLevel
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Check if a specific log level is enabled
|
|
307
|
+
*
|
|
308
|
+
* @param level - Log level to check
|
|
309
|
+
* @returns true if the level would produce output
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* ```typescript
|
|
313
|
+
* import { isLevelEnabled } from '@sip-protocol/sdk'
|
|
314
|
+
*
|
|
315
|
+
* if (isLevelEnabled('debug')) {
|
|
316
|
+
* // Expensive debug computation
|
|
317
|
+
* const details = computeExpensiveDebugInfo()
|
|
318
|
+
* logger.debug(details, 'Debug info')
|
|
319
|
+
* }
|
|
320
|
+
* ```
|
|
321
|
+
*/
|
|
322
|
+
export function isLevelEnabled(level: SIPLogLevel): boolean {
|
|
323
|
+
return logger.isLevelEnabled(level)
|
|
324
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Privacy Module
|
|
3
|
+
*
|
|
4
|
+
* Provides network-level privacy features for SIP SDK including:
|
|
5
|
+
* - Tor integration for anonymous RPC calls
|
|
6
|
+
* - SOCKS5 proxy support
|
|
7
|
+
* - HTTP/HTTPS proxy support
|
|
8
|
+
* - Circuit rotation for unlinkability
|
|
9
|
+
*
|
|
10
|
+
* ## Quick Start
|
|
11
|
+
*
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { createNetworkPrivacyClient } from '@sip-protocol/sdk'
|
|
14
|
+
*
|
|
15
|
+
* // Using Tor (auto-detect)
|
|
16
|
+
* const network = await createNetworkPrivacyClient({
|
|
17
|
+
* proxy: 'tor',
|
|
18
|
+
* rotateCircuit: true,
|
|
19
|
+
* })
|
|
20
|
+
*
|
|
21
|
+
* // All API calls through Tor
|
|
22
|
+
* const response = await network.fetch('https://api.example.com/data')
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* ## Proxy Types
|
|
26
|
+
*
|
|
27
|
+
* | Type | Example | Description |
|
|
28
|
+
* |------|---------|-------------|
|
|
29
|
+
* | Tor | `'tor'` | Auto-detect local Tor on ports 9050/9150 |
|
|
30
|
+
* | SOCKS5 | `'socks5://host:port'` | Generic SOCKS5 proxy |
|
|
31
|
+
* | HTTP | `'http://host:port'` | HTTP proxy |
|
|
32
|
+
* | Direct | `undefined` | No proxy (default) |
|
|
33
|
+
*
|
|
34
|
+
* ## Environment Variables
|
|
35
|
+
*
|
|
36
|
+
* Set `SIP_PROXY` environment variable to configure proxy:
|
|
37
|
+
*
|
|
38
|
+
* ```bash
|
|
39
|
+
* # Use Tor
|
|
40
|
+
* export SIP_PROXY=tor
|
|
41
|
+
*
|
|
42
|
+
* # Use custom SOCKS5
|
|
43
|
+
* export SIP_PROXY=socks5://127.0.0.1:1080
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @module network
|
|
47
|
+
* @see https://github.com/sip-protocol/sip-protocol/issues/489
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
// Core proxy functionality
|
|
51
|
+
export {
|
|
52
|
+
// Types
|
|
53
|
+
type ProxyConfig,
|
|
54
|
+
type ProxyType,
|
|
55
|
+
type ParsedProxyConfig,
|
|
56
|
+
type ProxyAgentOptions,
|
|
57
|
+
type ProxyCheckResult,
|
|
58
|
+
type ProxiedFetch,
|
|
59
|
+
type NetworkPrivacyConfig,
|
|
60
|
+
|
|
61
|
+
// Constants
|
|
62
|
+
TOR_PORTS,
|
|
63
|
+
TOR_HOST,
|
|
64
|
+
TOR_CONTROL_PORT,
|
|
65
|
+
DEFAULT_PROXY_TIMEOUT,
|
|
66
|
+
PROXY_ENV_VAR,
|
|
67
|
+
PROXY_ENV_VARS,
|
|
68
|
+
DEFAULT_NETWORK_CONFIG,
|
|
69
|
+
|
|
70
|
+
// Functions
|
|
71
|
+
parseProxyConfig,
|
|
72
|
+
getProxyFromEnv,
|
|
73
|
+
isTorAvailable,
|
|
74
|
+
detectTorPort,
|
|
75
|
+
checkProxyAvailability,
|
|
76
|
+
createProxyAgent,
|
|
77
|
+
createProxiedFetch,
|
|
78
|
+
rotateCircuit,
|
|
79
|
+
createNetworkPrivacyClient,
|
|
80
|
+
} from './proxy'
|