@coherent.js/api 1.0.0-beta.2

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 (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -0
  3. package/dist/api/errors.d.ts +92 -0
  4. package/dist/api/errors.d.ts.map +1 -0
  5. package/dist/api/errors.js +161 -0
  6. package/dist/api/errors.js.map +1 -0
  7. package/dist/api/index.d.ts +61 -0
  8. package/dist/api/index.d.ts.map +1 -0
  9. package/dist/api/index.js +41 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/middleware.d.ts +57 -0
  12. package/dist/api/middleware.d.ts.map +1 -0
  13. package/dist/api/middleware.js +244 -0
  14. package/dist/api/middleware.js.map +1 -0
  15. package/dist/api/openapi.d.ts +54 -0
  16. package/dist/api/openapi.d.ts.map +1 -0
  17. package/dist/api/openapi.js +144 -0
  18. package/dist/api/openapi.js.map +1 -0
  19. package/dist/api/router.d.ts +368 -0
  20. package/dist/api/router.d.ts.map +1 -0
  21. package/dist/api/router.js +1508 -0
  22. package/dist/api/router.js.map +1 -0
  23. package/dist/api/security.d.ts +64 -0
  24. package/dist/api/security.d.ts.map +1 -0
  25. package/dist/api/security.js +239 -0
  26. package/dist/api/security.js.map +1 -0
  27. package/dist/api/serialization.d.ts +86 -0
  28. package/dist/api/serialization.d.ts.map +1 -0
  29. package/dist/api/serialization.js +151 -0
  30. package/dist/api/serialization.js.map +1 -0
  31. package/dist/api/validation.d.ts +34 -0
  32. package/dist/api/validation.d.ts.map +1 -0
  33. package/dist/api/validation.js +172 -0
  34. package/dist/api/validation.js.map +1 -0
  35. package/dist/index.cjs +1776 -0
  36. package/dist/index.cjs.map +7 -0
  37. package/dist/index.js +1722 -0
  38. package/dist/index.js.map +7 -0
  39. package/package.json +46 -0
  40. package/types/index.d.ts +720 -0
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Creates an object-based router from nested route definitions
3
+ *
4
+ * @param {Object} routes - Nested route definition object
5
+ * @param {Object} options - Router options (corsOrigin, rateLimit, maxBodySize)
6
+ * @returns {Object} Configured router instance
7
+ *
8
+ * @example
9
+ * const routes = {
10
+ * api: {
11
+ * users: {
12
+ * get: { handler: () => ({ users: [] }) },
13
+ * post: {
14
+ * validation: userSchema,
15
+ * handler: (req) => ({ user: req.body })
16
+ * }
17
+ * }
18
+ * }
19
+ * };
20
+ *
21
+ * const router = createObjectRouter(routes, {
22
+ * corsOrigin: 'https://myapp.com',
23
+ * rateLimit: { windowMs: 60000, maxRequests: 50 }
24
+ * });
25
+ * const server = router.createServer();
26
+ * server.listen(3000);
27
+ */
28
+ /**
29
+ * Factory function to create a SimpleRouter instance
30
+ *
31
+ * @param {Object} options - Router options
32
+ * @returns {SimpleRouter} Router instance
33
+ */
34
+ export function createSimpleRouter(options?: Object): SimpleRouter;
35
+ export function createObjectRouter(routeConfig: any, options?: {}): SimpleRouter;
36
+ export default createObjectRouter;
37
+ /**
38
+ * Simple router implementation for object-based routing with WebSocket support
39
+ *
40
+ * @class SimpleRouter
41
+ * @description Provides HTTP and WebSocket routing with middleware support, caching,
42
+ * versioning, content negotiation, and performance metrics.
43
+ *
44
+ * @param {Object} [options={}] - Router configuration options
45
+ * @param {number} [options.maxCacheSize=1000] - Maximum cache size for route lookups
46
+ * @param {boolean} [options.enableCompilation=true] - Enable route pattern compilation
47
+ * @param {boolean} [options.enableVersioning=false] - Enable API versioning
48
+ * @param {string} [options.defaultVersion='v1'] - Default API version
49
+ * @param {string} [options.versionHeader='api-version'] - Header for version detection
50
+ * @param {boolean} [options.enableContentNegotiation=true] - Enable content type negotiation
51
+ * @param {string} [options.defaultContentType='application/json'] - Default response content type
52
+ * @param {boolean} [options.enableWebSockets=false] - Enable WebSocket routing
53
+ * @param {boolean} [options.enableMetrics=false] - Enable performance metrics collection
54
+ *
55
+ * @example
56
+ * const router = new SimpleRouter({
57
+ * enableWebSockets: true,
58
+ * enableMetrics: true,
59
+ * maxCacheSize: 2000
60
+ * });
61
+ */
62
+ export class SimpleRouter {
63
+ constructor(options?: {});
64
+ routes: any[];
65
+ routeCache: Map<any, any>;
66
+ namedRoutes: Map<any, any>;
67
+ maxCacheSize: any;
68
+ routeGroups: any[];
69
+ globalMiddleware: any[];
70
+ enableCompilation: boolean;
71
+ compiledRoutes: Map<any, any>;
72
+ routeCompilationCache: Map<any, any>;
73
+ enableVersioning: any;
74
+ defaultVersion: any;
75
+ versionHeader: any;
76
+ versionedRoutes: Map<any, any>;
77
+ enableContentNegotiation: boolean;
78
+ defaultContentType: any;
79
+ enableWebSockets: any;
80
+ wsRoutes: any[];
81
+ wsConnections: Map<any, any>;
82
+ enableMetrics: any;
83
+ metrics: {
84
+ requests: number;
85
+ cacheHits: number;
86
+ compilationHits: number;
87
+ routeMatches: Map<any, any>;
88
+ responseTime: never[];
89
+ errors: number;
90
+ versionRequests: Map<any, any>;
91
+ contentTypeRequests: Map<any, any>;
92
+ wsConnections: number;
93
+ wsMessages: number;
94
+ } | undefined;
95
+ /**
96
+ * Add an HTTP route to the router
97
+ *
98
+ * @param {string} method - HTTP method (GET, POST, PUT, DELETE, PATCH)
99
+ * @param {string} path - Route path pattern (supports :param and wildcards)
100
+ * @param {Function} handler - Route handler function
101
+ * @param {Object} [options={}] - Route options
102
+ * @param {Array} [options.middleware] - Route-specific middleware
103
+ * @param {string} [options.name] - Named route for URL generation
104
+ * @param {string} [options.version] - API version for this route
105
+ *
106
+ * @example
107
+ * router.addRoute('GET', '/users/:id', (req, res) => {
108
+ * return { user: { id: req.params.id } };
109
+ * }, { name: 'getUser', version: 'v2' });
110
+ */
111
+ addRoute(method: string, path: string, handler: Function, options?: {
112
+ middleware?: any[] | undefined;
113
+ name?: string | undefined;
114
+ version?: string | undefined;
115
+ }): void;
116
+ /**
117
+ * Add a versioned route
118
+ * @param {string} version - API version (e.g., 'v1', 'v2')
119
+ * @param {string} method - HTTP method
120
+ * @param {string} path - Route path
121
+ * @param {Function} handler - Route handler
122
+ * @param {Object} options - Route options
123
+ */
124
+ addVersionedRoute(version: string, method: string, path: string, handler: Function, options?: Object): void;
125
+ /**
126
+ * Add route with content negotiation support
127
+ * @param {string} method - HTTP method
128
+ * @param {string} path - Route path
129
+ * @param {Object} handlers - Content type handlers { 'application/json': handler, 'text/xml': handler }
130
+ * @param {Object} options - Route options
131
+ */
132
+ addContentNegotiatedRoute(method: string, path: string, handlers: Object, options?: Object): void;
133
+ /**
134
+ * Negotiate content type based on Accept header
135
+ * @param {Object} req - Request object
136
+ * @param {Array} supportedTypes - Array of supported content types
137
+ * @returns {string} Best matching content type
138
+ * @private
139
+ */
140
+ private negotiateContentType;
141
+ /**
142
+ * Convert object to XML string
143
+ * @param {Object} obj - Object to convert
144
+ * @param {string} rootName - Root element name
145
+ * @returns {string} XML string
146
+ * @private
147
+ */
148
+ private objectToXml;
149
+ /**
150
+ * Add WebSocket route
151
+ * @param {string} path - WebSocket path
152
+ * @param {Function} handler - WebSocket handler function
153
+ * @param {Object} options - Route options
154
+ */
155
+ addWebSocketRoute(path: string, handler: Function, options?: Object): void;
156
+ /**
157
+ * Handle WebSocket upgrade request
158
+ * @param {Object} request - HTTP request object
159
+ * @param {Object} socket - Socket object
160
+ * @param {Buffer} head - First packet of the upgraded stream
161
+ */
162
+ handleWebSocketUpgrade(request: Object, socket: Object, head: Buffer): void;
163
+ /**
164
+ * Create WebSocket connection
165
+ * @param {Object} request - HTTP request object
166
+ * @param {Object} socket - Socket object
167
+ * @param {Buffer} head - First packet of the upgraded stream
168
+ * @param {Object} matchedRoute - Matched WebSocket route
169
+ * @private
170
+ */
171
+ private createWebSocketConnection;
172
+ /**
173
+ * Create WebSocket wrapper with message handling
174
+ * @param {Object} socket - Raw socket
175
+ * @param {Object} matchedRoute - Matched route info
176
+ * @returns {Object} WebSocket wrapper
177
+ * @private
178
+ */
179
+ private createWebSocketWrapper;
180
+ /**
181
+ * Parse WebSocket frame
182
+ * @param {Buffer} buffer - Raw frame data
183
+ * @returns {string|null} Parsed message
184
+ * @private
185
+ */
186
+ private parseWebSocketFrame;
187
+ /**
188
+ * Broadcast message to all WebSocket connections on a path
189
+ * @param {string} path - WebSocket path pattern
190
+ * @param {*} message - Message to broadcast
191
+ * @param {string} [excludeId=null] - Connection ID to exclude from broadcast
192
+ */
193
+ broadcast(path: string, message: any, excludeId?: string): void;
194
+ /**
195
+ * Get active WebSocket connections
196
+ * @returns {Array} Array of connection info
197
+ */
198
+ getWebSocketConnections(): any[];
199
+ /**
200
+ * Get version from request
201
+ * @param {Object} req - Request object
202
+ * @returns {string} API version
203
+ * @private
204
+ */
205
+ private getRequestVersion;
206
+ /**
207
+ * Generate URL for named route with parameter substitution
208
+ *
209
+ * @param {string} name - Route name (set during route registration)
210
+ * @param {Object} [params={}] - Parameters to substitute in the URL pattern
211
+ * @returns {string} Generated URL with parameters substituted
212
+ * @throws {Error} If named route is not found
213
+ *
214
+ * @example
215
+ * // Route registered as: router.addRoute('GET', '/users/:id', handler, { name: 'getUser' })
216
+ * const url = router.url('getUser', { id: 123 }); // '/users/123'
217
+ *
218
+ * // With constrained parameters
219
+ * const url = router.url('getUserPosts', { userId: 123, postId: 456 }); // '/users/123/posts/456'
220
+ */
221
+ generateUrl(name: string, params?: Object): string;
222
+ /**
223
+ * Add routes from configuration object
224
+ *
225
+ * @param {Object} routeConfig - Route configuration object with nested structure
226
+ * @description Processes nested route objects and registers HTTP and WebSocket routes.
227
+ * Supports declarative route definition with automatic method detection.
228
+ *
229
+ * @example
230
+ * router.addRoutes({
231
+ * 'api': {
232
+ * 'users': {
233
+ * GET: (req, res) => ({ users: [] }),
234
+ * POST: (req, res) => ({ created: true })
235
+ * }
236
+ * }
237
+ * });
238
+ */
239
+ addRoutes(routeConfig: Object): void;
240
+ /**
241
+ * Add global middleware to the router
242
+ *
243
+ * @param {Function|Object} middleware - Middleware function or conditional middleware object
244
+ * @description Adds middleware that runs before all route handlers. Supports both
245
+ * simple functions and conditional middleware objects.
246
+ *
247
+ * @example
248
+ * // Simple middleware
249
+ * router.use((req, res) => {
250
+ * console.log(`${req.method} ${req.url}`);
251
+ * });
252
+ *
253
+ * // Conditional middleware
254
+ * router.use({
255
+ * condition: (req) => req.url.startsWith('/api'),
256
+ * middleware: authMiddleware,
257
+ * name: 'apiAuth'
258
+ * });
259
+ */
260
+ use(middleware: Function | Object): void;
261
+ /**
262
+ * Create conditional middleware wrapper
263
+ * @param {Object} config - Conditional middleware configuration
264
+ * @returns {Function} Wrapped middleware function
265
+ * @private
266
+ */
267
+ private createConditionalMiddleware;
268
+ /**
269
+ * Evaluate condition object
270
+ * @param {Object} condition - Condition object
271
+ * @param {Object} req - Request object
272
+ * @param {Object} res - Response object
273
+ * @returns {boolean} Whether condition is met
274
+ * @private
275
+ */
276
+ private evaluateConditionObject;
277
+ /**
278
+ * Match condition value
279
+ * @param {*} actual - Actual value
280
+ * @param {*} expected - Expected value or condition
281
+ * @returns {boolean} Whether condition matches
282
+ * @private
283
+ */
284
+ private matchCondition;
285
+ /**
286
+ * Create a route group with shared middleware and prefix
287
+ * @param {string} prefix - Path prefix for the group
288
+ * @param {Function|Array} middleware - Shared middleware
289
+ * @param {Function} callback - Function to define routes in the group
290
+ */
291
+ group(prefix: string, middleware: Function | any[], callback: Function): this;
292
+ /**
293
+ * Get current route prefix from active groups
294
+ * @private
295
+ */
296
+ private getCurrentPrefix;
297
+ /**
298
+ * Get current group middleware
299
+ * @private
300
+ */
301
+ private getCurrentGroupMiddleware;
302
+ /**
303
+ * Compile route pattern into optimized regex
304
+ * @param {string} pattern - Route pattern to compile
305
+ * @returns {Object} Compiled route object with regex and parameter names
306
+ * @private
307
+ */
308
+ private compileRoute;
309
+ /**
310
+ * Match path using compiled route
311
+ * @param {Object} compiledRoute - Compiled route object
312
+ * @param {string} path - Path to match
313
+ * @returns {Object|null} Parameters object or null if no match
314
+ * @private
315
+ */
316
+ private matchCompiledRoute;
317
+ /**
318
+ * Get performance metrics
319
+ * @returns {Object} Performance metrics object
320
+ */
321
+ getMetrics(): Object;
322
+ /**
323
+ * Get compilation statistics
324
+ * @returns {Object} Compilation statistics
325
+ */
326
+ getCompilationStats(): Object;
327
+ /**
328
+ * Clear route cache (useful for development)
329
+ */
330
+ clearCache(): void;
331
+ /**
332
+ * Clear compilation cache
333
+ */
334
+ clearCompilationCache(): void;
335
+ /**
336
+ * Get all registered routes with detailed information
337
+ * @returns {Array} Array of route information objects
338
+ */
339
+ getRoutes(): any[];
340
+ /**
341
+ * Find routes matching a pattern or method
342
+ * @param {Object} criteria - Search criteria
343
+ * @returns {Array} Matching routes
344
+ */
345
+ findRoutes(criteria?: Object): any[];
346
+ /**
347
+ * Test route matching without executing handlers
348
+ * @param {string} method - HTTP method
349
+ * @param {string} path - Path to test
350
+ * @returns {Object} Match result with route info and extracted parameters
351
+ */
352
+ testRoute(method: string, path: string): Object;
353
+ /**
354
+ * Get router debug information
355
+ * @returns {Object} Comprehensive debug information
356
+ */
357
+ getDebugInfo(): Object;
358
+ handle(req: any, res: any, options?: {}): Promise<void>;
359
+ createServer(options?: {}): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
360
+ get(path: any, handler: any, options?: {}): void;
361
+ post(path: any, handler: any, options?: {}): void;
362
+ put(path: any, handler: any, options?: {}): void;
363
+ patch(path: any, handler: any, options?: {}): void;
364
+ delete(path: any, handler: any, options?: {}): void;
365
+ options(path: any, handler: any, options?: {}): void;
366
+ head(path: any, handler: any, options?: {}): void;
367
+ }
368
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/api/router.js"],"names":[],"mappings":"AAqmDA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;;;;;GAKG;AACH,6CAHW,MAAM,GACJ,YAAY,CAIxB;AAED,iFASC;;AAx0CD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;IACE,0BA4CC;IA3CC,cAAgB;IAChB,0BAA2B;IAC3B,2BAA4B;IAC5B,kBAAgD;IAChD,mBAAqB;IACrB,wBAA0B;IAG1B,2BAA4D;IAC5D,8BAA+B;IAC/B,qCAAsC;IAGtC,sBAAyD;IACzD,oBAAoD;IACpD,mBAA2D;IAC3D,+BAAgC;IAGhC,kCAA0E;IAC1E,wBAA0E;IAG1E,sBAAyD;IACzD,gBAAkB;IAClB,6BAA8B;IAG9B,mBAAmD;IAEjD;;;;;;;;;;;kBAWC;IAIL;;;;;;;;;;;;;;;OAeG;IACH,iBAbW,MAAM,QACN,MAAM,+BAGd;QAAwB,UAAU;QACT,IAAI;QACJ,OAAO;KAEhC,QA2CF;IAED;;;;;;;OAOG;IACH,2BANW,MAAM,UACN,MAAM,QACN,MAAM,+BAEN,MAAM,QAIhB;IAED;;;;;;OAMG;IACH,kCALW,MAAM,QACN,MAAM,YACN,MAAM,YACN,MAAM,QAwChB;IAED;;;;;;OAMG;IACH,6BAiCC;IAED;;;;;;OAMG;IACH,oBA6BC;IAED;;;;;OAKG;IACH,wBAJW,MAAM,+BAEN,MAAM,QAuBhB;IAED;;;;;OAKG;IACH,gCAJW,MAAM,UACN,MAAM,QACN,MAAM,QAmChB;IAED;;;;;;;OAOG;IACH,kCAuEC;IAED;;;;;;OAMG;IACH,+BAoGC;IAED;;;;;OAKG;IACH,4BA+CC;IAED;;;;;OAKG;IACH,gBAJW,MAAM,WACN,GAAC,cACD,MAAM,QAahB;IAED;;;OAGG;IACH,iCAOC;IAED;;;;;OAKG;IACH,0BAkBC;IAED;;;;;;;;;;;;;;OAcG;IACH,kBAZW,MAAM,WACN,MAAM,GACJ,MAAM,CA0BlB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,uBAdW,MAAM,QAgBhB;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,gBAjBW,WAAS,MAAM,QAwBzB;IAED;;;;;OAKG;IACH,oCAsBC;IAED;;;;;;;OAOG;IACH,gCAsCC;IAED;;;;;;OAMG;IACH,uBAcC;IAED;;;;;OAKG;IACH,cAJW,MAAM,cACN,gBAAc,4BAcxB;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,qBAuDC;IAED;;;;;;OAMG;IACH,2BAcC;IAED;;;OAGG;IACH,cAFa,MAAM,CAiBlB;IAED;;;OAGG;IACH,uBAFa,MAAM,CAclB;IAED;;OAEG;IACH,mBAEC;IAED;;OAEG;IACH,8BAEC;IAED;;;OAGG;IACH,mBAWC;IAED;;;;OAIG;IACH,sBAHW,MAAM,SAkBhB;IAED;;;;;OAKG;IACH,kBAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAiClB;IAED;;;OAGG;IACH,gBAFa,MAAM,CAoClB;IAED,wDAyJC;IAED,+HAGC;IAGD,iDAEC;IAED,kDAEC;IAED,iDAEC;IAED,mDAEC;IAED,oDAEC;IAED,qDAEC;IAED,kDAEC;CACF"}