@superdangerous/app-framework 4.9.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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +652 -0
  3. package/dist/api/logsRouter.d.ts +20 -0
  4. package/dist/api/logsRouter.d.ts.map +1 -0
  5. package/dist/api/logsRouter.js +515 -0
  6. package/dist/api/logsRouter.js.map +1 -0
  7. package/dist/cli/dev-server.d.ts +7 -0
  8. package/dist/cli/dev-server.d.ts.map +1 -0
  9. package/dist/cli/dev-server.js +640 -0
  10. package/dist/cli/dev-server.js.map +1 -0
  11. package/dist/cli/index.d.ts +7 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +26 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/StandardServer.d.ts +129 -0
  16. package/dist/core/StandardServer.d.ts.map +1 -0
  17. package/dist/core/StandardServer.js +453 -0
  18. package/dist/core/StandardServer.js.map +1 -0
  19. package/dist/core/apiResponse.d.ts +69 -0
  20. package/dist/core/apiResponse.d.ts.map +1 -0
  21. package/dist/core/apiResponse.js +127 -0
  22. package/dist/core/apiResponse.js.map +1 -0
  23. package/dist/core/healthCheck.d.ts +160 -0
  24. package/dist/core/healthCheck.d.ts.map +1 -0
  25. package/dist/core/healthCheck.js +398 -0
  26. package/dist/core/healthCheck.js.map +1 -0
  27. package/dist/core/index.d.ts +40 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +40 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/logger.d.ts +117 -0
  32. package/dist/core/logger.d.ts.map +1 -0
  33. package/dist/core/logger.js +826 -0
  34. package/dist/core/logger.js.map +1 -0
  35. package/dist/core/portUtils.d.ts +71 -0
  36. package/dist/core/portUtils.d.ts.map +1 -0
  37. package/dist/core/portUtils.js +240 -0
  38. package/dist/core/portUtils.js.map +1 -0
  39. package/dist/core/storageService.d.ts +119 -0
  40. package/dist/core/storageService.d.ts.map +1 -0
  41. package/dist/core/storageService.js +405 -0
  42. package/dist/core/storageService.js.map +1 -0
  43. package/dist/desktop/bundler.d.ts +40 -0
  44. package/dist/desktop/bundler.d.ts.map +1 -0
  45. package/dist/desktop/bundler.js +176 -0
  46. package/dist/desktop/bundler.js.map +1 -0
  47. package/dist/desktop/index.d.ts +25 -0
  48. package/dist/desktop/index.d.ts.map +1 -0
  49. package/dist/desktop/index.js +15 -0
  50. package/dist/desktop/index.js.map +1 -0
  51. package/dist/desktop/native-modules.d.ts +66 -0
  52. package/dist/desktop/native-modules.d.ts.map +1 -0
  53. package/dist/desktop/native-modules.js +200 -0
  54. package/dist/desktop/native-modules.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +39 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/logging/LogCategories.d.ts +87 -0
  60. package/dist/logging/LogCategories.d.ts.map +1 -0
  61. package/dist/logging/LogCategories.js +205 -0
  62. package/dist/logging/LogCategories.js.map +1 -0
  63. package/dist/middleware/aiErrorHandler.d.ts +31 -0
  64. package/dist/middleware/aiErrorHandler.d.ts.map +1 -0
  65. package/dist/middleware/aiErrorHandler.js +181 -0
  66. package/dist/middleware/aiErrorHandler.js.map +1 -0
  67. package/dist/middleware/auth.d.ts +101 -0
  68. package/dist/middleware/auth.d.ts.map +1 -0
  69. package/dist/middleware/auth.js +230 -0
  70. package/dist/middleware/auth.js.map +1 -0
  71. package/dist/middleware/cors.d.ts +56 -0
  72. package/dist/middleware/cors.d.ts.map +1 -0
  73. package/dist/middleware/cors.js +123 -0
  74. package/dist/middleware/cors.js.map +1 -0
  75. package/dist/middleware/errorHandler.d.ts +13 -0
  76. package/dist/middleware/errorHandler.d.ts.map +1 -0
  77. package/dist/middleware/errorHandler.js +85 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/fileUpload.d.ts +62 -0
  80. package/dist/middleware/fileUpload.d.ts.map +1 -0
  81. package/dist/middleware/fileUpload.js +175 -0
  82. package/dist/middleware/fileUpload.js.map +1 -0
  83. package/dist/middleware/health.d.ts +48 -0
  84. package/dist/middleware/health.d.ts.map +1 -0
  85. package/dist/middleware/health.js +143 -0
  86. package/dist/middleware/health.js.map +1 -0
  87. package/dist/middleware/index.d.ts +20 -0
  88. package/dist/middleware/index.d.ts.map +1 -0
  89. package/dist/middleware/index.js +18 -0
  90. package/dist/middleware/index.js.map +1 -0
  91. package/dist/middleware/openapi.d.ts +64 -0
  92. package/dist/middleware/openapi.d.ts.map +1 -0
  93. package/dist/middleware/openapi.js +258 -0
  94. package/dist/middleware/openapi.js.map +1 -0
  95. package/dist/middleware/requestLogging.d.ts +22 -0
  96. package/dist/middleware/requestLogging.d.ts.map +1 -0
  97. package/dist/middleware/requestLogging.js +61 -0
  98. package/dist/middleware/requestLogging.js.map +1 -0
  99. package/dist/middleware/session.d.ts +84 -0
  100. package/dist/middleware/session.d.ts.map +1 -0
  101. package/dist/middleware/session.js +189 -0
  102. package/dist/middleware/session.js.map +1 -0
  103. package/dist/middleware/validation.d.ts +1337 -0
  104. package/dist/middleware/validation.d.ts.map +1 -0
  105. package/dist/middleware/validation.js +483 -0
  106. package/dist/middleware/validation.js.map +1 -0
  107. package/dist/services/aiService.d.ts +180 -0
  108. package/dist/services/aiService.d.ts.map +1 -0
  109. package/dist/services/aiService.js +547 -0
  110. package/dist/services/aiService.js.map +1 -0
  111. package/dist/services/conversationStorage.d.ts +38 -0
  112. package/dist/services/conversationStorage.d.ts.map +1 -0
  113. package/dist/services/conversationStorage.js +158 -0
  114. package/dist/services/conversationStorage.js.map +1 -0
  115. package/dist/services/crossPlatformBuffer.d.ts +84 -0
  116. package/dist/services/crossPlatformBuffer.d.ts.map +1 -0
  117. package/dist/services/crossPlatformBuffer.js +246 -0
  118. package/dist/services/crossPlatformBuffer.js.map +1 -0
  119. package/dist/services/index.d.ts +17 -0
  120. package/dist/services/index.d.ts.map +1 -0
  121. package/dist/services/index.js +18 -0
  122. package/dist/services/index.js.map +1 -0
  123. package/dist/services/networkService.d.ts +81 -0
  124. package/dist/services/networkService.d.ts.map +1 -0
  125. package/dist/services/networkService.js +268 -0
  126. package/dist/services/networkService.js.map +1 -0
  127. package/dist/services/queueService.d.ts +112 -0
  128. package/dist/services/queueService.d.ts.map +1 -0
  129. package/dist/services/queueService.js +338 -0
  130. package/dist/services/queueService.js.map +1 -0
  131. package/dist/services/settingsService.d.ts +135 -0
  132. package/dist/services/settingsService.d.ts.map +1 -0
  133. package/dist/services/settingsService.js +425 -0
  134. package/dist/services/settingsService.js.map +1 -0
  135. package/dist/services/systemMonitor.d.ts +208 -0
  136. package/dist/services/systemMonitor.d.ts.map +1 -0
  137. package/dist/services/systemMonitor.js +693 -0
  138. package/dist/services/systemMonitor.js.map +1 -0
  139. package/dist/services/updateService.d.ts +78 -0
  140. package/dist/services/updateService.d.ts.map +1 -0
  141. package/dist/services/updateService.js +252 -0
  142. package/dist/services/updateService.js.map +1 -0
  143. package/dist/services/websocketEvents.d.ts +372 -0
  144. package/dist/services/websocketEvents.d.ts.map +1 -0
  145. package/dist/services/websocketEvents.js +338 -0
  146. package/dist/services/websocketEvents.js.map +1 -0
  147. package/dist/services/websocketServer.d.ts +80 -0
  148. package/dist/services/websocketServer.d.ts.map +1 -0
  149. package/dist/services/websocketServer.js +299 -0
  150. package/dist/services/websocketServer.js.map +1 -0
  151. package/dist/settings/SettingsSchema.d.ts +151 -0
  152. package/dist/settings/SettingsSchema.d.ts.map +1 -0
  153. package/dist/settings/SettingsSchema.js +424 -0
  154. package/dist/settings/SettingsSchema.js.map +1 -0
  155. package/dist/testing/TestServer.d.ts +69 -0
  156. package/dist/testing/TestServer.d.ts.map +1 -0
  157. package/dist/testing/TestServer.js +250 -0
  158. package/dist/testing/TestServer.js.map +1 -0
  159. package/dist/types/index.d.ts +137 -0
  160. package/dist/types/index.d.ts.map +1 -0
  161. package/dist/types/index.js +5 -0
  162. package/dist/types/index.js.map +1 -0
  163. package/dist/utils/appPaths.d.ts +74 -0
  164. package/dist/utils/appPaths.d.ts.map +1 -0
  165. package/dist/utils/appPaths.js +162 -0
  166. package/dist/utils/appPaths.js.map +1 -0
  167. package/dist/utils/fs-utils.d.ts +50 -0
  168. package/dist/utils/fs-utils.d.ts.map +1 -0
  169. package/dist/utils/fs-utils.js +114 -0
  170. package/dist/utils/fs-utils.js.map +1 -0
  171. package/dist/utils/index.d.ts +12 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +10 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/standardConfig.d.ts +61 -0
  176. package/dist/utils/standardConfig.d.ts.map +1 -0
  177. package/dist/utils/standardConfig.js +109 -0
  178. package/dist/utils/standardConfig.js.map +1 -0
  179. package/dist/utils/startupBanner.d.ts +34 -0
  180. package/dist/utils/startupBanner.d.ts.map +1 -0
  181. package/dist/utils/startupBanner.js +169 -0
  182. package/dist/utils/startupBanner.js.map +1 -0
  183. package/dist/utils/startupLogger.d.ts +45 -0
  184. package/dist/utils/startupLogger.d.ts.map +1 -0
  185. package/dist/utils/startupLogger.js +200 -0
  186. package/dist/utils/startupLogger.js.map +1 -0
  187. package/package.json +151 -0
  188. package/src/api/logsRouter.ts +600 -0
  189. package/src/cli/dev-server.ts +803 -0
  190. package/src/cli/index.ts +31 -0
  191. package/src/core/StandardServer.ts +587 -0
  192. package/src/core/apiResponse.ts +202 -0
  193. package/src/core/healthCheck.ts +565 -0
  194. package/src/core/index.ts +80 -0
  195. package/src/core/logger.ts +1092 -0
  196. package/src/core/portUtils.ts +319 -0
  197. package/src/core/storageService.ts +595 -0
  198. package/src/desktop/bundler.ts +271 -0
  199. package/src/desktop/index.ts +18 -0
  200. package/src/desktop/native-modules.ts +289 -0
  201. package/src/index.ts +142 -0
  202. package/src/logging/LogCategories.ts +302 -0
  203. package/src/middleware/aiErrorHandler.ts +278 -0
  204. package/src/middleware/auth.ts +329 -0
  205. package/src/middleware/cors.ts +187 -0
  206. package/src/middleware/errorHandler.ts +103 -0
  207. package/src/middleware/fileUpload.ts +252 -0
  208. package/src/middleware/health.ts +206 -0
  209. package/src/middleware/index.ts +71 -0
  210. package/src/middleware/openapi.ts +305 -0
  211. package/src/middleware/requestLogging.ts +92 -0
  212. package/src/middleware/session.ts +238 -0
  213. package/src/middleware/validation.ts +603 -0
  214. package/src/services/aiService.ts +789 -0
  215. package/src/services/conversationStorage.ts +232 -0
  216. package/src/services/crossPlatformBuffer.ts +341 -0
  217. package/src/services/index.ts +47 -0
  218. package/src/services/networkService.ts +351 -0
  219. package/src/services/queueService.ts +446 -0
  220. package/src/services/settingsService.ts +549 -0
  221. package/src/services/systemMonitor.ts +936 -0
  222. package/src/services/updateService.ts +334 -0
  223. package/src/services/websocketEvents.ts +409 -0
  224. package/src/services/websocketServer.ts +394 -0
  225. package/src/settings/SettingsSchema.ts +664 -0
  226. package/src/testing/TestServer.ts +312 -0
  227. package/src/types/index.ts +154 -0
  228. package/src/utils/appPaths.ts +196 -0
  229. package/src/utils/fs-utils.ts +130 -0
  230. package/src/utils/index.ts +15 -0
  231. package/src/utils/standardConfig.ts +178 -0
  232. package/src/utils/startupBanner.ts +287 -0
  233. package/src/utils/startupLogger.ts +268 -0
  234. package/ui/dist/index.d.mts +1221 -0
  235. package/ui/dist/index.d.ts +1221 -0
  236. package/ui/dist/index.js +73 -0
  237. package/ui/dist/index.js.map +1 -0
  238. package/ui/dist/index.mjs +73 -0
  239. package/ui/dist/index.mjs.map +1 -0
@@ -0,0 +1,258 @@
1
+ /**
2
+ * OpenAPI Documentation Middleware
3
+ * Provides automatic API documentation generation
4
+ */
5
+ import swaggerJsdoc from "swagger-jsdoc";
6
+ import swaggerUi from "swagger-ui-express";
7
+ /**
8
+ * Generate OpenAPI specification
9
+ * @param config OpenAPI configuration
10
+ * @param apis Array of file patterns for API routes
11
+ */
12
+ export function generateOpenAPISpec(config, apis) {
13
+ const options = {
14
+ definition: {
15
+ openapi: "3.0.0",
16
+ info: {
17
+ title: config.title,
18
+ version: config.version,
19
+ description: config.description,
20
+ contact: config.contact,
21
+ license: config.license,
22
+ },
23
+ servers: config.servers || [
24
+ {
25
+ url: "http://localhost:3000",
26
+ description: "Development server",
27
+ },
28
+ ],
29
+ tags: config.tags,
30
+ components: {
31
+ schemas: {
32
+ ApiResponse: {
33
+ type: "object",
34
+ properties: {
35
+ success: {
36
+ type: "boolean",
37
+ description: "Indicates if the request was successful",
38
+ },
39
+ data: {
40
+ type: "object",
41
+ description: "Response data payload",
42
+ },
43
+ error: {
44
+ type: "object",
45
+ properties: {
46
+ code: {
47
+ type: "string",
48
+ description: "Error code",
49
+ },
50
+ message: {
51
+ type: "string",
52
+ description: "Error message",
53
+ },
54
+ details: {
55
+ type: "object",
56
+ description: "Additional error details",
57
+ },
58
+ },
59
+ },
60
+ message: {
61
+ type: "string",
62
+ description: "Optional success message",
63
+ },
64
+ metadata: {
65
+ type: "object",
66
+ properties: {
67
+ timestamp: {
68
+ type: "string",
69
+ format: "date-time",
70
+ description: "Response timestamp",
71
+ },
72
+ version: {
73
+ type: "string",
74
+ description: "API version",
75
+ },
76
+ pagination: {
77
+ type: "object",
78
+ properties: {
79
+ page: { type: "integer" },
80
+ limit: { type: "integer" },
81
+ total: { type: "integer" },
82
+ hasMore: { type: "boolean" },
83
+ },
84
+ },
85
+ },
86
+ },
87
+ },
88
+ },
89
+ ValidationError: {
90
+ type: "object",
91
+ properties: {
92
+ field: {
93
+ type: "string",
94
+ description: "Field that failed validation",
95
+ },
96
+ message: {
97
+ type: "string",
98
+ description: "Validation error message",
99
+ },
100
+ },
101
+ },
102
+ ErrorResponse: {
103
+ type: "object",
104
+ properties: {
105
+ success: {
106
+ type: "boolean",
107
+ enum: [false],
108
+ },
109
+ error: {
110
+ type: "object",
111
+ properties: {
112
+ code: { type: "string" },
113
+ message: { type: "string" },
114
+ details: { type: "object" },
115
+ },
116
+ required: ["code", "message"],
117
+ },
118
+ },
119
+ required: ["success", "error"],
120
+ },
121
+ },
122
+ securitySchemes: {
123
+ sessionAuth: {
124
+ type: "apiKey",
125
+ in: "cookie",
126
+ name: "connect.sid",
127
+ description: "Session-based authentication",
128
+ },
129
+ bearerAuth: {
130
+ type: "http",
131
+ scheme: "bearer",
132
+ bearerFormat: "JWT",
133
+ description: "JWT bearer token authentication",
134
+ },
135
+ },
136
+ responses: {
137
+ BadRequest: {
138
+ description: "Bad request",
139
+ content: {
140
+ "application/json": {
141
+ schema: {
142
+ $ref: "#/components/schemas/ErrorResponse",
143
+ },
144
+ },
145
+ },
146
+ },
147
+ Unauthorized: {
148
+ description: "Authentication required",
149
+ content: {
150
+ "application/json": {
151
+ schema: {
152
+ $ref: "#/components/schemas/ErrorResponse",
153
+ },
154
+ },
155
+ },
156
+ },
157
+ Forbidden: {
158
+ description: "Access denied",
159
+ content: {
160
+ "application/json": {
161
+ schema: {
162
+ $ref: "#/components/schemas/ErrorResponse",
163
+ },
164
+ },
165
+ },
166
+ },
167
+ NotFound: {
168
+ description: "Resource not found",
169
+ content: {
170
+ "application/json": {
171
+ schema: {
172
+ $ref: "#/components/schemas/ErrorResponse",
173
+ },
174
+ },
175
+ },
176
+ },
177
+ InternalError: {
178
+ description: "Internal server error",
179
+ content: {
180
+ "application/json": {
181
+ schema: {
182
+ $ref: "#/components/schemas/ErrorResponse",
183
+ },
184
+ },
185
+ },
186
+ },
187
+ },
188
+ },
189
+ },
190
+ apis,
191
+ };
192
+ return swaggerJsdoc(options);
193
+ }
194
+ /**
195
+ * Setup OpenAPI documentation UI
196
+ * @param app Express application
197
+ * @param config OpenAPI configuration
198
+ * @param apis Array of file patterns for API routes
199
+ * @param path Path to serve documentation (default: /api-docs)
200
+ */
201
+ export function setupOpenAPIDocumentation(app, config, apis, path = "/api-docs") {
202
+ const swaggerSpec = generateOpenAPISpec(config, apis);
203
+ // Serve OpenAPI spec as JSON
204
+ app.get(`${path}/spec.json`, (_req, res) => {
205
+ res.json(swaggerSpec);
206
+ });
207
+ // Serve Swagger UI
208
+ app.use(path, swaggerUi.serve, swaggerUi.setup(swaggerSpec, {
209
+ customSiteTitle: `${config.title} - API Documentation`,
210
+ customfavIcon: "/favicon.ico",
211
+ customCss: `
212
+ .swagger-ui .topbar { display: none }
213
+ .swagger-ui .info { margin-bottom: 40px }
214
+ .swagger-ui .scheme-container { display: none }
215
+ `,
216
+ swaggerOptions: {
217
+ persistAuthorization: true,
218
+ displayRequestDuration: true,
219
+ docExpansion: "none",
220
+ filter: true,
221
+ showExtensions: true,
222
+ showCommonExtensions: true,
223
+ displayOperationId: false,
224
+ },
225
+ }));
226
+ }
227
+ /**
228
+ * Example JSDoc annotation for OpenAPI
229
+ *
230
+ * @swagger
231
+ * /api/resource:
232
+ * get:
233
+ * summary: Get all resources
234
+ * tags: [Resources]
235
+ * responses:
236
+ * 200:
237
+ * description: Successful response
238
+ * content:
239
+ * application/json:
240
+ * schema:
241
+ * $ref: '#/components/schemas/ApiResponse'
242
+ * 500:
243
+ * $ref: '#/components/responses/InternalError'
244
+ */
245
+ /**
246
+ * OpenAPI operation decorator (for future TypeScript decorator support)
247
+ */
248
+ export function ApiOperation(operation) {
249
+ return function (target, propertyKey, descriptor) {
250
+ // Store OpenAPI metadata for later processing
251
+ if (!target._openapi) {
252
+ target._openapi = {};
253
+ }
254
+ target._openapi[propertyKey] = operation;
255
+ return descriptor;
256
+ };
257
+ }
258
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/middleware/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { NextFunction, Request, Response } from "express";
2
+ export interface RequestLoggingOptions {
3
+ logger?: any;
4
+ /**
5
+ * Paths to skip logging for (commonly health checks or metrics)
6
+ */
7
+ skipPaths?: Array<string | RegExp>;
8
+ /**
9
+ * Whether to log the request payload (truncated)
10
+ */
11
+ logPayload?: boolean;
12
+ /**
13
+ * Maximum number of characters from the payload to log
14
+ */
15
+ maxPayloadLength?: number;
16
+ }
17
+ /**
18
+ * Express middleware that assigns a request ID and logs completion.
19
+ * Uses the framework logger so request logs land in the same files as the app.
20
+ */
21
+ export declare function createRequestLoggingMiddleware(options?: RequestLoggingOptions): (req: Request, res: Response, next: NextFunction) => void;
22
+ //# sourceMappingURL=requestLogging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLogging.d.ts","sourceRoot":"","sources":["../../src/middleware/requestLogging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,GAAG,CAAC;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACnC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAoBD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qBAA0B,IAWjC,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,UAmCrB"}
@@ -0,0 +1,61 @@
1
+ import { randomUUID } from "crypto";
2
+ import { createLogger } from "../core/logger.js";
3
+ const defaultSkips = [/^\/health/, /^\/api\/health/];
4
+ function shouldSkip(path, patterns) {
5
+ return patterns.some((pattern) => {
6
+ if (pattern instanceof RegExp) {
7
+ return pattern.test(path);
8
+ }
9
+ return path.startsWith(pattern);
10
+ });
11
+ }
12
+ function safePayload(body, maxLength) {
13
+ if (!body || typeof body !== "object")
14
+ return undefined;
15
+ const serialized = JSON.stringify(body);
16
+ if (serialized.length <= maxLength)
17
+ return serialized;
18
+ return `${serialized.slice(0, maxLength)}…`;
19
+ }
20
+ /**
21
+ * Express middleware that assigns a request ID and logs completion.
22
+ * Uses the framework logger so request logs land in the same files as the app.
23
+ */
24
+ export function createRequestLoggingMiddleware(options = {}) {
25
+ const logger = options.logger ||
26
+ // Avoid forcing the consumer to initialize logging before use
27
+ createLogger("http");
28
+ const skipPatterns = options.skipPaths || defaultSkips;
29
+ const logPayload = options.logPayload ?? false;
30
+ const maxPayloadLength = options.maxPayloadLength ?? 2000;
31
+ return function requestLogging(req, res, next) {
32
+ const startedAt = process.hrtime.bigint();
33
+ const requestId = req.requestId || randomUUID();
34
+ req.requestId = requestId;
35
+ res.locals.requestId = requestId;
36
+ res.setHeader("x-request-id", requestId);
37
+ res.on("finish", () => {
38
+ if (shouldSkip(req.path, skipPatterns))
39
+ return;
40
+ const durationMs = Number(process.hrtime.bigint() - startedAt) / 1_000_000;
41
+ // Prefer the richer logRequest helper if available
42
+ if (typeof logger.logRequest === "function") {
43
+ logger.logRequest(req, res, Number(durationMs.toFixed(2)));
44
+ return;
45
+ }
46
+ logger.info("Request completed", {
47
+ method: req.method,
48
+ path: req.originalUrl || req.url,
49
+ status: res.statusCode,
50
+ durationMs: Number(durationMs.toFixed(2)),
51
+ requestId,
52
+ userAgent: req.get("user-agent"),
53
+ payload: logPayload
54
+ ? safePayload(req.body, maxPayloadLength)
55
+ : undefined,
56
+ });
57
+ });
58
+ next();
59
+ };
60
+ }
61
+ //# sourceMappingURL=requestLogging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLogging.js","sourceRoot":"","sources":["../../src/middleware/requestLogging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Session Configuration Middleware
3
+ * Standardized session management for Express applications
4
+ */
5
+ import session from "express-session";
6
+ import { Express } from "express";
7
+ export interface SessionConfig {
8
+ secret?: string;
9
+ name?: string;
10
+ maxAge?: number;
11
+ secure?: boolean;
12
+ sameSite?: "lax" | "strict" | "none";
13
+ trustProxy?: boolean;
14
+ resave?: boolean;
15
+ saveUninitialized?: boolean;
16
+ rolling?: boolean;
17
+ store?: "memory" | session.Store;
18
+ }
19
+ /**
20
+ * Configure session middleware with sensible defaults
21
+ */
22
+ export declare function configureSession(app: Express, config?: SessionConfig): void;
23
+ /**
24
+ * Create a Redis session store (OPTIONAL)
25
+ *
26
+ * Redis is an optional dependency for persistent session storage in production.
27
+ * If Redis packages are not installed, the framework gracefully falls back to memory store.
28
+ *
29
+ * To enable Redis sessions:
30
+ * 1. Install optional dependencies: `npm install connect-redis redis`
31
+ * 2. Set REDIS_URL environment variable (optional, defaults to redis://localhost:6379)
32
+ * 3. Use createRedisStore() in your session configuration
33
+ *
34
+ * For desktop applications with single users, memory store is usually sufficient.
35
+ *
36
+ * @param redisUrl - Optional Redis connection URL (defaults to REDIS_URL env var or redis://localhost:6379)
37
+ * @returns Redis store instance or 'memory' string on failure
38
+ */
39
+ export declare function createRedisStore(redisUrl?: string): Promise<any>;
40
+ /**
41
+ * Session utilities
42
+ */
43
+ export declare const sessionUtils: {
44
+ /**
45
+ * Regenerate session ID (for security after login)
46
+ */
47
+ regenerateSession(req: any): Promise<void>;
48
+ /**
49
+ * Save session explicitly
50
+ */
51
+ saveSession(req: any): Promise<void>;
52
+ /**
53
+ * Destroy session
54
+ */
55
+ destroySession(req: any): Promise<void>;
56
+ /**
57
+ * Touch session to extend expiry
58
+ */
59
+ touchSession(req: any): void;
60
+ };
61
+ declare const _default: {
62
+ configureSession: typeof configureSession;
63
+ createRedisStore: typeof createRedisStore;
64
+ sessionUtils: {
65
+ /**
66
+ * Regenerate session ID (for security after login)
67
+ */
68
+ regenerateSession(req: any): Promise<void>;
69
+ /**
70
+ * Save session explicitly
71
+ */
72
+ saveSession(req: any): Promise<void>;
73
+ /**
74
+ * Destroy session
75
+ */
76
+ destroySession(req: any): Promise<void>;
77
+ /**
78
+ * Touch session to extend expiry
79
+ */
80
+ touchSession(req: any): void;
81
+ };
82
+ };
83
+ export default _default;
84
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,OAAO,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAYlC,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,aAAkB,QA4FxE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,gBAyBvD;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB;;OAEG;2BACoB,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1C;;OAEG;qBACc,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAapC;;OAEG;wBACiB,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;OAEG;sBACe,GAAG,GAAG,IAAI;CAK7B,CAAC;;;;;QAxDA;;WAEG;+BACoB,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QAa1C;;WAEG;yBACc,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QAapC;;WAEG;4BACiB,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QAavC;;WAEG;0BACe,GAAG,GAAG,IAAI;;;AAO9B,wBAIE"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Session Configuration Middleware
3
+ * Standardized session management for Express applications
4
+ */
5
+ import session from "express-session";
6
+ import { createLogger } from "../core/index.js";
7
+ let logger; // Will be initialized when needed
8
+ function ensureLogger() {
9
+ if (!logger) {
10
+ logger = createLogger("SessionMiddleware");
11
+ }
12
+ return logger;
13
+ }
14
+ /**
15
+ * Configure session middleware with sensible defaults
16
+ */
17
+ export function configureSession(app, config = {}) {
18
+ const { secret = process.env.SESSION_SECRET || "change-this-secret-in-production", name = "app.sid", maxAge = 3600000, // 1 hour
19
+ secure = process.env.NODE_ENV === "production", sameSite = "lax", trustProxy = true, resave = false, saveUninitialized = false, rolling = true, store = "memory", } = config;
20
+ // Warn about insecure settings in production
21
+ if (process.env.NODE_ENV === "production") {
22
+ if (secret === "change-this-secret-in-production") {
23
+ ensureLogger().warn("Using default session secret in production! Set SESSION_SECRET environment variable.");
24
+ }
25
+ if (store === "memory") {
26
+ ensureLogger().warn("Using memory session store in production! Consider using Redis or another persistent store.");
27
+ }
28
+ if (!secure) {
29
+ ensureLogger().warn("Session cookies are not secure in production! Consider enabling secure cookies.");
30
+ }
31
+ }
32
+ // Trust proxy if configured
33
+ if (trustProxy) {
34
+ app.set("trust proxy", 1);
35
+ }
36
+ // Suppress MemoryStore warning in production
37
+ let originalWarn;
38
+ if (process.env.NODE_ENV === "production" && store === "memory") {
39
+ originalWarn = console.warn;
40
+ console.warn = (msg, ...args) => {
41
+ if (typeof msg === "string" && !msg.includes("MemoryStore")) {
42
+ originalWarn(msg, ...args);
43
+ }
44
+ };
45
+ }
46
+ const sessionConfig = {
47
+ secret,
48
+ name,
49
+ resave,
50
+ saveUninitialized,
51
+ rolling,
52
+ cookie: {
53
+ secure,
54
+ httpOnly: true,
55
+ maxAge,
56
+ sameSite,
57
+ path: "/",
58
+ },
59
+ };
60
+ // Add store if provided
61
+ if (store !== "memory") {
62
+ sessionConfig.store = store;
63
+ }
64
+ // Apply middleware
65
+ app.use(session(sessionConfig));
66
+ // Restore console.warn if it was modified
67
+ if (originalWarn) {
68
+ // Restore after a brief delay to ensure session is initialized
69
+ setTimeout(() => {
70
+ console.warn = originalWarn;
71
+ }, 100);
72
+ }
73
+ if (process.env.NODE_ENV === "development" &&
74
+ process.env.LOG_LEVEL?.toLowerCase() === "debug") {
75
+ ensureLogger().debug("Session middleware configured", {
76
+ name,
77
+ secure,
78
+ sameSite,
79
+ maxAge: `${maxAge / 1000}s`,
80
+ store: store === "memory" ? "memory" : "custom",
81
+ });
82
+ }
83
+ }
84
+ /**
85
+ * Create a Redis session store (OPTIONAL)
86
+ *
87
+ * Redis is an optional dependency for persistent session storage in production.
88
+ * If Redis packages are not installed, the framework gracefully falls back to memory store.
89
+ *
90
+ * To enable Redis sessions:
91
+ * 1. Install optional dependencies: `npm install connect-redis redis`
92
+ * 2. Set REDIS_URL environment variable (optional, defaults to redis://localhost:6379)
93
+ * 3. Use createRedisStore() in your session configuration
94
+ *
95
+ * For desktop applications with single users, memory store is usually sufficient.
96
+ *
97
+ * @param redisUrl - Optional Redis connection URL (defaults to REDIS_URL env var or redis://localhost:6379)
98
+ * @returns Redis store instance or 'memory' string on failure
99
+ */
100
+ export async function createRedisStore(redisUrl) {
101
+ try {
102
+ // @ts-expect-error - Optional dependency
103
+ const RedisStore = (await import(/* @vite-ignore */ "connect-redis"))
104
+ .default;
105
+ // @ts-expect-error - Optional dependency
106
+ const { createClient } = await import(/* @vite-ignore */ "redis");
107
+ const redisClient = createClient({
108
+ url: redisUrl || process.env.REDIS_URL || "redis://localhost:6379",
109
+ });
110
+ await redisClient.connect();
111
+ ensureLogger().info("Redis session store connected");
112
+ return new RedisStore({
113
+ client: redisClient,
114
+ prefix: "session:",
115
+ });
116
+ }
117
+ catch (_error) {
118
+ ensureLogger().error("Failed to create Redis store:", _error.message);
119
+ ensureLogger().warn("Falling back to memory store");
120
+ return "memory";
121
+ }
122
+ }
123
+ /**
124
+ * Session utilities
125
+ */
126
+ export const sessionUtils = {
127
+ /**
128
+ * Regenerate session ID (for security after login)
129
+ */
130
+ regenerateSession(req) {
131
+ return new Promise((resolve, reject) => {
132
+ req.session.regenerate((err) => {
133
+ if (err) {
134
+ ensureLogger().error("Failed to regenerate session:", err);
135
+ reject(err);
136
+ }
137
+ else {
138
+ resolve();
139
+ }
140
+ });
141
+ });
142
+ },
143
+ /**
144
+ * Save session explicitly
145
+ */
146
+ saveSession(req) {
147
+ return new Promise((resolve, reject) => {
148
+ req.session.save((err) => {
149
+ if (err) {
150
+ ensureLogger().error("Failed to save session:", err);
151
+ reject(err);
152
+ }
153
+ else {
154
+ resolve();
155
+ }
156
+ });
157
+ });
158
+ },
159
+ /**
160
+ * Destroy session
161
+ */
162
+ destroySession(req) {
163
+ return new Promise((resolve, reject) => {
164
+ req.session.destroy((err) => {
165
+ if (err) {
166
+ ensureLogger().error("Failed to destroy session:", err);
167
+ reject(err);
168
+ }
169
+ else {
170
+ resolve();
171
+ }
172
+ });
173
+ });
174
+ },
175
+ /**
176
+ * Touch session to extend expiry
177
+ */
178
+ touchSession(req) {
179
+ if (req.session) {
180
+ req.session.touch();
181
+ }
182
+ },
183
+ };
184
+ export default {
185
+ configureSession,
186
+ createRedisStore,
187
+ sessionUtils,
188
+ };
189
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"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"}