@push.rocks/smartproxy 18.0.2 → 18.2.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.
Files changed (53) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/certificate/certificate-manager.d.ts +150 -0
  3. package/dist_ts/certificate/certificate-manager.js +505 -0
  4. package/dist_ts/certificate/events/simplified-events.d.ts +56 -0
  5. package/dist_ts/certificate/events/simplified-events.js +13 -0
  6. package/dist_ts/certificate/models/certificate-errors.d.ts +69 -0
  7. package/dist_ts/certificate/models/certificate-errors.js +141 -0
  8. package/dist_ts/certificate/models/certificate-strategy.d.ts +60 -0
  9. package/dist_ts/certificate/models/certificate-strategy.js +73 -0
  10. package/dist_ts/certificate/simplified-certificate-manager.d.ts +150 -0
  11. package/dist_ts/certificate/simplified-certificate-manager.js +501 -0
  12. package/dist_ts/http/index.d.ts +1 -9
  13. package/dist_ts/http/index.js +5 -11
  14. package/dist_ts/plugins.d.ts +3 -1
  15. package/dist_ts/plugins.js +4 -2
  16. package/dist_ts/proxies/network-proxy/network-proxy.js +3 -1
  17. package/dist_ts/proxies/network-proxy/simplified-certificate-bridge.d.ts +48 -0
  18. package/dist_ts/proxies/network-proxy/simplified-certificate-bridge.js +76 -0
  19. package/dist_ts/proxies/network-proxy/websocket-handler.js +41 -4
  20. package/dist_ts/proxies/smart-proxy/cert-store.d.ts +10 -0
  21. package/dist_ts/proxies/smart-proxy/cert-store.js +70 -0
  22. package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +116 -0
  23. package/dist_ts/proxies/smart-proxy/certificate-manager.js +401 -0
  24. package/dist_ts/proxies/smart-proxy/legacy-smart-proxy.d.ts +168 -0
  25. package/dist_ts/proxies/smart-proxy/legacy-smart-proxy.js +642 -0
  26. package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +26 -0
  27. package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
  28. package/dist_ts/proxies/smart-proxy/models/simplified-smartproxy-config.d.ts +65 -0
  29. package/dist_ts/proxies/smart-proxy/models/simplified-smartproxy-config.js +31 -0
  30. package/dist_ts/proxies/smart-proxy/models/smartproxy-options.d.ts +102 -0
  31. package/dist_ts/proxies/smart-proxy/models/smartproxy-options.js +73 -0
  32. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +10 -44
  33. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +66 -202
  34. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +4 -0
  35. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +62 -2
  36. package/dist_ts/proxies/smart-proxy/simplified-smart-proxy.d.ts +41 -0
  37. package/dist_ts/proxies/smart-proxy/simplified-smart-proxy.js +132 -0
  38. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +18 -13
  39. package/dist_ts/proxies/smart-proxy/smart-proxy.js +79 -196
  40. package/package.json +7 -5
  41. package/readme.md +224 -10
  42. package/readme.plan.md +1405 -617
  43. package/ts/00_commitinfo_data.ts +1 -1
  44. package/ts/http/index.ts +5 -12
  45. package/ts/plugins.ts +4 -1
  46. package/ts/proxies/network-proxy/network-proxy.ts +3 -0
  47. package/ts/proxies/network-proxy/websocket-handler.ts +38 -3
  48. package/ts/proxies/smart-proxy/cert-store.ts +86 -0
  49. package/ts/proxies/smart-proxy/certificate-manager.ts +506 -0
  50. package/ts/proxies/smart-proxy/models/route-types.ts +33 -3
  51. package/ts/proxies/smart-proxy/network-proxy-bridge.ts +86 -239
  52. package/ts/proxies/smart-proxy/route-connection-handler.ts +74 -1
  53. package/ts/proxies/smart-proxy/smart-proxy.ts +105 -222
@@ -0,0 +1,501 @@
1
+ /**
2
+ * Simplified, unified certificate manager for SmartProxy
3
+ */
4
+ import * as plugins from '../plugins.js';
5
+ import * as path from 'path';
6
+ import * as fs from 'fs/promises';
7
+ import { CertificateError, CertificateErrors } from './models/certificate-errors.js';
8
+ import { CertificateEvent } from './events/simplified-events.js';
9
+ /**
10
+ * Unified certificate manager
11
+ */
12
+ export class SimplifiedCertificateManager extends plugins.EventEmitter {
13
+ constructor(config) {
14
+ super();
15
+ this.certificateCache = new Map();
16
+ this.pendingRequests = new Map();
17
+ // Validate configuration
18
+ if (!config.certProvider) {
19
+ throw CertificateErrors.noCertProvider();
20
+ }
21
+ if (!config.acmeEmail) {
22
+ throw CertificateErrors.missingAcmeEmail();
23
+ }
24
+ // Set defaults
25
+ this.config = {
26
+ ...config,
27
+ storageDir: config.storageDir || './certs',
28
+ renewBeforeDays: config.renewBeforeDays || 30,
29
+ defaultCertPath: config.defaultCertPath || path.join(process.cwd(), 'assets/certs/cert.pem'),
30
+ defaultKeyPath: config.defaultKeyPath || path.join(process.cwd(), 'assets/certs/key.pem')
31
+ };
32
+ // Ensure storage directory exists
33
+ this.ensureStorageDir();
34
+ }
35
+ /**
36
+ * Initialize the certificate manager
37
+ */
38
+ async start() {
39
+ // Initialize ACME client
40
+ await this.initializeAcmeClient();
41
+ // Load stored certificates
42
+ await this.loadStoredCertificates();
43
+ // Start renewal timer
44
+ this.startRenewalTimer();
45
+ }
46
+ /**
47
+ * Stop the certificate manager
48
+ */
49
+ async stop() {
50
+ if (this.renewalTimer) {
51
+ clearInterval(this.renewalTimer);
52
+ this.renewalTimer = undefined;
53
+ }
54
+ }
55
+ /**
56
+ * Get a certificate for a domain (main entry point)
57
+ */
58
+ async getCertificate(domain) {
59
+ // Check cache first
60
+ const cached = this.certificateCache.get(domain);
61
+ if (cached && this.isCertificateValid(cached)) {
62
+ return cached;
63
+ }
64
+ // Check for pending request to avoid duplicates
65
+ const pending = this.pendingRequests.get(domain);
66
+ if (pending) {
67
+ return pending;
68
+ }
69
+ // Start new certificate request
70
+ const request = this.requestCertificate(domain);
71
+ this.pendingRequests.set(domain, request);
72
+ try {
73
+ const cert = await request;
74
+ this.pendingRequests.delete(domain);
75
+ return cert;
76
+ }
77
+ catch (error) {
78
+ this.pendingRequests.delete(domain);
79
+ throw error;
80
+ }
81
+ }
82
+ /**
83
+ * Request a new certificate
84
+ */
85
+ async requestCertificate(domain) {
86
+ try {
87
+ // Get strategy from provider
88
+ let strategy;
89
+ try {
90
+ strategy = await this.config.certProvider(domain);
91
+ }
92
+ catch (providerError) {
93
+ throw CertificateErrors.invalidCertProvider(providerError);
94
+ }
95
+ let certificate;
96
+ switch (strategy.type) {
97
+ case 'acme-http':
98
+ certificate = await this.requestAcmeHttpCertificate(domain);
99
+ break;
100
+ case 'acme-dns':
101
+ certificate = await this.requestAcmeDnsCertificate(domain);
102
+ break;
103
+ case 'static':
104
+ certificate = {
105
+ domain,
106
+ certificate: strategy.cert,
107
+ privateKey: strategy.key,
108
+ expiresAt: strategy.expiresAt || new Date(Date.now() + 90 * 24 * 60 * 60 * 1000),
109
+ source: 'static'
110
+ };
111
+ break;
112
+ case 'skip':
113
+ throw CertificateErrors.certificateNotFound(domain);
114
+ default:
115
+ throw CertificateErrors.invalidCertProvider(new Error('Unknown strategy type'));
116
+ }
117
+ // Cache and store
118
+ this.certificateCache.set(domain, certificate);
119
+ await this.storeCertificate(certificate);
120
+ // Emit success event
121
+ this.emit(CertificateEvent.OBTAINED, {
122
+ domain,
123
+ type: 'new',
124
+ expiresAt: certificate.expiresAt,
125
+ source: certificate.source,
126
+ certificate: certificate.certificate,
127
+ privateKey: certificate.privateKey
128
+ });
129
+ return certificate;
130
+ }
131
+ catch (error) {
132
+ const certError = error instanceof CertificateError
133
+ ? error
134
+ : new CertificateError({
135
+ code: 'UNKNOWN_ERROR',
136
+ message: error.message || 'Unknown error',
137
+ domain,
138
+ cause: error
139
+ });
140
+ this.emit(CertificateEvent.FAILED, {
141
+ domain,
142
+ error: certError
143
+ });
144
+ throw certError;
145
+ }
146
+ }
147
+ /**
148
+ * Request certificate via ACME HTTP-01
149
+ */
150
+ async requestAcmeHttpCertificate(domain) {
151
+ if (domain.includes('*')) {
152
+ throw CertificateErrors.wildcardNotSupported(domain);
153
+ }
154
+ try {
155
+ // Create ACME order
156
+ const order = await this.acmeClient.createOrder({
157
+ identifiers: [{ type: 'dns', value: domain }]
158
+ });
159
+ // Get authorization
160
+ const authorization = await this.acmeClient.getAuthorization(order.authorizations[0]);
161
+ const challenge = authorization.challenges.find(c => c.type === 'http-01');
162
+ if (!challenge) {
163
+ throw new Error('No HTTP-01 challenge available');
164
+ }
165
+ // Prepare challenge response
166
+ const keyAuthorization = await this.acmeClient.getChallengeKeyAuthorization(challenge);
167
+ // Set up HTTP responder (this would integrate with Port80Handler)
168
+ await this.setupHttpChallenge(challenge.token, keyAuthorization);
169
+ // Notify ACME server
170
+ await this.acmeClient.completeChallenge(challenge);
171
+ await this.acmeClient.waitForValidation(challenge);
172
+ // Generate CSR
173
+ const keypair = await this.generateKeypair();
174
+ const csr = await this.generateCsr(domain, keypair);
175
+ // Finalize order
176
+ await this.acmeClient.finalizeOrder(order, csr);
177
+ const cert = await this.acmeClient.getCertificate(order);
178
+ // Clean up challenge
179
+ await this.cleanupHttpChallenge(challenge.token);
180
+ return {
181
+ domain,
182
+ certificate: cert,
183
+ privateKey: keypair.privateKey,
184
+ expiresAt: this.extractExpiryDate(cert),
185
+ source: 'acme-http'
186
+ };
187
+ }
188
+ catch (error) {
189
+ throw CertificateErrors.acmeHttpChallengeFailed(domain, error);
190
+ }
191
+ }
192
+ /**
193
+ * Request certificate via ACME DNS-01
194
+ */
195
+ async requestAcmeDnsCertificate(domain) {
196
+ try {
197
+ // Create ACME order
198
+ const order = await this.acmeClient.createOrder({
199
+ identifiers: [{ type: 'dns', value: domain }]
200
+ });
201
+ // Get authorization
202
+ const authorization = await this.acmeClient.getAuthorization(order.authorizations[0]);
203
+ const challenge = authorization.challenges.find(c => c.type === 'dns-01');
204
+ if (!challenge) {
205
+ throw new Error('No DNS-01 challenge available');
206
+ }
207
+ // Get DNS record value
208
+ const keyAuthorization = await this.acmeClient.getChallengeKeyAuthorization(challenge);
209
+ const dnsRecord = this.acmeClient.keyAuthorizationToDns01(keyAuthorization);
210
+ // Note: Actual DNS record creation would be handled externally
211
+ console.log(`Please create DNS TXT record: _acme-challenge.${domain} = ${dnsRecord}`);
212
+ // In a real implementation, we'd wait for DNS propagation
213
+ // For now, this is a placeholder
214
+ await new Promise(resolve => setTimeout(resolve, 60000)); // Wait 60 seconds
215
+ // Notify ACME server
216
+ await this.acmeClient.completeChallenge(challenge);
217
+ await this.acmeClient.waitForValidation(challenge);
218
+ // Generate CSR
219
+ const keypair = await this.generateKeypair();
220
+ const csr = await this.generateCsr(domain, keypair);
221
+ // Finalize order
222
+ await this.acmeClient.finalizeOrder(order, csr);
223
+ const cert = await this.acmeClient.getCertificate(order);
224
+ return {
225
+ domain,
226
+ certificate: cert,
227
+ privateKey: keypair.privateKey,
228
+ expiresAt: this.extractExpiryDate(cert),
229
+ source: 'acme-dns'
230
+ };
231
+ }
232
+ catch (error) {
233
+ throw CertificateErrors.acmeDnsChallengeFailed(domain, error);
234
+ }
235
+ }
236
+ /**
237
+ * Renew a certificate
238
+ */
239
+ async renewCertificate(domain) {
240
+ const existing = this.certificateCache.get(domain);
241
+ if (!existing) {
242
+ throw CertificateErrors.certificateNotFound(domain);
243
+ }
244
+ try {
245
+ // Request new certificate
246
+ const renewed = await this.requestCertificate(domain);
247
+ // Emit renewal event
248
+ this.emit(CertificateEvent.OBTAINED, {
249
+ domain,
250
+ type: 'renewed',
251
+ expiresAt: renewed.expiresAt,
252
+ source: renewed.source,
253
+ certificate: renewed.certificate,
254
+ privateKey: renewed.privateKey
255
+ });
256
+ return renewed;
257
+ }
258
+ catch (error) {
259
+ throw error;
260
+ }
261
+ }
262
+ /**
263
+ * Check certificates for renewal
264
+ */
265
+ async checkForRenewals() {
266
+ for (const [domain, cert] of this.certificateCache.entries()) {
267
+ if (this.shouldRenew(cert)) {
268
+ try {
269
+ await this.renewCertificate(domain);
270
+ }
271
+ catch (error) {
272
+ console.error(`Failed to renew certificate for ${domain}:`, error);
273
+ }
274
+ }
275
+ else if (this.isExpiringSoon(cert)) {
276
+ this.emit(CertificateEvent.EXPIRING, {
277
+ domain,
278
+ expiresAt: cert.expiresAt,
279
+ daysRemaining: this.getDaysRemaining(cert)
280
+ });
281
+ }
282
+ }
283
+ }
284
+ /**
285
+ * Initialize ACME client
286
+ */
287
+ async initializeAcmeClient() {
288
+ // ACME client initialization placeholder
289
+ // In a real implementation, this would use an ACME library
290
+ console.log(`Initializing ACME client for ${this.config.acmeServer} environment`);
291
+ }
292
+ /**
293
+ * Load stored certificates from disk
294
+ */
295
+ async loadStoredCertificates() {
296
+ try {
297
+ const files = await fs.readdir(this.config.storageDir);
298
+ const certFiles = files.filter(f => f.endsWith('.json'));
299
+ for (const file of certFiles) {
300
+ try {
301
+ const content = await fs.readFile(path.join(this.config.storageDir, file), 'utf-8');
302
+ const cert = JSON.parse(content);
303
+ cert.expiresAt = new Date(cert.expiresAt);
304
+ if (this.isCertificateValid(cert)) {
305
+ this.certificateCache.set(cert.domain, cert);
306
+ }
307
+ }
308
+ catch (error) {
309
+ console.error(`Failed to load certificate ${file}:`, error);
310
+ }
311
+ }
312
+ }
313
+ catch (error) {
314
+ console.error('Failed to load certificates:', error);
315
+ }
316
+ }
317
+ /**
318
+ * Store certificate to disk
319
+ */
320
+ async storeCertificate(cert) {
321
+ const filename = `${cert.domain}.json`;
322
+ const filepath = path.join(this.config.storageDir, filename);
323
+ try {
324
+ await fs.writeFile(filepath, JSON.stringify(cert, null, 2));
325
+ // Also save individual cert and key files
326
+ await fs.writeFile(path.join(this.config.storageDir, `${cert.domain}.crt`), cert.certificate);
327
+ await fs.writeFile(path.join(this.config.storageDir, `${cert.domain}.key`), cert.privateKey);
328
+ // Set proper permissions on key file
329
+ await fs.chmod(path.join(this.config.storageDir, `${cert.domain}.key`), 0o600);
330
+ }
331
+ catch (error) {
332
+ throw CertificateErrors.storageError('write', filepath, error);
333
+ }
334
+ }
335
+ /**
336
+ * Ensure storage directory exists
337
+ */
338
+ async ensureStorageDir() {
339
+ try {
340
+ await fs.mkdir(this.config.storageDir, { recursive: true });
341
+ }
342
+ catch (error) {
343
+ console.error('Failed to create storage directory:', error);
344
+ }
345
+ }
346
+ /**
347
+ * Get or create ACME account key
348
+ */
349
+ async getOrCreateAccountKey() {
350
+ const keyPath = path.join(this.config.storageDir, 'account.key');
351
+ try {
352
+ return await fs.readFile(keyPath, 'utf-8');
353
+ }
354
+ catch {
355
+ // Generate new key - placeholder
356
+ const dummyKey = '-----BEGIN PRIVATE KEY-----\nDUMMY_KEY_FOR_TESTING\n-----END PRIVATE KEY-----';
357
+ await fs.writeFile(keyPath, dummyKey);
358
+ await fs.chmod(keyPath, 0o600);
359
+ return dummyKey;
360
+ }
361
+ }
362
+ /**
363
+ * Generate keypair for certificate
364
+ */
365
+ async generateKeypair() {
366
+ // Keypair generation placeholder
367
+ return {
368
+ privateKey: '-----BEGIN PRIVATE KEY-----\nDUMMY_PRIVATE_KEY\n-----END PRIVATE KEY-----',
369
+ publicKey: '-----BEGIN PUBLIC KEY-----\nDUMMY_PUBLIC_KEY\n-----END PUBLIC KEY-----'
370
+ };
371
+ }
372
+ /**
373
+ * Generate CSR for domain
374
+ */
375
+ async generateCsr(domain, keypair) {
376
+ // CSR generation placeholder
377
+ return `-----BEGIN CERTIFICATE REQUEST-----\nDUMMY_CSR_FOR_${domain}\n-----END CERTIFICATE REQUEST-----`;
378
+ }
379
+ /**
380
+ * Extract expiry date from certificate
381
+ */
382
+ extractExpiryDate(certPem) {
383
+ // Certificate expiry extraction placeholder
384
+ // In a real implementation, this would parse the certificate
385
+ return new Date(Date.now() + 90 * 24 * 60 * 60 * 1000); // 90 days from now
386
+ }
387
+ /**
388
+ * Check if certificate is valid
389
+ */
390
+ isCertificateValid(cert) {
391
+ return cert.expiresAt > new Date();
392
+ }
393
+ /**
394
+ * Check if certificate should be renewed
395
+ */
396
+ shouldRenew(cert) {
397
+ const daysRemaining = this.getDaysRemaining(cert);
398
+ return daysRemaining <= this.config.renewBeforeDays;
399
+ }
400
+ /**
401
+ * Check if certificate is expiring soon
402
+ */
403
+ isExpiringSoon(cert) {
404
+ const daysRemaining = this.getDaysRemaining(cert);
405
+ return daysRemaining <= this.config.renewBeforeDays + 7; // Warn 7 days before renewal
406
+ }
407
+ /**
408
+ * Get days remaining until expiry
409
+ */
410
+ getDaysRemaining(cert) {
411
+ const now = new Date();
412
+ const diff = cert.expiresAt.getTime() - now.getTime();
413
+ return Math.floor(diff / (1000 * 60 * 60 * 24));
414
+ }
415
+ /**
416
+ * Start renewal timer
417
+ */
418
+ startRenewalTimer() {
419
+ // Check every 6 hours
420
+ this.renewalTimer = setInterval(() => {
421
+ this.checkForRenewals().catch(error => {
422
+ console.error('Renewal check failed:', error);
423
+ });
424
+ }, 6 * 60 * 60 * 1000);
425
+ // Also check immediately
426
+ this.checkForRenewals().catch(error => {
427
+ console.error('Initial renewal check failed:', error);
428
+ });
429
+ }
430
+ /**
431
+ * Get default certificate for SNI fallback
432
+ */
433
+ async getDefaultCertificate() {
434
+ try {
435
+ const [cert, key] = await Promise.all([
436
+ fs.readFile(this.config.defaultCertPath, 'utf-8'),
437
+ fs.readFile(this.config.defaultKeyPath, 'utf-8')
438
+ ]);
439
+ return { cert, key };
440
+ }
441
+ catch (error) {
442
+ throw new CertificateError({
443
+ code: 'DEFAULT_CERT_ERROR',
444
+ message: 'Failed to load default certificate',
445
+ solution: 'Ensure default certificate files exist at configured paths',
446
+ cause: error
447
+ });
448
+ }
449
+ }
450
+ /**
451
+ * Set up HTTP challenge responder
452
+ */
453
+ async setupHttpChallenge(token, keyAuthorization) {
454
+ // This would integrate with Port80Handler
455
+ // For now, it's a placeholder
456
+ console.log(`HTTP Challenge: /.well-known/acme-challenge/${token} = ${keyAuthorization}`);
457
+ }
458
+ /**
459
+ * Clean up HTTP challenge
460
+ */
461
+ async cleanupHttpChallenge(token) {
462
+ // This would integrate with Port80Handler
463
+ // For now, it's a placeholder
464
+ console.log(`Cleanup HTTP Challenge: ${token}`);
465
+ }
466
+ /**
467
+ * Type assertion for event emitter
468
+ */
469
+ on(event, listener) {
470
+ return super.on(event, listener);
471
+ }
472
+ off(event, listener) {
473
+ return super.off(event, listener);
474
+ }
475
+ emit(event, data) {
476
+ return super.emit(event, data);
477
+ }
478
+ /**
479
+ * Update routes (placeholder for future implementation)
480
+ */
481
+ async updateRoutes(routes) {
482
+ // Process routes to extract certificate requirements
483
+ for (const route of routes) {
484
+ if (route.action.type === 'forward' &&
485
+ route.action.tls?.mode === 'terminate' &&
486
+ route.action.tls?.certificate === 'auto' &&
487
+ route.match.domains) {
488
+ const domains = Array.isArray(route.match.domains)
489
+ ? route.match.domains
490
+ : [route.match.domains];
491
+ for (const domain of domains) {
492
+ // Trigger certificate retrieval for auto domains
493
+ this.getCertificate(domain).catch(err => {
494
+ console.error(`Failed to get certificate for ${domain}:`, err);
495
+ });
496
+ }
497
+ }
498
+ }
499
+ }
500
+ }
501
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxpZmllZC1jZXJ0aWZpY2F0ZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2VydGlmaWNhdGUvc2ltcGxpZmllZC1jZXJ0aWZpY2F0ZS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUErQmpFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDRCQUE2QixTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT3BFLFlBQVksTUFBZ0M7UUFDMUMsS0FBSyxFQUFFLENBQUM7UUFORixxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUd4RCxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO1FBS3RFLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pCLE1BQU0saUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLEdBQUcsTUFBTTtZQUNULFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLFNBQVM7WUFDMUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlLElBQUksRUFBRTtZQUM3QyxlQUFlLEVBQUUsTUFBTSxD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
@@ -2,14 +2,6 @@
2
2
  * HTTP functionality module
3
3
  */
4
4
  export * from './models/http-types.js';
5
- export * from './port80/index.js';
6
5
  export * from './router/index.js';
7
6
  export * from './redirects/index.js';
8
- import { Port80Handler } from './port80/port80-handler.js';
9
- import { ChallengeResponder } from './port80/challenge-responder.js';
10
- export declare const Http: {
11
- Port80: {
12
- Handler: typeof Port80Handler;
13
- ChallengeResponder: typeof ChallengeResponder;
14
- };
15
- };
7
+ export declare const Http: {};
@@ -3,18 +3,12 @@
3
3
  */
4
4
  // Export types and models
5
5
  export * from './models/http-types.js';
6
- // Export submodules
7
- export * from './port80/index.js';
6
+ // Export submodules (remove port80 export)
8
7
  export * from './router/index.js';
9
8
  export * from './redirects/index.js';
10
- // Import the components we need for the namespace
11
- import { Port80Handler } from './port80/port80-handler.js';
12
- import { ChallengeResponder } from './port80/challenge-responder.js';
13
- // Convenience namespace exports
9
+ // REMOVED: export * from './port80/index.js';
10
+ // Convenience namespace exports (no more Port80)
14
11
  export const Http = {
15
- Port80: {
16
- Handler: Port80Handler,
17
- ChallengeResponder: ChallengeResponder
18
- }
12
+ // Only router and redirect functionality remain
19
13
  };
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9odHRwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsMEJBQTBCO0FBQzFCLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsb0JBQW9CO0FBQ3BCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHNCQUFzQixDQUFDO0FBRXJDLGtEQUFrRDtBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckUsZ0NBQWdDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRztJQUNsQixNQUFNLEVBQUU7UUFDTixPQUFPLEVBQUUsYUFBYTtRQUN0QixrQkFBa0IsRUFBRSxrQkFBa0I7S0FDdkM7Q0FDRixDQUFDIn0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9odHRwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsMEJBQTBCO0FBQzFCLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsMkNBQTJDO0FBQzNDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyw4Q0FBOEM7QUFFOUMsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRztBQUNsQixnREFBZ0Q7Q0FDakQsQ0FBQyJ9
@@ -14,11 +14,13 @@ import * as smartdelay from '@push.rocks/smartdelay';
14
14
  import * as smartpromise from '@push.rocks/smartpromise';
15
15
  import * as smartrequest from '@push.rocks/smartrequest';
16
16
  import * as smartstring from '@push.rocks/smartstring';
17
+ import * as smartfile from '@push.rocks/smartfile';
18
+ import * as smartcrypto from '@push.rocks/smartcrypto';
17
19
  import * as smartacme from '@push.rocks/smartacme';
18
20
  import * as smartacmePlugins from '@push.rocks/smartacme/dist_ts/smartacme.plugins.js';
19
21
  import * as smartacmeHandlers from '@push.rocks/smartacme/dist_ts/handlers/index.js';
20
22
  import * as taskbuffer from '@push.rocks/taskbuffer';
21
- export { lik, smartdelay, smartrequest, smartpromise, smartstring, smartacme, smartacmePlugins, smartacmeHandlers, taskbuffer, };
23
+ export { lik, smartdelay, smartrequest, smartpromise, smartstring, smartfile, smartcrypto, smartacme, smartacmePlugins, smartacmeHandlers, taskbuffer, };
22
24
  import prettyMs from 'pretty-ms';
23
25
  import * as ws from 'ws';
24
26
  import wsDefault from 'ws';
@@ -17,15 +17,17 @@ import * as smartdelay from '@push.rocks/smartdelay';
17
17
  import * as smartpromise from '@push.rocks/smartpromise';
18
18
  import * as smartrequest from '@push.rocks/smartrequest';
19
19
  import * as smartstring from '@push.rocks/smartstring';
20
+ import * as smartfile from '@push.rocks/smartfile';
21
+ import * as smartcrypto from '@push.rocks/smartcrypto';
20
22
  import * as smartacme from '@push.rocks/smartacme';
21
23
  import * as smartacmePlugins from '@push.rocks/smartacme/dist_ts/smartacme.plugins.js';
22
24
  import * as smartacmeHandlers from '@push.rocks/smartacme/dist_ts/handlers/index.js';
23
25
  import * as taskbuffer from '@push.rocks/taskbuffer';
24
- export { lik, smartdelay, smartrequest, smartpromise, smartstring, smartacme, smartacmePlugins, smartacmeHandlers, taskbuffer, };
26
+ export { lik, smartdelay, smartrequest, smartpromise, smartstring, smartfile, smartcrypto, smartacme, smartacmePlugins, smartacmeHandlers, taskbuffer, };
25
27
  // third party scope
26
28
  import prettyMs from 'pretty-ms';
27
29
  import * as ws from 'ws';
28
30
  import wsDefault from 'ws';
29
31
  import { minimatch } from 'minimatch';
30
32
  export { prettyMs, ws, wsDefault, minimatch };
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUUvRCxnQkFBZ0I7QUFDaEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFFbkIsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSxvREFBb0QsQ0FBQztBQUN2RixPQUFPLEtBQUssaUJBQWlCLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixVQUFVLEdBQ1gsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUUvRCxnQkFBZ0I7QUFDaEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFFbkIsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sb0RBQW9ELENBQUM7QUFDdkYsT0FBTyxLQUFLLGlCQUFpQixNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixVQUFVLEdBQ1gsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=