@push.rocks/smartproxy 21.0.0 → 21.1.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.
Files changed (146) hide show
  1. package/changelog.md +18 -0
  2. package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
  3. package/dist_ts/core/utils/proxy-protocol.js +13 -97
  4. package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
  5. package/dist_ts/core/utils/websocket-utils.js +10 -66
  6. package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
  7. package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
  8. package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
  9. package/dist_ts/detection/detectors/http-detector.js +89 -0
  10. package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
  11. package/dist_ts/detection/detectors/quick-detector.js +131 -0
  12. package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
  13. package/dist_ts/detection/detectors/routing-extractor.js +122 -0
  14. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
  15. package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
  16. package/dist_ts/detection/detectors/tls-detector.d.ts +55 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +206 -0
  18. package/dist_ts/detection/index.d.ts +17 -0
  19. package/dist_ts/detection/index.js +22 -0
  20. package/dist_ts/detection/models/detection-types.d.ts +87 -0
  21. package/dist_ts/detection/models/detection-types.js +5 -0
  22. package/dist_ts/detection/models/interfaces.d.ts +97 -0
  23. package/dist_ts/detection/models/interfaces.js +5 -0
  24. package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
  25. package/dist_ts/detection/protocol-detector-v2.js +116 -0
  26. package/dist_ts/detection/protocol-detector.d.ts +74 -0
  27. package/dist_ts/detection/protocol-detector.js +173 -0
  28. package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
  29. package/dist_ts/detection/utils/buffer-utils.js +127 -0
  30. package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
  31. package/dist_ts/detection/utils/fragment-manager.js +53 -0
  32. package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
  33. package/dist_ts/detection/utils/parser-utils.js +63 -0
  34. package/dist_ts/index.d.ts +2 -0
  35. package/dist_ts/index.js +3 -1
  36. package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
  37. package/dist_ts/protocols/common/fragment-handler.js +117 -0
  38. package/dist_ts/protocols/common/index.d.ts +7 -0
  39. package/dist_ts/protocols/common/index.js +8 -0
  40. package/dist_ts/protocols/common/types.d.ts +68 -0
  41. package/dist_ts/protocols/common/types.js +7 -0
  42. package/dist_ts/protocols/http/constants.d.ts +119 -0
  43. package/dist_ts/protocols/http/constants.js +200 -0
  44. package/dist_ts/protocols/http/index.d.ts +7 -0
  45. package/dist_ts/protocols/http/index.js +8 -0
  46. package/dist_ts/protocols/http/parser.d.ts +58 -0
  47. package/dist_ts/protocols/http/parser.js +184 -0
  48. package/dist_ts/protocols/http/types.d.ts +62 -0
  49. package/dist_ts/protocols/http/types.js +5 -0
  50. package/dist_ts/protocols/index.d.ts +11 -0
  51. package/dist_ts/protocols/index.js +12 -0
  52. package/dist_ts/protocols/proxy/index.d.ts +6 -0
  53. package/dist_ts/protocols/proxy/index.js +7 -0
  54. package/dist_ts/protocols/proxy/parser.d.ts +44 -0
  55. package/dist_ts/protocols/proxy/parser.js +153 -0
  56. package/dist_ts/protocols/proxy/types.d.ts +47 -0
  57. package/dist_ts/protocols/proxy/types.js +6 -0
  58. package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
  59. package/dist_ts/protocols/tls/alerts/index.js +5 -0
  60. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
  61. package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
  62. package/dist_ts/protocols/tls/constants.d.ts +122 -0
  63. package/dist_ts/protocols/tls/constants.js +135 -0
  64. package/dist_ts/protocols/tls/index.d.ts +12 -0
  65. package/dist_ts/protocols/tls/index.js +27 -0
  66. package/dist_ts/protocols/tls/parser.d.ts +53 -0
  67. package/dist_ts/protocols/tls/parser.js +294 -0
  68. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
  69. package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
  70. package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
  71. package/dist_ts/protocols/tls/sni/index.js +6 -0
  72. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
  73. package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
  74. package/dist_ts/protocols/tls/types.d.ts +65 -0
  75. package/dist_ts/protocols/tls/types.js +5 -0
  76. package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
  77. package/dist_ts/protocols/tls/utils/index.js +5 -0
  78. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
  79. package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
  80. package/dist_ts/protocols/websocket/constants.d.ts +55 -0
  81. package/dist_ts/protocols/websocket/constants.js +58 -0
  82. package/dist_ts/protocols/websocket/index.d.ts +7 -0
  83. package/dist_ts/protocols/websocket/index.js +8 -0
  84. package/dist_ts/protocols/websocket/types.d.ts +47 -0
  85. package/dist_ts/protocols/websocket/types.js +5 -0
  86. package/dist_ts/protocols/websocket/utils.d.ts +25 -0
  87. package/dist_ts/protocols/websocket/utils.js +103 -0
  88. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
  89. package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
  90. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
  91. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  92. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  93. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
  94. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
  95. package/dist_ts/tls/index.d.ts +5 -7
  96. package/dist_ts/tls/index.js +8 -11
  97. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  98. package/dist_ts/tls/sni/sni-handler.js +4 -4
  99. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  100. package/dist_ts/tls/utils/tls-utils.js +4 -116
  101. package/package.json +1 -1
  102. package/readme.plan.md +0 -0
  103. package/ts/core/utils/proxy-protocol.ts +14 -131
  104. package/ts/core/utils/websocket-utils.ts +12 -60
  105. package/ts/detection/detectors/http-detector.ts +114 -0
  106. package/ts/detection/detectors/quick-detector.ts +148 -0
  107. package/ts/detection/detectors/routing-extractor.ts +147 -0
  108. package/ts/detection/detectors/tls-detector.ts +252 -0
  109. package/ts/detection/index.ts +25 -0
  110. package/ts/detection/models/detection-types.ts +102 -0
  111. package/ts/detection/models/interfaces.ts +115 -0
  112. package/ts/detection/protocol-detector.ts +230 -0
  113. package/ts/detection/utils/buffer-utils.ts +141 -0
  114. package/ts/detection/utils/fragment-manager.ts +64 -0
  115. package/ts/detection/utils/parser-utils.ts +77 -0
  116. package/ts/index.ts +3 -1
  117. package/ts/protocols/common/fragment-handler.ts +163 -0
  118. package/ts/protocols/common/index.ts +8 -0
  119. package/ts/protocols/common/types.ts +76 -0
  120. package/ts/protocols/http/constants.ts +219 -0
  121. package/ts/protocols/http/index.ts +8 -0
  122. package/ts/protocols/http/parser.ts +219 -0
  123. package/ts/protocols/http/types.ts +70 -0
  124. package/ts/protocols/index.ts +12 -0
  125. package/ts/protocols/proxy/index.ts +7 -0
  126. package/ts/protocols/proxy/parser.ts +183 -0
  127. package/ts/protocols/proxy/types.ts +53 -0
  128. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  129. package/ts/protocols/tls/index.ts +37 -0
  130. package/ts/protocols/tls/sni/index.ts +6 -0
  131. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  132. package/ts/protocols/websocket/constants.ts +60 -0
  133. package/ts/protocols/websocket/index.ts +8 -0
  134. package/ts/protocols/websocket/types.ts +53 -0
  135. package/ts/protocols/websocket/utils.ts +98 -0
  136. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  137. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
  138. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  139. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  140. package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
  141. package/ts/tls/index.ts +8 -12
  142. package/ts/tls/sni/sni-handler.ts +3 -3
  143. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  144. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  145. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  146. /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Protocol Detector
3
+ *
4
+ * Simplified protocol detection using the new architecture
5
+ */
6
+ import type { IDetectionResult, IDetectionOptions } from './models/detection-types.js';
7
+ import type { IConnectionContext } from '../protocols/common/types.js';
8
+ /**
9
+ * Main protocol detector class
10
+ */
11
+ export declare class ProtocolDetector {
12
+ private static instance;
13
+ private fragmentManager;
14
+ private tlsDetector;
15
+ private httpDetector;
16
+ constructor();
17
+ private static getInstance;
18
+ /**
19
+ * Detect protocol from buffer data
20
+ */
21
+ static detect(buffer: Buffer, options?: IDetectionOptions): Promise<IDetectionResult>;
22
+ private detectInstance;
23
+ /**
24
+ * Detect protocol with connection tracking for fragmented data
25
+ * @deprecated Use detectWithContext instead
26
+ */
27
+ static detectWithConnectionTracking(buffer: Buffer, connectionId: string, options?: IDetectionOptions): Promise<IDetectionResult>;
28
+ /**
29
+ * Detect protocol with connection context for fragmented data
30
+ */
31
+ static detectWithContext(buffer: Buffer, context: IConnectionContext, options?: IDetectionOptions): Promise<IDetectionResult>;
32
+ private detectWithContextInstance;
33
+ /**
34
+ * Clean up resources
35
+ */
36
+ static cleanup(): void;
37
+ private cleanupInstance;
38
+ /**
39
+ * Destroy detector instance
40
+ */
41
+ static destroy(): void;
42
+ private destroyInstance;
43
+ /**
44
+ * Clean up old connection tracking entries
45
+ *
46
+ * @param maxAge Maximum age in milliseconds (default: 30 seconds)
47
+ */
48
+ static cleanupConnections(maxAge?: number): void;
49
+ /**
50
+ * Extract domain from connection info
51
+ */
52
+ static extractDomain(connectionInfo: any): string | undefined;
53
+ /**
54
+ * Create a connection ID from connection parameters
55
+ * @deprecated Use createConnectionContext instead
56
+ */
57
+ static createConnectionId(params: {
58
+ sourceIp?: string;
59
+ sourcePort?: number;
60
+ destIp?: string;
61
+ destPort?: number;
62
+ socketId?: string;
63
+ }): string;
64
+ /**
65
+ * Create a connection context from parameters
66
+ */
67
+ static createConnectionContext(params: {
68
+ sourceIp?: string;
69
+ sourcePort?: number;
70
+ destIp?: string;
71
+ destPort?: number;
72
+ socketId?: string;
73
+ }): IConnectionContext;
74
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Protocol Detector
3
+ *
4
+ * Simplified protocol detection using the new architecture
5
+ */
6
+ import { TlsDetector } from './detectors/tls-detector.js';
7
+ import { HttpDetector } from './detectors/http-detector.js';
8
+ import { DetectionFragmentManager } from './utils/fragment-manager.js';
9
+ /**
10
+ * Main protocol detector class
11
+ */
12
+ export class ProtocolDetector {
13
+ constructor() {
14
+ this.fragmentManager = new DetectionFragmentManager();
15
+ this.tlsDetector = new TlsDetector();
16
+ this.httpDetector = new HttpDetector(this.fragmentManager);
17
+ }
18
+ static getInstance() {
19
+ if (!this.instance) {
20
+ this.instance = new ProtocolDetector();
21
+ }
22
+ return this.instance;
23
+ }
24
+ /**
25
+ * Detect protocol from buffer data
26
+ */
27
+ static async detect(buffer, options) {
28
+ return this.getInstance().detectInstance(buffer, options);
29
+ }
30
+ async detectInstance(buffer, options) {
31
+ // Quick sanity check
32
+ if (!buffer || buffer.length === 0) {
33
+ return {
34
+ protocol: 'unknown',
35
+ connectionInfo: { protocol: 'unknown' },
36
+ isComplete: true
37
+ };
38
+ }
39
+ // Try TLS detection first (more specific)
40
+ if (this.tlsDetector.canHandle(buffer)) {
41
+ const tlsResult = this.tlsDetector.detect(buffer, options);
42
+ if (tlsResult) {
43
+ return tlsResult;
44
+ }
45
+ }
46
+ // Try HTTP detection
47
+ if (this.httpDetector.canHandle(buffer)) {
48
+ const httpResult = this.httpDetector.detect(buffer, options);
49
+ if (httpResult) {
50
+ return httpResult;
51
+ }
52
+ }
53
+ // Neither TLS nor HTTP
54
+ return {
55
+ protocol: 'unknown',
56
+ connectionInfo: { protocol: 'unknown' },
57
+ isComplete: true
58
+ };
59
+ }
60
+ /**
61
+ * Detect protocol with connection tracking for fragmented data
62
+ * @deprecated Use detectWithContext instead
63
+ */
64
+ static async detectWithConnectionTracking(buffer, connectionId, options) {
65
+ // Convert connection ID to context
66
+ const context = {
67
+ id: connectionId,
68
+ sourceIp: 'unknown',
69
+ sourcePort: 0,
70
+ destIp: 'unknown',
71
+ destPort: 0,
72
+ timestamp: Date.now()
73
+ };
74
+ return this.getInstance().detectWithContextInstance(buffer, context, options);
75
+ }
76
+ /**
77
+ * Detect protocol with connection context for fragmented data
78
+ */
79
+ static async detectWithContext(buffer, context, options) {
80
+ return this.getInstance().detectWithContextInstance(buffer, context, options);
81
+ }
82
+ async detectWithContextInstance(buffer, context, options) {
83
+ // Quick sanity check
84
+ if (!buffer || buffer.length === 0) {
85
+ return {
86
+ protocol: 'unknown',
87
+ connectionInfo: { protocol: 'unknown' },
88
+ isComplete: true
89
+ };
90
+ }
91
+ // First peek to determine protocol type
92
+ if (this.tlsDetector.canHandle(buffer)) {
93
+ const result = this.tlsDetector.detectWithContext(buffer, context, options);
94
+ if (result) {
95
+ return result;
96
+ }
97
+ }
98
+ if (this.httpDetector.canHandle(buffer)) {
99
+ const result = this.httpDetector.detectWithContext(buffer, context, options);
100
+ if (result) {
101
+ return result;
102
+ }
103
+ }
104
+ // Can't determine protocol
105
+ return {
106
+ protocol: 'unknown',
107
+ connectionInfo: { protocol: 'unknown' },
108
+ isComplete: false,
109
+ bytesNeeded: Math.max(this.tlsDetector.getMinimumBytes(), this.httpDetector.getMinimumBytes())
110
+ };
111
+ }
112
+ /**
113
+ * Clean up resources
114
+ */
115
+ static cleanup() {
116
+ this.getInstance().cleanupInstance();
117
+ }
118
+ cleanupInstance() {
119
+ this.fragmentManager.cleanup();
120
+ }
121
+ /**
122
+ * Destroy detector instance
123
+ */
124
+ static destroy() {
125
+ this.getInstance().destroyInstance();
126
+ this.instance = null;
127
+ }
128
+ destroyInstance() {
129
+ this.fragmentManager.destroy();
130
+ }
131
+ /**
132
+ * Clean up old connection tracking entries
133
+ *
134
+ * @param maxAge Maximum age in milliseconds (default: 30 seconds)
135
+ */
136
+ static cleanupConnections(maxAge = 30000) {
137
+ // Cleanup is now handled internally by the fragment manager
138
+ this.getInstance().fragmentManager.cleanup();
139
+ }
140
+ /**
141
+ * Extract domain from connection info
142
+ */
143
+ static extractDomain(connectionInfo) {
144
+ return connectionInfo.domain || connectionInfo.sni || connectionInfo.host;
145
+ }
146
+ /**
147
+ * Create a connection ID from connection parameters
148
+ * @deprecated Use createConnectionContext instead
149
+ */
150
+ static createConnectionId(params) {
151
+ // If socketId is provided, use it
152
+ if (params.socketId) {
153
+ return params.socketId;
154
+ }
155
+ // Otherwise create from connection tuple
156
+ const { sourceIp = 'unknown', sourcePort = 0, destIp = 'unknown', destPort = 0 } = params;
157
+ return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
158
+ }
159
+ /**
160
+ * Create a connection context from parameters
161
+ */
162
+ static createConnectionContext(params) {
163
+ return {
164
+ id: params.socketId,
165
+ sourceIp: params.sourceIp || 'unknown',
166
+ sourcePort: params.sourcePort || 0,
167
+ destIp: params.destIp || 'unknown',
168
+ destPort: params.destPort || 0,
169
+ timestamp: Date.now()
170
+ };
171
+ }
172
+ }
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vcHJvdG9jb2wtZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLE9BQTJCO1FBQzdELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBYyxFQUFFLE9BQTJCO1FBQ3RFLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxF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
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Buffer manipulation utilities for protocol detection
3
+ */
4
+ /**
5
+ * BufferAccumulator class for handling fragmented data
6
+ */
7
+ export declare class BufferAccumulator {
8
+ private chunks;
9
+ private totalLength;
10
+ /**
11
+ * Append data to the accumulator
12
+ */
13
+ append(data: Buffer): void;
14
+ /**
15
+ * Get the accumulated buffer
16
+ */
17
+ getBuffer(): Buffer;
18
+ /**
19
+ * Get current buffer length
20
+ */
21
+ length(): number;
22
+ /**
23
+ * Clear all accumulated data
24
+ */
25
+ clear(): void;
26
+ /**
27
+ * Check if accumulator has minimum bytes
28
+ */
29
+ hasMinimumBytes(minBytes: number): boolean;
30
+ }
31
+ /**
32
+ * Read a big-endian 16-bit integer from buffer
33
+ */
34
+ export declare function readUInt16BE(buffer: Buffer, offset: number): number;
35
+ /**
36
+ * Read a big-endian 24-bit integer from buffer
37
+ */
38
+ export declare function readUInt24BE(buffer: Buffer, offset: number): number;
39
+ /**
40
+ * Find a byte sequence in a buffer
41
+ */
42
+ export declare function findSequence(buffer: Buffer, sequence: Buffer, startOffset?: number): number;
43
+ /**
44
+ * Extract a line from buffer (up to CRLF or LF)
45
+ */
46
+ export declare function extractLine(buffer: Buffer, startOffset?: number): {
47
+ line: string;
48
+ nextOffset: number;
49
+ } | null;
50
+ /**
51
+ * Check if buffer starts with a string (case-insensitive)
52
+ */
53
+ export declare function startsWithString(buffer: Buffer, str: string, offset?: number): boolean;
54
+ /**
55
+ * Safe buffer slice that doesn't throw on out-of-bounds
56
+ */
57
+ export declare function safeSlice(buffer: Buffer, start: number, end?: number): Buffer;
58
+ /**
59
+ * Check if buffer contains printable ASCII
60
+ */
61
+ export declare function isPrintableAscii(buffer: Buffer, length?: number): boolean;
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Buffer manipulation utilities for protocol detection
3
+ */
4
+ // Import from protocols
5
+ import { HttpParser } from '../../protocols/http/index.js';
6
+ /**
7
+ * BufferAccumulator class for handling fragmented data
8
+ */
9
+ export class BufferAccumulator {
10
+ constructor() {
11
+ this.chunks = [];
12
+ this.totalLength = 0;
13
+ }
14
+ /**
15
+ * Append data to the accumulator
16
+ */
17
+ append(data) {
18
+ this.chunks.push(data);
19
+ this.totalLength += data.length;
20
+ }
21
+ /**
22
+ * Get the accumulated buffer
23
+ */
24
+ getBuffer() {
25
+ if (this.chunks.length === 0) {
26
+ return Buffer.alloc(0);
27
+ }
28
+ if (this.chunks.length === 1) {
29
+ return this.chunks[0];
30
+ }
31
+ return Buffer.concat(this.chunks, this.totalLength);
32
+ }
33
+ /**
34
+ * Get current buffer length
35
+ */
36
+ length() {
37
+ return this.totalLength;
38
+ }
39
+ /**
40
+ * Clear all accumulated data
41
+ */
42
+ clear() {
43
+ this.chunks = [];
44
+ this.totalLength = 0;
45
+ }
46
+ /**
47
+ * Check if accumulator has minimum bytes
48
+ */
49
+ hasMinimumBytes(minBytes) {
50
+ return this.totalLength >= minBytes;
51
+ }
52
+ }
53
+ /**
54
+ * Read a big-endian 16-bit integer from buffer
55
+ */
56
+ export function readUInt16BE(buffer, offset) {
57
+ if (offset + 2 > buffer.length) {
58
+ throw new Error('Buffer too short for UInt16BE read');
59
+ }
60
+ return (buffer[offset] << 8) | buffer[offset + 1];
61
+ }
62
+ /**
63
+ * Read a big-endian 24-bit integer from buffer
64
+ */
65
+ export function readUInt24BE(buffer, offset) {
66
+ if (offset + 3 > buffer.length) {
67
+ throw new Error('Buffer too short for UInt24BE read');
68
+ }
69
+ return (buffer[offset] << 16) | (buffer[offset + 1] << 8) | buffer[offset + 2];
70
+ }
71
+ /**
72
+ * Find a byte sequence in a buffer
73
+ */
74
+ export function findSequence(buffer, sequence, startOffset = 0) {
75
+ if (sequence.length === 0) {
76
+ return startOffset;
77
+ }
78
+ const searchLength = buffer.length - sequence.length + 1;
79
+ for (let i = startOffset; i < searchLength; i++) {
80
+ let found = true;
81
+ for (let j = 0; j < sequence.length; j++) {
82
+ if (buffer[i + j] !== sequence[j]) {
83
+ found = false;
84
+ break;
85
+ }
86
+ }
87
+ if (found) {
88
+ return i;
89
+ }
90
+ }
91
+ return -1;
92
+ }
93
+ /**
94
+ * Extract a line from buffer (up to CRLF or LF)
95
+ */
96
+ export function extractLine(buffer, startOffset = 0) {
97
+ // Delegate to protocol parser
98
+ return HttpParser.extractLine(buffer, startOffset);
99
+ }
100
+ /**
101
+ * Check if buffer starts with a string (case-insensitive)
102
+ */
103
+ export function startsWithString(buffer, str, offset = 0) {
104
+ if (offset + str.length > buffer.length) {
105
+ return false;
106
+ }
107
+ const bufferStr = buffer.slice(offset, offset + str.length).toString('utf8');
108
+ return bufferStr.toLowerCase() === str.toLowerCase();
109
+ }
110
+ /**
111
+ * Safe buffer slice that doesn't throw on out-of-bounds
112
+ */
113
+ export function safeSlice(buffer, start, end) {
114
+ const safeStart = Math.max(0, Math.min(start, buffer.length));
115
+ const safeEnd = end === undefined
116
+ ? buffer.length
117
+ : Math.max(safeStart, Math.min(end, buffer.length));
118
+ return buffer.slice(safeStart, safeEnd);
119
+ }
120
+ /**
121
+ * Check if buffer contains printable ASCII
122
+ */
123
+ export function isPrintableAscii(buffer, length) {
124
+ // Delegate to protocol parser
125
+ return HttpParser.isPrintableAscii(buffer, length);
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL3V0aWxzL2J1ZmZlci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILHdCQUF3QjtBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQTlCO1FBQ1UsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQTRDMUIsQ0FBQztJQTFDQzs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIs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
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Fragment Manager for Detection Module
3
+ *
4
+ * Manages fragmented protocol data using the shared fragment handler
5
+ */
6
+ import { FragmentHandler } from '../../protocols/common/fragment-handler.js';
7
+ import type { IConnectionContext } from '../../protocols/common/types.js';
8
+ /**
9
+ * Detection-specific fragment manager
10
+ */
11
+ export declare class DetectionFragmentManager {
12
+ private tlsFragments;
13
+ private httpFragments;
14
+ constructor();
15
+ /**
16
+ * Get fragment handler for protocol type
17
+ */
18
+ getHandler(protocol: 'tls' | 'http'): FragmentHandler;
19
+ /**
20
+ * Create connection ID from context
21
+ */
22
+ static createConnectionId(context: IConnectionContext): string;
23
+ /**
24
+ * Clean up all handlers
25
+ */
26
+ cleanup(): void;
27
+ /**
28
+ * Destroy all handlers
29
+ */
30
+ destroy(): void;
31
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Fragment Manager for Detection Module
3
+ *
4
+ * Manages fragmented protocol data using the shared fragment handler
5
+ */
6
+ import { FragmentHandler } from '../../protocols/common/fragment-handler.js';
7
+ /**
8
+ * Detection-specific fragment manager
9
+ */
10
+ export class DetectionFragmentManager {
11
+ constructor() {
12
+ // Configure fragment handlers with appropriate limits
13
+ const tlsOptions = {
14
+ maxBufferSize: 16384, // TLS record max size
15
+ timeout: 5000,
16
+ cleanupInterval: 30000
17
+ };
18
+ const httpOptions = {
19
+ maxBufferSize: 8192, // HTTP header reasonable limit
20
+ timeout: 5000,
21
+ cleanupInterval: 30000
22
+ };
23
+ this.tlsFragments = new FragmentHandler(tlsOptions);
24
+ this.httpFragments = new FragmentHandler(httpOptions);
25
+ }
26
+ /**
27
+ * Get fragment handler for protocol type
28
+ */
29
+ getHandler(protocol) {
30
+ return protocol === 'tls' ? this.tlsFragments : this.httpFragments;
31
+ }
32
+ /**
33
+ * Create connection ID from context
34
+ */
35
+ static createConnectionId(context) {
36
+ return context.id || `${context.sourceIp}:${context.sourcePort}-${context.destIp}:${context.destPort}`;
37
+ }
38
+ /**
39
+ * Clean up all handlers
40
+ */
41
+ cleanup() {
42
+ this.tlsFragments.cleanup();
43
+ this.httpFragments.cleanup();
44
+ }
45
+ /**
46
+ * Destroy all handlers
47
+ */
48
+ destroy() {
49
+ this.tlsFragments.destroy();
50
+ this.httpFragments.destroy();
51
+ }
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhZ21lbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2RldGVjdGlvbi91dGlscy9mcmFnbWVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLDRDQUE0QyxDQUFDO0FBR3BHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQUluQztRQUNFLHNEQUFzRDtRQUN0RCxNQUFNLFVBQVUsR0FBcUI7WUFDbkMsYUFBYSxFQUFFLEtBQUssRUFBRyxzQkFBc0I7WUFDN0MsT0FBTyxFQUFFLElBQUk7WUFDYixlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQXFCO1lBQ3BDLGFBQWEsRUFBRSxJQUFJLEVBQUksK0JBQStCO1lBQ3RELE9BQU8sRUFBRSxJQUFJO1lBQ2IsZUFBZSxFQUFFLEtBQUs7U0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsUUFBd0I7UUFDakMsT0FBTyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUEyQjtRQUNuRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekcsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRiJ9
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Parser utilities for protocol detection
3
+ * Now delegates to protocol modules for actual parsing
4
+ */
5
+ import type { THttpMethod, TTlsVersion } from '../models/detection-types.js';
6
+ import { HTTP_METHODS, HTTP_VERSIONS } from '../../protocols/http/index.js';
7
+ export { HTTP_METHODS, HTTP_VERSIONS };
8
+ /**
9
+ * Parse HTTP request line
10
+ */
11
+ export declare function parseHttpRequestLine(line: string): {
12
+ method: THttpMethod;
13
+ path: string;
14
+ version: string;
15
+ } | null;
16
+ /**
17
+ * Parse HTTP header line
18
+ */
19
+ export declare function parseHttpHeader(line: string): {
20
+ name: string;
21
+ value: string;
22
+ } | null;
23
+ /**
24
+ * Parse HTTP headers from lines
25
+ */
26
+ export declare function parseHttpHeaders(lines: string[]): Record<string, string>;
27
+ /**
28
+ * Convert TLS version bytes to version string
29
+ */
30
+ export declare function tlsVersionToString(major: number, minor: number): TTlsVersion | null;
31
+ /**
32
+ * Extract domain from Host header value
33
+ */
34
+ export declare function extractDomainFromHost(hostHeader: string): string;
35
+ /**
36
+ * Validate domain name
37
+ */
38
+ export declare function isValidDomain(domain: string): boolean;
39
+ /**
40
+ * Check if string is a valid HTTP method
41
+ */
42
+ export declare function isHttpMethod(str: string): str is THttpMethod;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Parser utilities for protocol detection
3
+ * Now delegates to protocol modules for actual parsing
4
+ */
5
+ import { HttpParser, HTTP_METHODS, HTTP_VERSIONS } from '../../protocols/http/index.js';
6
+ import { tlsVersionToString as protocolTlsVersionToString } from '../../protocols/tls/index.js';
7
+ // Re-export constants for backward compatibility
8
+ export { HTTP_METHODS, HTTP_VERSIONS };
9
+ /**
10
+ * Parse HTTP request line
11
+ */
12
+ export function parseHttpRequestLine(line) {
13
+ // Delegate to protocol parser
14
+ const result = HttpParser.parseRequestLine(line);
15
+ return result ? {
16
+ method: result.method,
17
+ path: result.path,
18
+ version: result.version
19
+ } : null;
20
+ }
21
+ /**
22
+ * Parse HTTP header line
23
+ */
24
+ export function parseHttpHeader(line) {
25
+ // Delegate to protocol parser
26
+ return HttpParser.parseHeaderLine(line);
27
+ }
28
+ /**
29
+ * Parse HTTP headers from lines
30
+ */
31
+ export function parseHttpHeaders(lines) {
32
+ // Delegate to protocol parser
33
+ return HttpParser.parseHeaders(lines);
34
+ }
35
+ /**
36
+ * Convert TLS version bytes to version string
37
+ */
38
+ export function tlsVersionToString(major, minor) {
39
+ // Delegate to protocol parser
40
+ return protocolTlsVersionToString(major, minor);
41
+ }
42
+ /**
43
+ * Extract domain from Host header value
44
+ */
45
+ export function extractDomainFromHost(hostHeader) {
46
+ // Delegate to protocol parser
47
+ return HttpParser.extractDomainFromHost(hostHeader);
48
+ }
49
+ /**
50
+ * Validate domain name
51
+ */
52
+ export function isValidDomain(domain) {
53
+ // Delegate to protocol parser
54
+ return HttpParser.isValidDomain(domain);
55
+ }
56
+ /**
57
+ * Check if string is a valid HTTP method
58
+ */
59
+ export function isHttpMethod(str) {
60
+ // Delegate to protocol parser
61
+ return HttpParser.isHttpMethod(str) && str !== undefined;
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL3V0aWxzL3BhcnNlci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFHSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLElBQUksMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVoRyxpREFBaUQ7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBSy9DLDhCQUE4QjtJQUM5QixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFxQjtRQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO0tBQ3hCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyw4QkFBOEI7SUFDOUIsT0FBTyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFlO0lBQzlDLDhCQUE4QjtJQUM5QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzdELDhCQUE4QjtJQUM5QixPQUFPLDBCQUEwQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQWdCLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFVBQWtCO0lBQ3RELDhCQUE4QjtJQUM5QixPQUFPLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQWM7SUFDMUMsOEJBQThCO0lBQzlCLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVc7SUFDdEMsOEJBQThCO0lBQzlCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSyxHQUFtQixLQUFLLFNBQVMsQ0FBQztBQUM1RSxDQUFDIn0=
@@ -16,3 +16,5 @@ export * from './core/models/common-types.js';
16
16
  export type { IAcmeOptions } from './proxies/smart-proxy/models/interfaces.js';
17
17
  export * as tls from './tls/index.js';
18
18
  export * as routing from './routing/index.js';
19
+ export * as detection from './detection/index.js';
20
+ export * as protocols from './protocols/index.js';
package/dist_ts/index.js CHANGED
@@ -21,4 +21,6 @@ export * from './core/models/common-types.js';
21
21
  // Certificate module has been removed - use SmartCertManager instead
22
22
  export * as tls from './tls/index.js';
23
23
  export * as routing from './routing/index.js';
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILHlCQUF5QjtBQUN6QixjQUFjLG1DQUFtQyxDQUFDO0FBRWxELDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoSSxPQUFPLEVBQUUsa0JBQWtCLElBQUkscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5Rix5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2TCxPQUFPLEVBQUUsa0JBQWtCLElBQUksWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFJckYsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCxrRUFBa0U7QUFDbEUsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxrRUFBa0U7QUFDbEUscUVBQXFFO0FBRXJFLDJCQUEyQjtBQUMzQixjQUFjLCtCQUErQixDQUFDO0FBSzlDLHVDQUF1QztBQUN2QyxxRUFBcUU7QUFDckUsT0FBTyxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDIn0=
24
+ export * as detection from './detection/index.js';
25
+ export * as protocols from './protocols/index.js';
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILHlCQUF5QjtBQUN6QixjQUFjLG1DQUFtQyxDQUFDO0FBRWxELDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoSSxPQUFPLEVBQUUsa0JBQWtCLElBQUkscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5Rix5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2TCxPQUFPLEVBQUUsa0JBQWtCLElBQUksWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFJckYsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCxrRUFBa0U7QUFDbEUsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxrRUFBa0U7QUFDbEUscUVBQXFFO0FBRXJFLDJCQUEyQjtBQUMzQixjQUFjLCtCQUErQixDQUFDO0FBSzlDLHVDQUF1QztBQUN2QyxxRUFBcUU7QUFDckUsT0FBTyxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQkFBc0IsQ0FBQyJ9