@t402/streaming-payments 1.0.0-beta.1
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 +422 -0
- package/dist/channels/index.d.ts +1560 -0
- package/dist/channels/index.js +1135 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3482 -0
- package/dist/index.js.map +1 -0
- package/dist/settlement/index.d.ts +867 -0
- package/dist/settlement/index.js +1030 -0
- package/dist/settlement/index.js.map +1 -0
- package/dist/streaming/index.d.ts +1004 -0
- package/dist/streaming/index.js +1321 -0
- package/dist/streaming/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/streaming/types.ts","../../src/streaming/flow.ts","../../src/streaming/rate.ts","../../src/streaming/metering.ts","../../src/streaming/billing.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Stream state\n */\nexport const StreamState = z.enum([\n 'idle', // Stream not started\n 'active', // Streaming in progress\n 'paused', // Temporarily paused\n 'completed', // Stream completed (exhausted)\n 'cancelled', // Stream cancelled\n]);\nexport type StreamState = z.infer<typeof StreamState>;\n\n/**\n * Rate type\n */\nexport const RateType = z.enum([\n 'fixed', // Fixed rate per second\n 'variable', // Rate can change\n 'tiered', // Different rates based on usage\n 'dynamic', // Demand-based pricing\n]);\nexport type RateType = z.infer<typeof RateType>;\n\n/**\n * Stream rate configuration\n */\nexport const StreamRate = z.object({\n type: RateType,\n baseRate: z.string(), // Base rate per second\n minRate: z.string().optional(), // Minimum rate\n maxRate: z.string().optional(), // Maximum rate\n // For tiered rates\n tiers: z.array(z.object({\n threshold: z.string(), // Usage threshold\n rate: z.string(), // Rate after threshold\n })).optional(),\n // For dynamic rates\n adjustmentInterval: z.number().optional(), // How often to adjust (seconds)\n adjustmentFactor: z.number().optional(), // Max adjustment per interval\n});\nexport type StreamRate = z.infer<typeof StreamRate>;\n\n/**\n * Usage metrics\n */\nexport const UsageMetrics = z.object({\n totalSeconds: z.number(),\n totalAmount: z.string(),\n averageRate: z.string(),\n peakRate: z.string(),\n startTime: z.number(),\n endTime: z.number().optional(),\n // Breakdown by period\n hourly: z.array(z.object({\n hour: z.number(),\n amount: z.string(),\n seconds: z.number(),\n })).optional(),\n});\nexport type UsageMetrics = z.infer<typeof UsageMetrics>;\n\n/**\n * Metering record\n */\nexport const MeteringRecord = z.object({\n timestamp: z.number(),\n duration: z.number(), // Seconds since last record\n amount: z.string(), // Amount for this period\n rate: z.string(), // Rate applied\n cumulative: z.string(), // Cumulative total\n metadata: z.record(z.unknown()).optional(),\n});\nexport type MeteringRecord = z.infer<typeof MeteringRecord>;\n\n/**\n * Billing period\n */\nexport const BillingPeriod = z.enum([\n 'realtime', // Continuous real-time billing\n 'second', // Per-second\n 'minute', // Per-minute\n 'hour', // Per-hour\n 'day', // Per-day\n]);\nexport type BillingPeriod = z.infer<typeof BillingPeriod>;\n\n/**\n * Billing configuration\n */\nexport const BillingConfig = z.object({\n period: BillingPeriod,\n minimumCharge: z.string().default('0'),\n roundingMode: z.enum(['floor', 'ceil', 'round']).default('floor'),\n gracePeriod: z.number().default(0), // Seconds of free usage\n invoiceInterval: z.number().optional(), // Generate invoice every N seconds\n});\nexport type BillingConfig = z.infer<typeof BillingConfig>;\n\n/**\n * Invoice item\n */\nexport const InvoiceItem = z.object({\n description: z.string(),\n quantity: z.number(), // Duration in billing periods\n rate: z.string(),\n amount: z.string(),\n startTime: z.number(),\n endTime: z.number(),\n});\nexport type InvoiceItem = z.infer<typeof InvoiceItem>;\n\n/**\n * Invoice\n */\nexport const Invoice = z.object({\n id: z.string(),\n channelId: z.string(),\n payer: z.string(),\n payee: z.string(),\n items: z.array(InvoiceItem),\n subtotal: z.string(),\n fees: z.string(),\n total: z.string(),\n currency: z.string(),\n status: z.enum(['pending', 'paid', 'settled', 'disputed']),\n createdAt: z.number(),\n dueAt: z.number().optional(),\n paidAt: z.number().optional(),\n});\nexport type Invoice = z.infer<typeof Invoice>;\n\n/**\n * Stream session\n */\nexport const StreamSession = z.object({\n id: z.string(),\n channelId: z.string(),\n state: StreamState,\n rate: StreamRate,\n startedAt: z.number().optional(),\n pausedAt: z.number().optional(),\n endedAt: z.number().optional(),\n totalDuration: z.number(), // Total streaming seconds\n totalAmount: z.string(), // Total amount streamed\n meteringRecords: z.array(MeteringRecord),\n billingConfig: BillingConfig,\n invoices: z.array(z.string()), // Invoice IDs\n});\nexport type StreamSession = z.infer<typeof StreamSession>;\n\n/**\n * Rate adjustment request\n */\nexport const RateAdjustmentRequest = z.object({\n sessionId: z.string(),\n newRate: z.string(),\n reason: z.string(),\n effectiveFrom: z.number().optional(), // Timestamp, default now\n signature: z.string().optional(), // For mutual rate changes\n});\nexport type RateAdjustmentRequest = z.infer<typeof RateAdjustmentRequest>;\n\n/**\n * Stream event\n */\nexport const StreamEvent = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('started'),\n sessionId: z.string(),\n timestamp: z.number(),\n rate: z.string(),\n }),\n z.object({\n type: z.literal('paused'),\n sessionId: z.string(),\n timestamp: z.number(),\n totalStreamed: z.string(),\n }),\n z.object({\n type: z.literal('resumed'),\n sessionId: z.string(),\n timestamp: z.number(),\n }),\n z.object({\n type: z.literal('rate_changed'),\n sessionId: z.string(),\n timestamp: z.number(),\n oldRate: z.string(),\n newRate: z.string(),\n }),\n z.object({\n type: z.literal('checkpoint'),\n sessionId: z.string(),\n timestamp: z.number(),\n amount: z.string(),\n checkpointId: z.string(),\n }),\n z.object({\n type: z.literal('completed'),\n sessionId: z.string(),\n timestamp: z.number(),\n totalAmount: z.string(),\n totalDuration: z.number(),\n }),\n z.object({\n type: z.literal('cancelled'),\n sessionId: z.string(),\n timestamp: z.number(),\n reason: z.string(),\n }),\n]);\nexport type StreamEvent = z.infer<typeof StreamEvent>;\n","import {\n StreamSession,\n StreamState,\n StreamRate,\n StreamEvent,\n BillingConfig,\n MeteringRecord,\n} from './types.js';\n\n/**\n * Flow controller configuration\n */\nexport interface FlowConfig {\n updateInterval?: number; // How often to update state (ms)\n bufferTime?: number; // Buffer time before exhaustion (seconds)\n autoCheckpoint?: boolean; // Auto-create checkpoints\n checkpointInterval?: number; // Checkpoint interval (seconds)\n}\n\n/**\n * Flow controller for managing streaming sessions\n */\nexport class FlowController {\n private session: StreamSession;\n private config: Required<FlowConfig>;\n private updateTimer?: ReturnType<typeof setInterval>;\n private checkpointTimer?: ReturnType<typeof setInterval>;\n private eventListeners: Set<(event: StreamEvent) => void> = new Set();\n private lastUpdateTime: number = 0;\n\n constructor(\n channelId: string,\n rate: StreamRate,\n billingConfig: BillingConfig,\n config: FlowConfig = {},\n ) {\n this.config = {\n updateInterval: config.updateInterval ?? 1000,\n bufferTime: config.bufferTime ?? 60,\n autoCheckpoint: config.autoCheckpoint ?? true,\n checkpointInterval: config.checkpointInterval ?? 3600,\n };\n\n this.session = {\n id: this.generateSessionId(),\n channelId,\n state: 'idle',\n rate,\n totalDuration: 0,\n totalAmount: '0',\n meteringRecords: [],\n billingConfig,\n invoices: [],\n };\n }\n\n /**\n * Get current session state\n */\n getSession(): StreamSession {\n return { ...this.session };\n }\n\n /**\n * Get current state\n */\n getState(): StreamState {\n return this.session.state;\n }\n\n /**\n * Start streaming\n */\n start(): { success: boolean; error?: string } {\n if (this.session.state !== 'idle' && this.session.state !== 'paused') {\n return { success: false, error: 'Stream must be idle or paused to start' };\n }\n\n const now = Date.now();\n\n if (this.session.state === 'idle') {\n this.session.startedAt = now;\n } else {\n // Resuming from pause - add pause duration to account for gap\n const pauseDuration = now - (this.session.pausedAt ?? now);\n this.session.pausedAt = undefined;\n\n // Log the pause duration in metering\n this.addMeteringRecord({\n timestamp: now,\n duration: 0,\n amount: '0',\n rate: '0',\n cumulative: this.session.totalAmount,\n metadata: { event: 'resume', pauseDuration },\n });\n }\n\n this.session.state = 'active';\n this.lastUpdateTime = now;\n\n // Start update timer\n this.startUpdateTimer();\n\n // Start checkpoint timer if enabled\n if (this.config.autoCheckpoint) {\n this.startCheckpointTimer();\n }\n\n this.emitEvent({\n type: 'started',\n sessionId: this.session.id,\n timestamp: now,\n rate: this.session.rate.baseRate,\n });\n\n return { success: true };\n }\n\n /**\n * Pause streaming\n */\n pause(): { success: boolean; error?: string } {\n if (this.session.state !== 'active') {\n return { success: false, error: 'Stream must be active to pause' };\n }\n\n const now = Date.now();\n\n // Update totals before pausing\n this.updateTotals(now);\n\n this.session.state = 'paused';\n this.session.pausedAt = now;\n\n // Stop timers\n this.stopTimers();\n\n this.emitEvent({\n type: 'paused',\n sessionId: this.session.id,\n timestamp: now,\n totalStreamed: this.session.totalAmount,\n });\n\n return { success: true };\n }\n\n /**\n * Resume streaming (alias for start when paused)\n */\n resume(): { success: boolean; error?: string } {\n if (this.session.state !== 'paused') {\n return { success: false, error: 'Stream must be paused to resume' };\n }\n\n const result = this.start();\n\n if (result.success) {\n this.emitEvent({\n type: 'resumed',\n sessionId: this.session.id,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n /**\n * Stop streaming (complete)\n */\n stop(): { success: boolean; error?: string; finalAmount: string } {\n const now = Date.now();\n\n if (this.session.state === 'active') {\n this.updateTotals(now);\n }\n\n this.stopTimers();\n\n this.session.state = 'completed';\n this.session.endedAt = now;\n\n this.emitEvent({\n type: 'completed',\n sessionId: this.session.id,\n timestamp: now,\n totalAmount: this.session.totalAmount,\n totalDuration: this.session.totalDuration,\n });\n\n return {\n success: true,\n finalAmount: this.session.totalAmount,\n };\n }\n\n /**\n * Cancel streaming\n */\n cancel(reason: string): { success: boolean; error?: string } {\n const now = Date.now();\n\n if (this.session.state === 'active') {\n this.updateTotals(now);\n }\n\n this.stopTimers();\n\n this.session.state = 'cancelled';\n this.session.endedAt = now;\n\n this.emitEvent({\n type: 'cancelled',\n sessionId: this.session.id,\n timestamp: now,\n reason,\n });\n\n return { success: true };\n }\n\n /**\n * Get current streamed amount\n */\n getCurrentAmount(): string {\n if (this.session.state !== 'active') {\n return this.session.totalAmount;\n }\n\n const now = Date.now();\n const elapsed = Math.floor((now - this.lastUpdateTime) / 1000);\n const additionalAmount = this.calculateAmount(elapsed, this.session.rate);\n\n return (BigInt(this.session.totalAmount) + BigInt(additionalAmount)).toString();\n }\n\n /**\n * Get current rate\n */\n getCurrentRate(): string {\n return this.getEffectiveRate(this.session.rate, this.session.totalAmount);\n }\n\n /**\n * Get time until exhaustion (returns -1 if infinite)\n */\n getTimeUntilExhaustion(channelCapacity: string): number {\n if (this.session.state !== 'active') {\n return -1;\n }\n\n const remaining = BigInt(channelCapacity) - BigInt(this.getCurrentAmount());\n if (remaining <= 0n) {\n return 0;\n }\n\n const rate = BigInt(this.getCurrentRate());\n if (rate <= 0n) {\n return -1;\n }\n\n return Number(remaining / rate);\n }\n\n /**\n * Check if stream is near exhaustion\n */\n isNearExhaustion(channelCapacity: string): boolean {\n const remaining = this.getTimeUntilExhaustion(channelCapacity);\n return remaining >= 0 && remaining <= this.config.bufferTime;\n }\n\n /**\n * Create manual checkpoint\n */\n createCheckpoint(): { id: string; amount: string; timestamp: number } {\n const now = Date.now();\n const amount = this.getCurrentAmount();\n const checkpointId = `cp_${this.session.id}_${now}`;\n\n this.emitEvent({\n type: 'checkpoint',\n sessionId: this.session.id,\n timestamp: now,\n amount,\n checkpointId,\n });\n\n return { id: checkpointId, amount, timestamp: now };\n }\n\n /**\n * Subscribe to stream events\n */\n onEvent(callback: (event: StreamEvent) => void): () => void {\n this.eventListeners.add(callback);\n return () => this.eventListeners.delete(callback);\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.stopTimers();\n this.eventListeners.clear();\n }\n\n private startUpdateTimer(): void {\n this.updateTimer = setInterval(() => {\n if (this.session.state === 'active') {\n this.updateTotals(Date.now());\n }\n }, this.config.updateInterval);\n }\n\n private startCheckpointTimer(): void {\n this.checkpointTimer = setInterval(() => {\n if (this.session.state === 'active') {\n this.createCheckpoint();\n }\n }, this.config.checkpointInterval * 1000);\n }\n\n private stopTimers(): void {\n if (this.updateTimer) {\n clearInterval(this.updateTimer);\n this.updateTimer = undefined;\n }\n if (this.checkpointTimer) {\n clearInterval(this.checkpointTimer);\n this.checkpointTimer = undefined;\n }\n }\n\n private updateTotals(now: number): void {\n const elapsed = Math.floor((now - this.lastUpdateTime) / 1000);\n if (elapsed <= 0) return;\n\n const amount = this.calculateAmount(elapsed, this.session.rate);\n const newTotal = BigInt(this.session.totalAmount) + BigInt(amount);\n\n this.session.totalDuration += elapsed;\n this.session.totalAmount = newTotal.toString();\n this.lastUpdateTime = now;\n\n // Add metering record\n this.addMeteringRecord({\n timestamp: now,\n duration: elapsed,\n amount,\n rate: this.getCurrentRate(),\n cumulative: this.session.totalAmount,\n });\n }\n\n private calculateAmount(seconds: number, rate: StreamRate): string {\n const effectiveRate = this.getEffectiveRate(rate, this.session.totalAmount);\n return (BigInt(effectiveRate) * BigInt(seconds)).toString();\n }\n\n private getEffectiveRate(rate: StreamRate, totalAmount: string): string {\n if (rate.type === 'fixed') {\n return rate.baseRate;\n }\n\n if (rate.type === 'tiered' && rate.tiers) {\n // Find applicable tier\n const amount = BigInt(totalAmount);\n let applicableRate = rate.baseRate;\n\n for (const tier of rate.tiers) {\n if (amount >= BigInt(tier.threshold)) {\n applicableRate = tier.rate;\n }\n }\n\n return applicableRate;\n }\n\n // For variable and dynamic, return base rate\n // Real implementation would have more sophisticated logic\n return rate.baseRate;\n }\n\n private addMeteringRecord(record: MeteringRecord): void {\n this.session.meteringRecords.push(record);\n\n // Keep only last 1000 records to prevent memory bloat\n if (this.session.meteringRecords.length > 1000) {\n this.session.meteringRecords = this.session.meteringRecords.slice(-1000);\n }\n }\n\n private emitEvent(event: StreamEvent): void {\n this.eventListeners.forEach(callback => {\n try {\n callback(event);\n } catch {\n // Ignore listener errors\n }\n });\n }\n\n private generateSessionId(): string {\n return `ss_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\n/**\n * Create a simple fixed-rate flow controller\n */\nexport function createFixedRateFlow(\n channelId: string,\n ratePerSecond: string,\n config?: FlowConfig,\n): FlowController {\n const rate: StreamRate = {\n type: 'fixed',\n baseRate: ratePerSecond,\n };\n\n const billingConfig = {\n period: 'realtime' as const,\n minimumCharge: '0',\n roundingMode: 'floor' as const,\n gracePeriod: 0,\n };\n\n return new FlowController(channelId, rate, billingConfig, config);\n}\n\n/**\n * Create a tiered rate flow controller\n */\nexport function createTieredRateFlow(\n channelId: string,\n baseRate: string,\n tiers: Array<{ threshold: string; rate: string }>,\n config?: FlowConfig,\n): FlowController {\n const rate: StreamRate = {\n type: 'tiered',\n baseRate,\n tiers,\n };\n\n const billingConfig = {\n period: 'realtime' as const,\n minimumCharge: '0',\n roundingMode: 'floor' as const,\n gracePeriod: 0,\n };\n\n return new FlowController(channelId, rate, billingConfig, config);\n}\n","import {\n StreamRate,\n RateAdjustmentRequest,\n} from './types.js';\n\n/**\n * Rate controller configuration\n */\nexport interface RateControllerConfig {\n maxChangePercent?: number; // Max rate change per adjustment (percentage)\n minChangeInterval?: number; // Minimum time between changes (seconds)\n smoothingFactor?: number; // For dynamic rates (0-1)\n}\n\n/**\n * Rate history entry\n */\nexport interface RateHistoryEntry {\n timestamp: number;\n rate: string;\n reason: string;\n previousRate: string;\n}\n\n/**\n * Rate controller for managing and adjusting streaming rates\n */\nexport class RateController {\n private currentRate: StreamRate;\n private config: Required<RateControllerConfig>;\n private history: RateHistoryEntry[] = [];\n private lastChangeTime: number = 0;\n\n constructor(\n initialRate: StreamRate,\n config: RateControllerConfig = {},\n ) {\n this.currentRate = { ...initialRate };\n this.config = {\n maxChangePercent: config.maxChangePercent ?? 50,\n minChangeInterval: config.minChangeInterval ?? 60,\n smoothingFactor: config.smoothingFactor ?? 0.3,\n };\n }\n\n /**\n * Get current rate configuration\n */\n getRate(): StreamRate {\n return { ...this.currentRate };\n }\n\n /**\n * Get current effective rate\n */\n getEffectiveRate(totalUsage?: string): string {\n if (this.currentRate.type === 'fixed') {\n return this.currentRate.baseRate;\n }\n\n if (this.currentRate.type === 'tiered' && this.currentRate.tiers && totalUsage) {\n return this.calculateTieredRate(totalUsage);\n }\n\n return this.currentRate.baseRate;\n }\n\n /**\n * Request rate adjustment\n */\n adjustRate(request: RateAdjustmentRequest): {\n success: boolean;\n error?: string;\n newRate?: string;\n adjustedAmount?: string;\n } {\n const now = Date.now();\n\n // Check minimum interval\n const timeSinceLastChange = (now - this.lastChangeTime) / 1000;\n if (timeSinceLastChange < this.config.minChangeInterval) {\n return {\n success: false,\n error: `Rate can only be changed every ${this.config.minChangeInterval} seconds`,\n };\n }\n\n // Validate new rate\n const newRateBigInt = BigInt(request.newRate);\n if (newRateBigInt <= 0n) {\n return { success: false, error: 'Rate must be positive' };\n }\n\n // Check rate bounds\n if (this.currentRate.minRate && newRateBigInt < BigInt(this.currentRate.minRate)) {\n return {\n success: false,\n error: `Rate cannot be below minimum: ${this.currentRate.minRate}`,\n };\n }\n\n if (this.currentRate.maxRate && newRateBigInt > BigInt(this.currentRate.maxRate)) {\n return {\n success: false,\n error: `Rate cannot exceed maximum: ${this.currentRate.maxRate}`,\n };\n }\n\n // Check max change percentage\n const currentRateBigInt = BigInt(this.currentRate.baseRate);\n const changePercent = this.calculateChangePercent(currentRateBigInt, newRateBigInt);\n\n let adjustedRate = request.newRate;\n\n if (changePercent > this.config.maxChangePercent) {\n // Apply max change limit\n adjustedRate = this.applyMaxChange(\n currentRateBigInt,\n newRateBigInt,\n this.config.maxChangePercent,\n );\n }\n\n // Record history\n this.history.push({\n timestamp: now,\n rate: adjustedRate,\n reason: request.reason,\n previousRate: this.currentRate.baseRate,\n });\n\n // Update rate\n this.currentRate.baseRate = adjustedRate;\n this.lastChangeTime = now;\n\n return {\n success: true,\n newRate: adjustedRate,\n adjustedAmount: adjustedRate !== request.newRate ? adjustedRate : undefined,\n };\n }\n\n /**\n * Set rate bounds\n */\n setBounds(minRate?: string, maxRate?: string): void {\n if (minRate !== undefined) {\n this.currentRate.minRate = minRate;\n }\n if (maxRate !== undefined) {\n this.currentRate.maxRate = maxRate;\n }\n }\n\n /**\n * Add or update a tier\n */\n addTier(threshold: string, rate: string): void {\n if (this.currentRate.type !== 'tiered') {\n this.currentRate.type = 'tiered';\n this.currentRate.tiers = [];\n }\n\n const tiers = this.currentRate.tiers ?? [];\n const existingIndex = tiers.findIndex(t => t.threshold === threshold);\n\n if (existingIndex >= 0) {\n tiers[existingIndex].rate = rate;\n } else {\n tiers.push({ threshold, rate });\n // Sort by threshold\n tiers.sort((a, b) => {\n return BigInt(a.threshold) < BigInt(b.threshold) ? -1 : 1;\n });\n }\n\n this.currentRate.tiers = tiers;\n }\n\n /**\n * Remove a tier\n */\n removeTier(threshold: string): boolean {\n if (!this.currentRate.tiers) return false;\n\n const initialLength = this.currentRate.tiers.length;\n this.currentRate.tiers = this.currentRate.tiers.filter(\n t => t.threshold !== threshold,\n );\n\n return this.currentRate.tiers.length < initialLength;\n }\n\n /**\n * Get rate history\n */\n getHistory(): RateHistoryEntry[] {\n return [...this.history];\n }\n\n /**\n * Calculate average rate over time period\n */\n getAverageRate(startTime: number, endTime: number): string {\n const relevantHistory = this.history.filter(\n h => h.timestamp >= startTime && h.timestamp <= endTime,\n );\n\n if (relevantHistory.length === 0) {\n return this.currentRate.baseRate;\n }\n\n // Weight-average by time\n let totalWeight = 0n;\n let weightedSum = 0n;\n let prevTime = startTime;\n\n for (const entry of relevantHistory) {\n const duration = BigInt(entry.timestamp - prevTime);\n weightedSum += BigInt(entry.previousRate) * duration;\n totalWeight += duration;\n prevTime = entry.timestamp;\n }\n\n // Add final period\n const finalDuration = BigInt(endTime - prevTime);\n weightedSum += BigInt(this.currentRate.baseRate) * finalDuration;\n totalWeight += finalDuration;\n\n if (totalWeight === 0n) {\n return this.currentRate.baseRate;\n }\n\n return (weightedSum / totalWeight).toString();\n }\n\n /**\n * Calculate rate for dynamic pricing based on demand\n */\n calculateDynamicRate(\n demand: number, // 0-1 representing demand level\n _baseRate?: string,\n ): string {\n const base = BigInt(this.currentRate.baseRate);\n const min = this.currentRate.minRate ? BigInt(this.currentRate.minRate) : base / 2n;\n const max = this.currentRate.maxRate ? BigInt(this.currentRate.maxRate) : base * 2n;\n\n // Linear interpolation based on demand\n const range = max - min;\n const adjustment = BigInt(Math.floor(Number(range) * demand));\n\n return (min + adjustment).toString();\n }\n\n /**\n * Apply exponential smoothing for rate changes\n */\n smoothRate(targetRate: string): string {\n const current = BigInt(this.currentRate.baseRate);\n const target = BigInt(targetRate);\n const alpha = this.config.smoothingFactor;\n\n // Exponential smoothing: new = alpha * target + (1 - alpha) * current\n const smoothed = BigInt(Math.floor(\n alpha * Number(target) + (1 - alpha) * Number(current),\n ));\n\n return smoothed.toString();\n }\n\n private calculateTieredRate(totalUsage: string): string {\n const usage = BigInt(totalUsage);\n const tiers = this.currentRate.tiers ?? [];\n\n // Find the highest applicable tier\n let applicableRate = this.currentRate.baseRate;\n\n for (const tier of tiers) {\n if (usage >= BigInt(tier.threshold)) {\n applicableRate = tier.rate;\n }\n }\n\n return applicableRate;\n }\n\n private calculateChangePercent(from: bigint, to: bigint): number {\n if (from === 0n) return 100;\n const diff = to > from ? to - from : from - to;\n return Number((diff * 100n) / from);\n }\n\n private applyMaxChange(from: bigint, to: bigint, maxPercent: number): string {\n const maxChange = (from * BigInt(maxPercent)) / 100n;\n\n if (to > from) {\n return (from + maxChange).toString();\n } else {\n return (from - maxChange).toString();\n }\n }\n}\n\n/**\n * Rate limiter for preventing abuse\n */\nexport class RateLimiter {\n private requests: Map<string, number[]> = new Map();\n private maxRequests: number;\n private windowMs: number;\n\n constructor(maxRequests: number = 10, windowMs: number = 60000) {\n this.maxRequests = maxRequests;\n this.windowMs = windowMs;\n }\n\n /**\n * Check if request is allowed\n */\n isAllowed(key: string): boolean {\n const now = Date.now();\n const windowStart = now - this.windowMs;\n\n // Get requests for this key\n let requests = this.requests.get(key) ?? [];\n\n // Filter to only requests in current window\n requests = requests.filter(t => t > windowStart);\n\n if (requests.length >= this.maxRequests) {\n return false;\n }\n\n // Add current request\n requests.push(now);\n this.requests.set(key, requests);\n\n return true;\n }\n\n /**\n * Get remaining requests in window\n */\n getRemainingRequests(key: string): number {\n const now = Date.now();\n const windowStart = now - this.windowMs;\n\n const requests = (this.requests.get(key) ?? []).filter(t => t > windowStart);\n return Math.max(0, this.maxRequests - requests.length);\n }\n\n /**\n * Reset limits for a key\n */\n reset(key: string): void {\n this.requests.delete(key);\n }\n\n /**\n * Clear all limits\n */\n clear(): void {\n this.requests.clear();\n }\n}\n\n/**\n * Calculate optimal rate based on channel parameters\n */\nexport function calculateOptimalRate(\n channelCapacity: string,\n desiredDurationSeconds: number,\n bufferPercent: number = 10,\n): string {\n const capacity = BigInt(channelCapacity);\n const duration = BigInt(desiredDurationSeconds);\n\n if (duration === 0n) {\n return '0';\n }\n\n // Apply buffer (reduce effective capacity)\n const effectiveCapacity = (capacity * BigInt(100 - bufferPercent)) / 100n;\n\n return (effectiveCapacity / duration).toString();\n}\n\n/**\n * Convert rate between time units\n */\nexport function convertRate(\n rate: string,\n fromUnit: 'second' | 'minute' | 'hour' | 'day',\n toUnit: 'second' | 'minute' | 'hour' | 'day',\n): string {\n const unitToSeconds: Record<string, number> = {\n second: 1,\n minute: 60,\n hour: 3600,\n day: 86400,\n };\n\n const fromSeconds = unitToSeconds[fromUnit];\n const toSeconds = unitToSeconds[toUnit];\n\n const rateBigInt = BigInt(rate);\n const perSecond = rateBigInt / BigInt(fromSeconds);\n\n return (perSecond * BigInt(toSeconds)).toString();\n}\n","import {\n MeteringRecord,\n UsageMetrics,\n} from './types.js';\n\n/**\n * Metering configuration\n */\nexport interface MeteringConfig {\n recordInterval?: number; // Record every N seconds\n aggregationInterval?: number; // Aggregate records every N seconds\n maxRecords?: number; // Maximum records to keep\n precision?: number; // Decimal precision for amounts\n}\n\n/**\n * Aggregated usage data\n */\nexport interface AggregatedUsage {\n period: string; // ISO timestamp of period start\n totalAmount: string;\n totalDuration: number;\n averageRate: string;\n recordCount: number;\n}\n\n/**\n * Metering manager for tracking usage\n */\nexport class MeteringManager {\n private records: MeteringRecord[] = [];\n private config: Required<MeteringConfig>;\n private sessionId: string;\n private startTime: number;\n\n constructor(sessionId: string, config: MeteringConfig = {}) {\n this.sessionId = sessionId;\n this.startTime = Date.now();\n this.config = {\n recordInterval: config.recordInterval ?? 1,\n aggregationInterval: config.aggregationInterval ?? 3600,\n maxRecords: config.maxRecords ?? 10000,\n precision: config.precision ?? 18,\n };\n }\n\n /**\n * Record usage\n */\n record(\n duration: number,\n amount: string,\n rate: string,\n metadata?: Record<string, unknown>,\n ): MeteringRecord {\n const cumulative = this.calculateCumulative(amount);\n\n const record: MeteringRecord = {\n timestamp: Date.now(),\n duration,\n amount,\n rate,\n cumulative,\n metadata,\n };\n\n this.records.push(record);\n\n // Prune old records if needed\n if (this.records.length > this.config.maxRecords) {\n this.pruneRecords();\n }\n\n return record;\n }\n\n /**\n * Get all records\n */\n getRecords(): MeteringRecord[] {\n return [...this.records];\n }\n\n /**\n * Get records in time range\n */\n getRecordsInRange(startTime: number, endTime: number): MeteringRecord[] {\n return this.records.filter(\n r => r.timestamp >= startTime && r.timestamp <= endTime,\n );\n }\n\n /**\n * Calculate usage metrics\n */\n getMetrics(): UsageMetrics {\n if (this.records.length === 0) {\n return {\n totalSeconds: 0,\n totalAmount: '0',\n averageRate: '0',\n peakRate: '0',\n startTime: this.startTime,\n };\n }\n\n const totalSeconds = this.records.reduce((sum, r) => sum + r.duration, 0);\n const totalAmount = this.records[this.records.length - 1].cumulative;\n const rates = this.records.map(r => BigInt(r.rate));\n const peakRate = rates.length > 0 ? rates.reduce((max, r) => r > max ? r : max, 0n) : 0n;\n\n const averageRate = totalSeconds > 0\n ? (BigInt(totalAmount) / BigInt(totalSeconds)).toString()\n : '0';\n\n return {\n totalSeconds,\n totalAmount,\n averageRate,\n peakRate: peakRate.toString(),\n startTime: this.startTime,\n endTime: this.records[this.records.length - 1].timestamp,\n hourly: this.getHourlyBreakdown(),\n };\n }\n\n /**\n * Get aggregated usage by period\n */\n aggregate(intervalSeconds: number = 3600): AggregatedUsage[] {\n if (this.records.length === 0) return [];\n\n const aggregated: AggregatedUsage[] = [];\n const intervalMs = intervalSeconds * 1000;\n\n // Group records by interval\n const groups = new Map<number, MeteringRecord[]>();\n\n for (const record of this.records) {\n const periodStart = Math.floor(record.timestamp / intervalMs) * intervalMs;\n const existing = groups.get(periodStart) ?? [];\n existing.push(record);\n groups.set(periodStart, existing);\n }\n\n // Calculate aggregates for each group\n for (const [periodStart, records] of groups) {\n const totalAmount = records.reduce(\n (sum, r) => sum + BigInt(r.amount),\n 0n,\n );\n const totalDuration = records.reduce((sum, r) => sum + r.duration, 0);\n const averageRate = totalDuration > 0\n ? (totalAmount / BigInt(totalDuration)).toString()\n : '0';\n\n aggregated.push({\n period: new Date(periodStart).toISOString(),\n totalAmount: totalAmount.toString(),\n totalDuration,\n averageRate,\n recordCount: records.length,\n });\n }\n\n return aggregated.sort((a, b) => a.period.localeCompare(b.period));\n }\n\n /**\n * Get cumulative amount at a point in time\n */\n getCumulativeAt(timestamp: number): string {\n // Find the last record before or at the timestamp\n for (let i = this.records.length - 1; i >= 0; i--) {\n if (this.records[i].timestamp <= timestamp) {\n return this.records[i].cumulative;\n }\n }\n return '0';\n }\n\n /**\n * Calculate usage for billing period\n */\n getUsageForBillingPeriod(\n startTime: number,\n endTime: number,\n ): { amount: string; duration: number; records: number } {\n const periodRecords = this.getRecordsInRange(startTime, endTime);\n\n const amount = periodRecords.reduce(\n (sum, r) => sum + BigInt(r.amount),\n 0n,\n );\n const duration = periodRecords.reduce((sum, r) => sum + r.duration, 0);\n\n return {\n amount: amount.toString(),\n duration,\n records: periodRecords.length,\n };\n }\n\n /**\n * Export records for backup/audit\n */\n export(): string {\n return JSON.stringify({\n sessionId: this.sessionId,\n startTime: this.startTime,\n records: this.records,\n exportedAt: Date.now(),\n });\n }\n\n /**\n * Import records from backup\n */\n import(data: string): { success: boolean; recordsImported: number } {\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.sessionId !== this.sessionId) {\n return { success: false, recordsImported: 0 };\n }\n\n const importedRecords = parsed.records as MeteringRecord[];\n let importedCount = 0;\n\n for (const record of importedRecords) {\n // Only import records we don't have\n const exists = this.records.some(r => r.timestamp === record.timestamp);\n if (!exists) {\n this.records.push(record);\n importedCount++;\n }\n }\n\n // Re-sort by timestamp\n this.records.sort((a, b) => a.timestamp - b.timestamp);\n\n return { success: true, recordsImported: importedCount };\n } catch {\n return { success: false, recordsImported: 0 };\n }\n }\n\n /**\n * Clear all records\n */\n clear(): void {\n this.records = [];\n }\n\n private calculateCumulative(newAmount: string): string {\n if (this.records.length === 0) {\n return newAmount;\n }\n\n const lastCumulative = BigInt(this.records[this.records.length - 1].cumulative);\n return (lastCumulative + BigInt(newAmount)).toString();\n }\n\n private pruneRecords(): void {\n // Keep first record (for reference), and last N records\n const keepCount = this.config.maxRecords;\n if (this.records.length <= keepCount) return;\n\n const first = this.records[0];\n const recent = this.records.slice(-(keepCount - 1));\n\n this.records = [first, ...recent];\n }\n\n private getHourlyBreakdown(): UsageMetrics['hourly'] {\n const hourlyMap = new Map<number, { amount: bigint; seconds: number }>();\n\n for (const record of this.records) {\n const hour = new Date(record.timestamp).getUTCHours();\n const existing = hourlyMap.get(hour) ?? { amount: 0n, seconds: 0 };\n existing.amount += BigInt(record.amount);\n existing.seconds += record.duration;\n hourlyMap.set(hour, existing);\n }\n\n return Array.from(hourlyMap.entries()).map(([hour, data]) => ({\n hour,\n amount: data.amount.toString(),\n seconds: data.seconds,\n }));\n }\n}\n\n/**\n * Calculate pro-rated usage for partial periods\n */\nexport function calculateProRatedUsage(\n fullPeriodAmount: string,\n fullPeriodSeconds: number,\n actualSeconds: number,\n): string {\n if (fullPeriodSeconds === 0) return '0';\n\n const amount = BigInt(fullPeriodAmount);\n return ((amount * BigInt(actualSeconds)) / BigInt(fullPeriodSeconds)).toString();\n}\n\n/**\n * Estimate usage based on historical data\n */\nexport function estimateUsage(\n metrics: UsageMetrics,\n futureSeconds: number,\n): string {\n if (metrics.totalSeconds === 0) return '0';\n\n const avgRate = BigInt(metrics.averageRate);\n return (avgRate * BigInt(futureSeconds)).toString();\n}\n\n/**\n * Compare usage across periods\n */\nexport function compareUsage(\n current: UsageMetrics,\n previous: UsageMetrics,\n): {\n amountChange: string;\n amountChangePercent: number;\n rateChange: string;\n rateChangePercent: number;\n} {\n const currentAmount = BigInt(current.totalAmount);\n const previousAmount = BigInt(previous.totalAmount);\n const amountChange = currentAmount - previousAmount;\n const amountChangePercent = previousAmount > 0n\n ? Number((amountChange * 100n) / previousAmount)\n : 0;\n\n const currentRate = BigInt(current.averageRate);\n const previousRate = BigInt(previous.averageRate);\n const rateChange = currentRate - previousRate;\n const rateChangePercent = previousRate > 0n\n ? Number((rateChange * 100n) / previousRate)\n : 0;\n\n return {\n amountChange: amountChange.toString(),\n amountChangePercent,\n rateChange: rateChange.toString(),\n rateChangePercent,\n };\n}\n","import {\n BillingConfig,\n BillingPeriod,\n Invoice,\n InvoiceItem,\n MeteringRecord,\n} from './types.js';\n\n/**\n * Billing manager configuration\n */\nexport interface BillingManagerConfig {\n autoInvoice?: boolean;\n invoiceInterval?: number; // Generate invoice every N seconds\n currency?: string;\n taxRate?: number; // 0-1\n}\n\n/**\n * Billing manager for generating invoices from metering data\n */\nexport class BillingManager {\n private config: Required<BillingManagerConfig>;\n private billingConfig: BillingConfig;\n private invoices: Invoice[] = [];\n private channelId: string;\n private payer: string;\n private payee: string;\n private lastInvoiceTime: number;\n\n constructor(\n channelId: string,\n payer: string,\n payee: string,\n billingConfig: BillingConfig,\n config: BillingManagerConfig = {},\n ) {\n this.channelId = channelId;\n this.payer = payer;\n this.payee = payee;\n this.billingConfig = billingConfig;\n this.lastInvoiceTime = Date.now();\n\n this.config = {\n autoInvoice: config.autoInvoice ?? false,\n invoiceInterval: config.invoiceInterval ?? 86400,\n currency: config.currency ?? 'USDT',\n taxRate: config.taxRate ?? 0,\n };\n }\n\n /**\n * Generate invoice from metering records\n */\n generateInvoice(\n records: MeteringRecord[],\n startTime: number,\n endTime: number,\n ): Invoice {\n const items = this.createInvoiceItems(records, startTime, endTime);\n const subtotal = this.calculateSubtotal(items);\n const fees = this.calculateFees(subtotal);\n const total = (BigInt(subtotal) + BigInt(fees)).toString();\n\n const invoice: Invoice = {\n id: this.generateInvoiceId(),\n channelId: this.channelId,\n payer: this.payer,\n payee: this.payee,\n items,\n subtotal,\n fees,\n total,\n currency: this.config.currency,\n status: 'pending',\n createdAt: Date.now(),\n dueAt: Date.now() + 86400000, // Due in 24 hours\n };\n\n this.invoices.push(invoice);\n this.lastInvoiceTime = endTime;\n\n return invoice;\n }\n\n /**\n * Get all invoices\n */\n getInvoices(): Invoice[] {\n return [...this.invoices];\n }\n\n /**\n * Get invoice by ID\n */\n getInvoice(id: string): Invoice | undefined {\n return this.invoices.find(inv => inv.id === id);\n }\n\n /**\n * Mark invoice as paid\n */\n markPaid(invoiceId: string): boolean {\n const invoice = this.invoices.find(inv => inv.id === invoiceId);\n if (!invoice || invoice.status !== 'pending') {\n return false;\n }\n\n invoice.status = 'paid';\n invoice.paidAt = Date.now();\n return true;\n }\n\n /**\n * Mark invoice as settled\n */\n markSettled(invoiceId: string): boolean {\n const invoice = this.invoices.find(inv => inv.id === invoiceId);\n if (!invoice) return false;\n\n invoice.status = 'settled';\n return true;\n }\n\n /**\n * Get pending amount\n */\n getPendingAmount(): string {\n return this.invoices\n .filter(inv => inv.status === 'pending')\n .reduce((sum, inv) => sum + BigInt(inv.total), 0n)\n .toString();\n }\n\n /**\n * Get total billed amount\n */\n getTotalBilled(): string {\n return this.invoices\n .reduce((sum, inv) => sum + BigInt(inv.total), 0n)\n .toString();\n }\n\n /**\n * Check if new invoice is due\n */\n isInvoiceDue(currentTime: number): boolean {\n const elapsed = currentTime - this.lastInvoiceTime;\n return elapsed >= this.config.invoiceInterval * 1000;\n }\n\n /**\n * Calculate amount for billing period\n */\n calculatePeriodAmount(\n rate: string,\n durationSeconds: number,\n ): string {\n const periodSeconds = this.getPeriodSeconds(this.billingConfig.period);\n const periods = durationSeconds / periodSeconds;\n\n const amount = BigInt(rate) * BigInt(Math.floor(periods * periodSeconds));\n\n // Apply rounding\n return this.applyRounding(amount.toString());\n }\n\n /**\n * Apply minimum charge\n */\n applyMinimumCharge(amount: string): string {\n const minCharge = BigInt(this.billingConfig.minimumCharge);\n const actualAmount = BigInt(amount);\n\n return (actualAmount < minCharge ? minCharge : actualAmount).toString();\n }\n\n /**\n * Calculate grace period savings\n */\n calculateGracePeriodSavings(\n rate: string,\n totalDuration: number,\n ): string {\n const gracePeriod = this.billingConfig.gracePeriod;\n if (gracePeriod <= 0 || totalDuration <= gracePeriod) {\n return '0';\n }\n\n // Savings is the amount that would have been charged during grace period\n return (BigInt(rate) * BigInt(Math.min(gracePeriod, totalDuration))).toString();\n }\n\n /**\n * Get billing summary\n */\n getSummary(): {\n totalInvoices: number;\n totalBilled: string;\n totalPaid: string;\n totalPending: string;\n averageInvoice: string;\n } {\n const totalBilled = this.getTotalBilled();\n const totalPaid = this.invoices\n .filter(inv => inv.status === 'paid' || inv.status === 'settled')\n .reduce((sum, inv) => sum + BigInt(inv.total), 0n)\n .toString();\n const totalPending = this.getPendingAmount();\n const averageInvoice = this.invoices.length > 0\n ? (BigInt(totalBilled) / BigInt(this.invoices.length)).toString()\n : '0';\n\n return {\n totalInvoices: this.invoices.length,\n totalBilled,\n totalPaid,\n totalPending,\n averageInvoice,\n };\n }\n\n /**\n * Export billing data\n */\n export(): string {\n return JSON.stringify({\n channelId: this.channelId,\n invoices: this.invoices,\n exportedAt: Date.now(),\n });\n }\n\n private createInvoiceItems(\n records: MeteringRecord[],\n startTime: number,\n endTime: number,\n ): InvoiceItem[] {\n if (records.length === 0) {\n return [];\n }\n\n // Group records by rate for separate line items\n const rateGroups = new Map<string, MeteringRecord[]>();\n\n for (const record of records) {\n const existing = rateGroups.get(record.rate) ?? [];\n existing.push(record);\n rateGroups.set(record.rate, existing);\n }\n\n const items: InvoiceItem[] = [];\n\n for (const [rate, groupRecords] of rateGroups) {\n const totalDuration = groupRecords.reduce((sum, r) => sum + r.duration, 0);\n const totalAmount = groupRecords.reduce(\n (sum, r) => sum + BigInt(r.amount),\n 0n,\n );\n\n const periodName = this.getPeriodName(this.billingConfig.period);\n const quantity = this.calculateQuantity(totalDuration);\n\n items.push({\n description: `Streaming usage at ${rate} per ${periodName}`,\n quantity,\n rate,\n amount: totalAmount.toString(),\n startTime,\n endTime,\n });\n }\n\n return items;\n }\n\n private calculateSubtotal(items: InvoiceItem[]): string {\n return items\n .reduce((sum, item) => sum + BigInt(item.amount), 0n)\n .toString();\n }\n\n private calculateFees(subtotal: string): string {\n const amount = BigInt(subtotal);\n const taxRate = this.config.taxRate;\n\n if (taxRate <= 0) return '0';\n\n // Calculate tax/fees\n return BigInt(Math.floor(Number(amount) * taxRate)).toString();\n }\n\n private applyRounding(amount: string): string {\n const value = BigInt(amount);\n const mode = this.billingConfig.roundingMode;\n\n // For bigint, rounding is mainly about precision truncation\n // In real implementation, this would handle decimal places\n switch (mode) {\n case 'floor':\n return value.toString();\n case 'ceil':\n return value.toString();\n case 'round':\n return value.toString();\n default:\n return value.toString();\n }\n }\n\n private getPeriodSeconds(period: BillingPeriod): number {\n switch (period) {\n case 'realtime':\n case 'second':\n return 1;\n case 'minute':\n return 60;\n case 'hour':\n return 3600;\n case 'day':\n return 86400;\n }\n }\n\n private getPeriodName(period: BillingPeriod): string {\n switch (period) {\n case 'realtime':\n case 'second':\n return 'second';\n case 'minute':\n return 'minute';\n case 'hour':\n return 'hour';\n case 'day':\n return 'day';\n }\n }\n\n private calculateQuantity(totalSeconds: number): number {\n const periodSeconds = this.getPeriodSeconds(this.billingConfig.period);\n return totalSeconds / periodSeconds;\n }\n\n private generateInvoiceId(): string {\n return `inv_${this.channelId.slice(-8)}_${Date.now().toString(36)}`;\n }\n}\n\n/**\n * Format currency amount for display\n */\nexport function formatCurrencyAmount(\n amount: string,\n decimals: number = 6,\n symbol: string = 'USDT',\n): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = value / divisor;\n const fractionalPart = value % divisor;\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0');\n const trimmedFractional = fractionalStr.replace(/0+$/, '') || '0';\n\n return `${wholePart}.${trimmedFractional} ${symbol}`;\n}\n\n/**\n * Parse currency amount from display format\n */\nexport function parseCurrencyAmount(\n display: string,\n decimals: number = 6,\n): string {\n // Remove currency symbol and whitespace\n const cleaned = display.replace(/[^\\d.]/g, '');\n const [whole, fractional = ''] = cleaned.split('.');\n\n const paddedFractional = fractional.slice(0, decimals).padEnd(decimals, '0');\n const combined = whole + paddedFractional;\n\n return BigInt(combined).toString();\n}\n\n/**\n * Calculate estimated bill for future period\n */\nexport function estimateFutureBill(\n currentRate: string,\n durationSeconds: number,\n minimumCharge: string = '0',\n): string {\n const estimated = BigInt(currentRate) * BigInt(durationSeconds);\n const minimum = BigInt(minimumCharge);\n\n return (estimated < minimum ? minimum : estimated).toString();\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@t402/streaming-payments",
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"description": "Streaming payments with payment channels for T402 Protocol",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/t402-io/t402.git",
|
|
10
|
+
"directory": "typescript/packages/advanced/streaming-payments"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"module": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./channels": {
|
|
21
|
+
"import": "./dist/channels/index.js",
|
|
22
|
+
"types": "./dist/channels/index.d.ts"
|
|
23
|
+
},
|
|
24
|
+
"./streaming": {
|
|
25
|
+
"import": "./dist/streaming/index.js",
|
|
26
|
+
"types": "./dist/streaming/index.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"./settlement": {
|
|
29
|
+
"import": "./dist/settlement/index.js",
|
|
30
|
+
"types": "./dist/settlement/index.d.ts"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsup",
|
|
35
|
+
"dev": "tsup --watch",
|
|
36
|
+
"test": "vitest",
|
|
37
|
+
"test:run": "vitest run",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"clean": "rm -rf dist"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"zod": "^3.24.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.10.1",
|
|
46
|
+
"tsup": "^8.3.5",
|
|
47
|
+
"typescript": "^5.7.2",
|
|
48
|
+
"vitest": "^2.1.8"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist",
|
|
52
|
+
"README.md"
|
|
53
|
+
],
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
}
|
|
60
|
+
}
|