@bloomneo/appkit 1.2.9

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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +902 -0
  3. package/bin/appkit.js +71 -0
  4. package/bin/commands/generate.js +1050 -0
  5. package/bin/templates/backend/README.md.template +39 -0
  6. package/bin/templates/backend/api.http.template +0 -0
  7. package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
  8. package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
  9. package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
  10. package/bin/templates/backend/package.json.template +34 -0
  11. package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
  12. package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
  13. package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
  14. package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
  15. package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
  16. package/bin/templates/backend/src/api/server.ts.template +188 -0
  17. package/bin/templates/backend/tsconfig.api.json.template +24 -0
  18. package/bin/templates/backend/tsconfig.json.template +40 -0
  19. package/bin/templates/feature/feature.http.template +63 -0
  20. package/bin/templates/feature/feature.route.ts.template +36 -0
  21. package/bin/templates/feature/feature.service.ts.template +81 -0
  22. package/bin/templates/feature/feature.types.ts.template +23 -0
  23. package/bin/templates/feature-db/feature.http.template +63 -0
  24. package/bin/templates/feature-db/feature.model.ts.template +74 -0
  25. package/bin/templates/feature-db/feature.route.ts.template +58 -0
  26. package/bin/templates/feature-db/feature.service.ts.template +231 -0
  27. package/bin/templates/feature-db/feature.types.ts.template +25 -0
  28. package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
  29. package/bin/templates/feature-db/seeding/README.md.template +57 -0
  30. package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
  31. package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
  32. package/bin/templates/feature-user/user.http.template +157 -0
  33. package/bin/templates/feature-user/user.model.ts.template +244 -0
  34. package/bin/templates/feature-user/user.route.ts.template +379 -0
  35. package/bin/templates/feature-user/user.seed.js.template +182 -0
  36. package/bin/templates/feature-user/user.service.ts.template +426 -0
  37. package/bin/templates/feature-user/user.types.ts.template +127 -0
  38. package/dist/auth/auth.d.ts +182 -0
  39. package/dist/auth/auth.d.ts.map +1 -0
  40. package/dist/auth/auth.js +477 -0
  41. package/dist/auth/auth.js.map +1 -0
  42. package/dist/auth/defaults.d.ts +104 -0
  43. package/dist/auth/defaults.d.ts.map +1 -0
  44. package/dist/auth/defaults.js +374 -0
  45. package/dist/auth/defaults.js.map +1 -0
  46. package/dist/auth/index.d.ts +70 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +94 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/cache/cache.d.ts +118 -0
  51. package/dist/cache/cache.d.ts.map +1 -0
  52. package/dist/cache/cache.js +249 -0
  53. package/dist/cache/cache.js.map +1 -0
  54. package/dist/cache/defaults.d.ts +63 -0
  55. package/dist/cache/defaults.d.ts.map +1 -0
  56. package/dist/cache/defaults.js +193 -0
  57. package/dist/cache/defaults.js.map +1 -0
  58. package/dist/cache/index.d.ts +101 -0
  59. package/dist/cache/index.d.ts.map +1 -0
  60. package/dist/cache/index.js +203 -0
  61. package/dist/cache/index.js.map +1 -0
  62. package/dist/cache/strategies/memory.d.ts +138 -0
  63. package/dist/cache/strategies/memory.d.ts.map +1 -0
  64. package/dist/cache/strategies/memory.js +348 -0
  65. package/dist/cache/strategies/memory.js.map +1 -0
  66. package/dist/cache/strategies/redis.d.ts +105 -0
  67. package/dist/cache/strategies/redis.d.ts.map +1 -0
  68. package/dist/cache/strategies/redis.js +318 -0
  69. package/dist/cache/strategies/redis.js.map +1 -0
  70. package/dist/config/config.d.ts +62 -0
  71. package/dist/config/config.d.ts.map +1 -0
  72. package/dist/config/config.js +107 -0
  73. package/dist/config/config.js.map +1 -0
  74. package/dist/config/defaults.d.ts +44 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +217 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +105 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +163 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/database/adapters/mongoose.d.ts +106 -0
  83. package/dist/database/adapters/mongoose.d.ts.map +1 -0
  84. package/dist/database/adapters/mongoose.js +480 -0
  85. package/dist/database/adapters/mongoose.js.map +1 -0
  86. package/dist/database/adapters/prisma.d.ts +106 -0
  87. package/dist/database/adapters/prisma.d.ts.map +1 -0
  88. package/dist/database/adapters/prisma.js +494 -0
  89. package/dist/database/adapters/prisma.js.map +1 -0
  90. package/dist/database/defaults.d.ts +87 -0
  91. package/dist/database/defaults.d.ts.map +1 -0
  92. package/dist/database/defaults.js +271 -0
  93. package/dist/database/defaults.js.map +1 -0
  94. package/dist/database/index.d.ts +137 -0
  95. package/dist/database/index.d.ts.map +1 -0
  96. package/dist/database/index.js +490 -0
  97. package/dist/database/index.js.map +1 -0
  98. package/dist/email/defaults.d.ts +100 -0
  99. package/dist/email/defaults.d.ts.map +1 -0
  100. package/dist/email/defaults.js +400 -0
  101. package/dist/email/defaults.js.map +1 -0
  102. package/dist/email/email.d.ts +139 -0
  103. package/dist/email/email.d.ts.map +1 -0
  104. package/dist/email/email.js +316 -0
  105. package/dist/email/email.js.map +1 -0
  106. package/dist/email/index.d.ts +176 -0
  107. package/dist/email/index.d.ts.map +1 -0
  108. package/dist/email/index.js +251 -0
  109. package/dist/email/index.js.map +1 -0
  110. package/dist/email/strategies/console.d.ts +90 -0
  111. package/dist/email/strategies/console.d.ts.map +1 -0
  112. package/dist/email/strategies/console.js +268 -0
  113. package/dist/email/strategies/console.js.map +1 -0
  114. package/dist/email/strategies/resend.d.ts +84 -0
  115. package/dist/email/strategies/resend.d.ts.map +1 -0
  116. package/dist/email/strategies/resend.js +266 -0
  117. package/dist/email/strategies/resend.js.map +1 -0
  118. package/dist/email/strategies/smtp.d.ts +77 -0
  119. package/dist/email/strategies/smtp.d.ts.map +1 -0
  120. package/dist/email/strategies/smtp.js +286 -0
  121. package/dist/email/strategies/smtp.js.map +1 -0
  122. package/dist/error/defaults.d.ts +40 -0
  123. package/dist/error/defaults.d.ts.map +1 -0
  124. package/dist/error/defaults.js +75 -0
  125. package/dist/error/defaults.js.map +1 -0
  126. package/dist/error/error.d.ts +140 -0
  127. package/dist/error/error.d.ts.map +1 -0
  128. package/dist/error/error.js +200 -0
  129. package/dist/error/error.js.map +1 -0
  130. package/dist/error/index.d.ts +145 -0
  131. package/dist/error/index.d.ts.map +1 -0
  132. package/dist/error/index.js +145 -0
  133. package/dist/error/index.js.map +1 -0
  134. package/dist/event/defaults.d.ts +111 -0
  135. package/dist/event/defaults.d.ts.map +1 -0
  136. package/dist/event/defaults.js +378 -0
  137. package/dist/event/defaults.js.map +1 -0
  138. package/dist/event/event.d.ts +171 -0
  139. package/dist/event/event.d.ts.map +1 -0
  140. package/dist/event/event.js +391 -0
  141. package/dist/event/event.js.map +1 -0
  142. package/dist/event/index.d.ts +173 -0
  143. package/dist/event/index.d.ts.map +1 -0
  144. package/dist/event/index.js +302 -0
  145. package/dist/event/index.js.map +1 -0
  146. package/dist/event/strategies/memory.d.ts +122 -0
  147. package/dist/event/strategies/memory.d.ts.map +1 -0
  148. package/dist/event/strategies/memory.js +331 -0
  149. package/dist/event/strategies/memory.js.map +1 -0
  150. package/dist/event/strategies/redis.d.ts +115 -0
  151. package/dist/event/strategies/redis.d.ts.map +1 -0
  152. package/dist/event/strategies/redis.js +434 -0
  153. package/dist/event/strategies/redis.js.map +1 -0
  154. package/dist/index.d.ts +58 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +72 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/logger/defaults.d.ts +67 -0
  159. package/dist/logger/defaults.d.ts.map +1 -0
  160. package/dist/logger/defaults.js +213 -0
  161. package/dist/logger/defaults.js.map +1 -0
  162. package/dist/logger/index.d.ts +84 -0
  163. package/dist/logger/index.d.ts.map +1 -0
  164. package/dist/logger/index.js +101 -0
  165. package/dist/logger/index.js.map +1 -0
  166. package/dist/logger/logger.d.ts +165 -0
  167. package/dist/logger/logger.d.ts.map +1 -0
  168. package/dist/logger/logger.js +843 -0
  169. package/dist/logger/logger.js.map +1 -0
  170. package/dist/logger/transports/console.d.ts +102 -0
  171. package/dist/logger/transports/console.d.ts.map +1 -0
  172. package/dist/logger/transports/console.js +276 -0
  173. package/dist/logger/transports/console.js.map +1 -0
  174. package/dist/logger/transports/database.d.ts +153 -0
  175. package/dist/logger/transports/database.d.ts.map +1 -0
  176. package/dist/logger/transports/database.js +539 -0
  177. package/dist/logger/transports/database.js.map +1 -0
  178. package/dist/logger/transports/file.d.ts +146 -0
  179. package/dist/logger/transports/file.d.ts.map +1 -0
  180. package/dist/logger/transports/file.js +464 -0
  181. package/dist/logger/transports/file.js.map +1 -0
  182. package/dist/logger/transports/http.d.ts +128 -0
  183. package/dist/logger/transports/http.d.ts.map +1 -0
  184. package/dist/logger/transports/http.js +401 -0
  185. package/dist/logger/transports/http.js.map +1 -0
  186. package/dist/logger/transports/webhook.d.ts +152 -0
  187. package/dist/logger/transports/webhook.d.ts.map +1 -0
  188. package/dist/logger/transports/webhook.js +485 -0
  189. package/dist/logger/transports/webhook.js.map +1 -0
  190. package/dist/queue/defaults.d.ts +66 -0
  191. package/dist/queue/defaults.d.ts.map +1 -0
  192. package/dist/queue/defaults.js +205 -0
  193. package/dist/queue/defaults.js.map +1 -0
  194. package/dist/queue/index.d.ts +124 -0
  195. package/dist/queue/index.d.ts.map +1 -0
  196. package/dist/queue/index.js +116 -0
  197. package/dist/queue/index.js.map +1 -0
  198. package/dist/queue/queue.d.ts +156 -0
  199. package/dist/queue/queue.d.ts.map +1 -0
  200. package/dist/queue/queue.js +387 -0
  201. package/dist/queue/queue.js.map +1 -0
  202. package/dist/queue/transports/database.d.ts +165 -0
  203. package/dist/queue/transports/database.d.ts.map +1 -0
  204. package/dist/queue/transports/database.js +595 -0
  205. package/dist/queue/transports/database.js.map +1 -0
  206. package/dist/queue/transports/memory.d.ts +143 -0
  207. package/dist/queue/transports/memory.d.ts.map +1 -0
  208. package/dist/queue/transports/memory.js +415 -0
  209. package/dist/queue/transports/memory.js.map +1 -0
  210. package/dist/queue/transports/redis.d.ts +203 -0
  211. package/dist/queue/transports/redis.d.ts.map +1 -0
  212. package/dist/queue/transports/redis.js +744 -0
  213. package/dist/queue/transports/redis.js.map +1 -0
  214. package/dist/security/defaults.d.ts +64 -0
  215. package/dist/security/defaults.d.ts.map +1 -0
  216. package/dist/security/defaults.js +159 -0
  217. package/dist/security/defaults.js.map +1 -0
  218. package/dist/security/index.d.ts +110 -0
  219. package/dist/security/index.d.ts.map +1 -0
  220. package/dist/security/index.js +160 -0
  221. package/dist/security/index.js.map +1 -0
  222. package/dist/security/security.d.ts +138 -0
  223. package/dist/security/security.d.ts.map +1 -0
  224. package/dist/security/security.js +419 -0
  225. package/dist/security/security.js.map +1 -0
  226. package/dist/storage/defaults.d.ts +79 -0
  227. package/dist/storage/defaults.d.ts.map +1 -0
  228. package/dist/storage/defaults.js +358 -0
  229. package/dist/storage/defaults.js.map +1 -0
  230. package/dist/storage/index.d.ts +153 -0
  231. package/dist/storage/index.d.ts.map +1 -0
  232. package/dist/storage/index.js +242 -0
  233. package/dist/storage/index.js.map +1 -0
  234. package/dist/storage/storage.d.ts +151 -0
  235. package/dist/storage/storage.d.ts.map +1 -0
  236. package/dist/storage/storage.js +439 -0
  237. package/dist/storage/storage.js.map +1 -0
  238. package/dist/storage/strategies/local.d.ts +117 -0
  239. package/dist/storage/strategies/local.d.ts.map +1 -0
  240. package/dist/storage/strategies/local.js +368 -0
  241. package/dist/storage/strategies/local.js.map +1 -0
  242. package/dist/storage/strategies/r2.d.ts +130 -0
  243. package/dist/storage/strategies/r2.d.ts.map +1 -0
  244. package/dist/storage/strategies/r2.js +470 -0
  245. package/dist/storage/strategies/r2.js.map +1 -0
  246. package/dist/storage/strategies/s3.d.ts +121 -0
  247. package/dist/storage/strategies/s3.d.ts.map +1 -0
  248. package/dist/storage/strategies/s3.js +461 -0
  249. package/dist/storage/strategies/s3.js.map +1 -0
  250. package/dist/util/defaults.d.ts +77 -0
  251. package/dist/util/defaults.d.ts.map +1 -0
  252. package/dist/util/defaults.js +193 -0
  253. package/dist/util/defaults.js.map +1 -0
  254. package/dist/util/index.d.ts +97 -0
  255. package/dist/util/index.d.ts.map +1 -0
  256. package/dist/util/index.js +165 -0
  257. package/dist/util/index.js.map +1 -0
  258. package/dist/util/util.d.ts +145 -0
  259. package/dist/util/util.d.ts.map +1 -0
  260. package/dist/util/util.js +481 -0
  261. package/dist/util/util.js.map +1 -0
  262. package/package.json +234 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * HTTP transport for external logging services with automatic format detection
3
+ * @module @bloomneo/appkit/logger
4
+ * @file src/logger/transports/http.ts
5
+ *
6
+ * @llm-rule WHEN: Need to send logs to external services like Datadog, Elasticsearch, Splunk
7
+ * @llm-rule AVOID: Manual HTTP setup - auto-detects service format from URL
8
+ * @llm-rule NOTE: Supports Datadog, Elasticsearch, Splunk with automatic format conversion
9
+ */
10
+ import type { LogEntry, Transport } from '../logger.js';
11
+ import type { LoggingConfig } from '../defaults.js';
12
+ /**
13
+ * HTTP transport with automatic service detection and format optimization
14
+ */
15
+ export declare class HttpTransport implements Transport {
16
+ private url;
17
+ private batchSize;
18
+ private timeout;
19
+ private minimal;
20
+ private batch;
21
+ private flushTimer;
22
+ private parsedUrl;
23
+ private serviceType;
24
+ /**
25
+ * Creates HTTP transport with direct environment access (like auth pattern)
26
+ * @llm-rule WHEN: Logger initialization with VOILA_LOGGING_HTTP_URL environment variable
27
+ * @llm-rule AVOID: Manual HTTP configuration - environment detection handles this
28
+ * @llm-rule NOTE: Auto-detects service type from URL and formats payloads accordingly
29
+ */
30
+ constructor(config: LoggingConfig);
31
+ /**
32
+ * Detect external service type from URL for format optimization
33
+ * @llm-rule WHEN: Determining payload format based on service provider
34
+ * @llm-rule AVOID: Manual service configuration - URL detection is automatic
35
+ */
36
+ private detectServiceType;
37
+ /**
38
+ * Write log entry to HTTP endpoint via batching
39
+ * @llm-rule WHEN: Sending logs to external monitoring services
40
+ * @llm-rule AVOID: Calling directly - logger routes entries automatically
41
+ */
42
+ write(entry: LogEntry): void;
43
+ /**
44
+ * Optimize log entry for HTTP transmission
45
+ * @llm-rule WHEN: Reducing payload size and optimizing for external services
46
+ * @llm-rule AVOID: Always sending full entries - minimal scope reduces bandwidth
47
+ */
48
+ private optimizeEntry;
49
+ /**
50
+ * Optimize error object for HTTP transmission
51
+ * @llm-rule WHEN: Sending error data to external monitoring services
52
+ * @llm-rule AVOID: Including stack traces - security risk and bandwidth waste
53
+ */
54
+ private optimizeError;
55
+ /**
56
+ * Filter metadata for essential monitoring fields
57
+ * @llm-rule WHEN: Keeping HTTP payload size manageable while preserving correlation
58
+ * @llm-rule AVOID: Sending all metadata - focus on monitoring and correlation fields
59
+ */
60
+ private filterEssentialMeta;
61
+ /**
62
+ * Setup automatic batch flushing
63
+ * @llm-rule WHEN: Transport initialization - ensures logs are sent regularly
64
+ * @llm-rule AVOID: Manual flushing - automatic batching optimizes HTTP requests
65
+ */
66
+ private setupBatchFlush;
67
+ /**
68
+ * Flush current batch to HTTP endpoint
69
+ * @llm-rule WHEN: Batch is full or timer triggers
70
+ * @llm-rule AVOID: Individual HTTP requests - batching reduces overhead significantly
71
+ */
72
+ private flushBatch;
73
+ /**
74
+ * Send batch of log entries via HTTP
75
+ * @llm-rule WHEN: Transmitting batched logs to external service
76
+ * @llm-rule AVOID: Custom formatting - service detection handles optimal format
77
+ */
78
+ private sendBatch;
79
+ /**
80
+ * Format log entries for specific external services
81
+ * @llm-rule WHEN: Converting logs to service-specific format for optimal ingestion
82
+ * @llm-rule AVOID: Generic format for known services - optimized formats work better
83
+ */
84
+ private formatPayload;
85
+ /**
86
+ * Extract Datadog-specific attributes from log entry
87
+ * @llm-rule WHEN: Formatting logs for Datadog ingestion
88
+ * @llm-rule AVOID: Sending raw entry - Datadog expects specific attribute structure
89
+ */
90
+ private extractDatadogAttributes;
91
+ /**
92
+ * Make HTTP request with retry logic and exponential backoff
93
+ * @llm-rule WHEN: Sending HTTP request to external service
94
+ * @llm-rule AVOID: Single attempt - external services can be temporarily unavailable
95
+ */
96
+ private makeHttpRequest;
97
+ /**
98
+ * Execute single HTTP request with timeout
99
+ * @llm-rule WHEN: Making actual HTTP call to external service
100
+ * @llm-rule AVOID: Infinite timeouts - external services should respond quickly
101
+ */
102
+ private executeHttpRequest;
103
+ /**
104
+ * Sleep for specified milliseconds
105
+ * @llm-rule WHEN: Implementing retry delays and exponential backoff
106
+ * @llm-rule AVOID: Busy waiting - proper sleep prevents CPU waste
107
+ */
108
+ private sleep;
109
+ /**
110
+ * Check if this transport should log the given level
111
+ * @llm-rule WHEN: Logger asks if transport handles this level
112
+ * @llm-rule AVOID: Complex level logic - simple comparison is sufficient
113
+ */
114
+ shouldLog(level: string, configLevel: string): boolean;
115
+ /**
116
+ * Flush pending logs to HTTP endpoint
117
+ * @llm-rule WHEN: App shutdown or ensuring logs are sent
118
+ * @llm-rule AVOID: Frequent flushing - impacts performance and external service limits
119
+ */
120
+ flush(): Promise<void>;
121
+ /**
122
+ * Close HTTP transport and cleanup resources
123
+ * @llm-rule WHEN: App shutdown or logger cleanup
124
+ * @llm-rule AVOID: Abrupt shutdown - graceful close ensures logs are sent
125
+ */
126
+ close(): Promise<void>;
127
+ }
128
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/logger/transports/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAU;IAGzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,WAAW,CAAqD;IAExE;;;;;OAKG;gBACS,MAAM,EAAE,aAAa;IAcjC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAiB5B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA4DrB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAQvB;;;;OAIG;YACW,UAAU;IAmBxB;;;;OAIG;YACW,SAAS;IAOvB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA0CrB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;;;OAIG;YACW,eAAe;IAyB7B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAiD1B;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAIb;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAOtD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
@@ -0,0 +1,401 @@
1
+ /**
2
+ * HTTP transport for external logging services with automatic format detection
3
+ * @module @bloomneo/appkit/logger
4
+ * @file src/logger/transports/http.ts
5
+ *
6
+ * @llm-rule WHEN: Need to send logs to external services like Datadog, Elasticsearch, Splunk
7
+ * @llm-rule AVOID: Manual HTTP setup - auto-detects service format from URL
8
+ * @llm-rule NOTE: Supports Datadog, Elasticsearch, Splunk with automatic format conversion
9
+ */
10
+ import https from 'https';
11
+ import http from 'http';
12
+ /**
13
+ * HTTP transport with automatic service detection and format optimization
14
+ */
15
+ export class HttpTransport {
16
+ url;
17
+ batchSize;
18
+ timeout;
19
+ minimal;
20
+ // HTTP state
21
+ batch = [];
22
+ flushTimer = null;
23
+ parsedUrl;
24
+ serviceType;
25
+ /**
26
+ * Creates HTTP transport with direct environment access (like auth pattern)
27
+ * @llm-rule WHEN: Logger initialization with VOILA_LOGGING_HTTP_URL environment variable
28
+ * @llm-rule AVOID: Manual HTTP configuration - environment detection handles this
29
+ * @llm-rule NOTE: Auto-detects service type from URL and formats payloads accordingly
30
+ */
31
+ constructor(config) {
32
+ // Direct access to config (like auth module pattern)
33
+ this.url = config.http.url;
34
+ this.batchSize = config.http.batchSize;
35
+ this.timeout = config.http.timeout;
36
+ this.minimal = config.minimal;
37
+ this.parsedUrl = new URL(this.url);
38
+ this.serviceType = this.detectServiceType();
39
+ // Initialize HTTP transport
40
+ this.setupBatchFlush();
41
+ }
42
+ /**
43
+ * Detect external service type from URL for format optimization
44
+ * @llm-rule WHEN: Determining payload format based on service provider
45
+ * @llm-rule AVOID: Manual service configuration - URL detection is automatic
46
+ */
47
+ detectServiceType() {
48
+ const hostname = this.parsedUrl.hostname.toLowerCase();
49
+ const pathname = this.parsedUrl.pathname;
50
+ if (hostname.includes('datadog'))
51
+ return 'datadog';
52
+ if (hostname.includes('elastic') || pathname.includes('_bulk'))
53
+ return 'elasticsearch';
54
+ if (hostname.includes('splunk'))
55
+ return 'splunk';
56
+ return 'generic';
57
+ }
58
+ /**
59
+ * Write log entry to HTTP endpoint via batching
60
+ * @llm-rule WHEN: Sending logs to external monitoring services
61
+ * @llm-rule AVOID: Calling directly - logger routes entries automatically
62
+ */
63
+ write(entry) {
64
+ try {
65
+ // Optimize entry based on scope and service type
66
+ const optimizedEntry = this.optimizeEntry(entry);
67
+ // Add to batch
68
+ this.batch.push(optimizedEntry);
69
+ // Flush if batch is full
70
+ if (this.batch.length >= this.batchSize) {
71
+ this.flushBatch();
72
+ }
73
+ }
74
+ catch (error) {
75
+ console.error('HTTP transport write error:', error.message);
76
+ }
77
+ }
78
+ /**
79
+ * Optimize log entry for HTTP transmission
80
+ * @llm-rule WHEN: Reducing payload size and optimizing for external services
81
+ * @llm-rule AVOID: Always sending full entries - minimal scope reduces bandwidth
82
+ */
83
+ optimizeEntry(entry) {
84
+ if (!this.minimal) {
85
+ return entry; // Full scope - keep everything
86
+ }
87
+ // Minimal scope optimization for HTTP transmission
88
+ const { timestamp, level, message, component, requestId, userId, method, url, statusCode, durationMs, error, service, version, environment, ...rest } = entry;
89
+ const minimal = {
90
+ timestamp,
91
+ level,
92
+ message,
93
+ };
94
+ // Add essential context for external monitoring
95
+ if (component)
96
+ minimal.component = component;
97
+ if (requestId)
98
+ minimal.requestId = requestId;
99
+ if (userId)
100
+ minimal.userId = userId;
101
+ // Add HTTP context (important for APM)
102
+ if (method)
103
+ minimal.method = method;
104
+ if (url)
105
+ minimal.url = url;
106
+ if (statusCode)
107
+ minimal.statusCode = statusCode;
108
+ if (durationMs)
109
+ minimal.durationMs = durationMs;
110
+ // Add service identification
111
+ if (service)
112
+ minimal.service = service;
113
+ if (version)
114
+ minimal.version = version;
115
+ if (environment)
116
+ minimal.environment = environment;
117
+ // Optimize error information for monitoring
118
+ if (error) {
119
+ minimal.error = this.optimizeError(error);
120
+ }
121
+ // Add essential metadata for correlation
122
+ const essentialMeta = this.filterEssentialMeta(rest);
123
+ if (Object.keys(essentialMeta).length > 0) {
124
+ minimal.meta = essentialMeta;
125
+ }
126
+ return minimal;
127
+ }
128
+ /**
129
+ * Optimize error object for HTTP transmission
130
+ * @llm-rule WHEN: Sending error data to external monitoring services
131
+ * @llm-rule AVOID: Including stack traces - security risk and bandwidth waste
132
+ */
133
+ optimizeError(error) {
134
+ if (typeof error === 'string') {
135
+ return error;
136
+ }
137
+ if (typeof error === 'object' && error !== null) {
138
+ const optimized = {
139
+ message: error.message,
140
+ };
141
+ // Add important error fields for monitoring
142
+ if (error.name && error.name !== 'Error') {
143
+ optimized.name = error.name;
144
+ }
145
+ if (error.code) {
146
+ optimized.code = error.code;
147
+ }
148
+ if (error.statusCode) {
149
+ optimized.statusCode = error.statusCode;
150
+ }
151
+ // Never include stack traces in HTTP transmissions (security)
152
+ return optimized;
153
+ }
154
+ return error;
155
+ }
156
+ /**
157
+ * Filter metadata for essential monitoring fields
158
+ * @llm-rule WHEN: Keeping HTTP payload size manageable while preserving correlation
159
+ * @llm-rule AVOID: Sending all metadata - focus on monitoring and correlation fields
160
+ */
161
+ filterEssentialMeta(meta) {
162
+ const essential = {};
163
+ // Essential monitoring and correlation fields
164
+ const essentialKeys = [
165
+ 'traceId', 'spanId', 'sessionId', 'tenantId', 'appName', 'ip'
166
+ ];
167
+ for (const key of essentialKeys) {
168
+ if (meta[key] !== undefined) {
169
+ essential[key] = meta[key];
170
+ }
171
+ }
172
+ // Include correlation IDs
173
+ for (const [key, value] of Object.entries(meta)) {
174
+ if (key.endsWith('Id') && !essential[key]) {
175
+ essential[key] = value;
176
+ }
177
+ }
178
+ return essential;
179
+ }
180
+ /**
181
+ * Setup automatic batch flushing
182
+ * @llm-rule WHEN: Transport initialization - ensures logs are sent regularly
183
+ * @llm-rule AVOID: Manual flushing - automatic batching optimizes HTTP requests
184
+ */
185
+ setupBatchFlush() {
186
+ this.flushTimer = setInterval(() => {
187
+ if (this.batch.length > 0) {
188
+ this.flushBatch();
189
+ }
190
+ }, 10000); // Flush every 10 seconds
191
+ }
192
+ /**
193
+ * Flush current batch to HTTP endpoint
194
+ * @llm-rule WHEN: Batch is full or timer triggers
195
+ * @llm-rule AVOID: Individual HTTP requests - batching reduces overhead significantly
196
+ */
197
+ async flushBatch() {
198
+ if (this.batch.length === 0) {
199
+ return;
200
+ }
201
+ const currentBatch = [...this.batch];
202
+ this.batch = [];
203
+ try {
204
+ await this.sendBatch(currentBatch);
205
+ }
206
+ catch (error) {
207
+ console.error('HTTP batch flush failed:', error.message);
208
+ // Re-add failed entries for retry (up to batch size limit)
209
+ const retryEntries = currentBatch.slice(0, this.batchSize);
210
+ this.batch.unshift(...retryEntries);
211
+ }
212
+ }
213
+ /**
214
+ * Send batch of log entries via HTTP
215
+ * @llm-rule WHEN: Transmitting batched logs to external service
216
+ * @llm-rule AVOID: Custom formatting - service detection handles optimal format
217
+ */
218
+ async sendBatch(entries) {
219
+ if (entries.length === 0)
220
+ return;
221
+ const payload = this.formatPayload(entries);
222
+ await this.makeHttpRequest(payload);
223
+ }
224
+ /**
225
+ * Format log entries for specific external services
226
+ * @llm-rule WHEN: Converting logs to service-specific format for optimal ingestion
227
+ * @llm-rule AVOID: Generic format for known services - optimized formats work better
228
+ */
229
+ formatPayload(entries) {
230
+ switch (this.serviceType) {
231
+ case 'datadog':
232
+ return JSON.stringify({
233
+ logs: entries.map(entry => ({
234
+ timestamp: entry.timestamp,
235
+ level: entry.level,
236
+ message: entry.message,
237
+ attributes: this.extractDatadogAttributes(entry),
238
+ })),
239
+ });
240
+ case 'elasticsearch':
241
+ // Elasticsearch bulk format
242
+ return entries
243
+ .map(entry => {
244
+ const indexMeta = JSON.stringify({ index: {} });
245
+ const logData = JSON.stringify(entry);
246
+ return indexMeta + '\n' + logData;
247
+ })
248
+ .join('\n') + '\n';
249
+ case 'splunk':
250
+ return entries
251
+ .map(entry => JSON.stringify({
252
+ time: new Date(entry.timestamp).getTime() / 1000,
253
+ event: entry,
254
+ }))
255
+ .join('\n');
256
+ case 'generic':
257
+ default:
258
+ // Generic format with metadata
259
+ return JSON.stringify({
260
+ logs: entries,
261
+ scope: this.minimal ? 'minimal' : 'full',
262
+ count: entries.length,
263
+ service: entries[0]?.service || 'unknown',
264
+ });
265
+ }
266
+ }
267
+ /**
268
+ * Extract Datadog-specific attributes from log entry
269
+ * @llm-rule WHEN: Formatting logs for Datadog ingestion
270
+ * @llm-rule AVOID: Sending raw entry - Datadog expects specific attribute structure
271
+ */
272
+ extractDatadogAttributes(entry) {
273
+ const { timestamp, level, message, ...attributes } = entry;
274
+ return {
275
+ service: attributes.service || 'unknown',
276
+ component: attributes.component,
277
+ requestId: attributes.requestId,
278
+ userId: attributes.userId,
279
+ method: attributes.method,
280
+ url: attributes.url,
281
+ statusCode: attributes.statusCode,
282
+ durationMs: attributes.durationMs,
283
+ environment: attributes.environment,
284
+ version: attributes.version,
285
+ ...attributes.meta,
286
+ };
287
+ }
288
+ /**
289
+ * Make HTTP request with retry logic and exponential backoff
290
+ * @llm-rule WHEN: Sending HTTP request to external service
291
+ * @llm-rule AVOID: Single attempt - external services can be temporarily unavailable
292
+ */
293
+ async makeHttpRequest(payload) {
294
+ const maxRetries = 3;
295
+ let lastError;
296
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
297
+ try {
298
+ await this.executeHttpRequest(payload);
299
+ return; // Success
300
+ }
301
+ catch (error) {
302
+ lastError = error;
303
+ if (attempt < maxRetries) {
304
+ const delay = 1000 * Math.pow(2, attempt - 1); // Exponential backoff
305
+ console.warn(`HTTP request attempt ${attempt} failed, retrying in ${delay}ms:`, error.message);
306
+ await this.sleep(delay);
307
+ }
308
+ }
309
+ }
310
+ throw lastError;
311
+ }
312
+ /**
313
+ * Execute single HTTP request with timeout
314
+ * @llm-rule WHEN: Making actual HTTP call to external service
315
+ * @llm-rule AVOID: Infinite timeouts - external services should respond quickly
316
+ */
317
+ executeHttpRequest(payload) {
318
+ return new Promise((resolve, reject) => {
319
+ const isHttps = this.parsedUrl.protocol === 'https:';
320
+ const httpModule = isHttps ? https : http;
321
+ const options = {
322
+ hostname: this.parsedUrl.hostname,
323
+ port: this.parsedUrl.port || (isHttps ? 443 : 80),
324
+ path: this.parsedUrl.pathname + this.parsedUrl.search,
325
+ method: 'POST',
326
+ headers: {
327
+ 'Content-Type': 'application/json',
328
+ 'Content-Length': Buffer.byteLength(payload),
329
+ 'User-Agent': 'VoilaJSX-AppKit-Logging/1.0.0',
330
+ },
331
+ timeout: this.timeout,
332
+ };
333
+ const req = httpModule.request(options, (res) => {
334
+ let responseData = '';
335
+ res.on('data', (chunk) => {
336
+ responseData += chunk;
337
+ });
338
+ res.on('end', () => {
339
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
340
+ resolve();
341
+ }
342
+ else {
343
+ reject(new Error(`HTTP ${res.statusCode}: ${responseData}`));
344
+ }
345
+ });
346
+ });
347
+ req.on('timeout', () => {
348
+ req.destroy();
349
+ reject(new Error(`HTTP request timeout after ${this.timeout}ms`));
350
+ });
351
+ req.on('error', (error) => {
352
+ reject(new Error(`HTTP request failed: ${error.message}`));
353
+ });
354
+ // Write payload and end request
355
+ req.write(payload);
356
+ req.end();
357
+ });
358
+ }
359
+ /**
360
+ * Sleep for specified milliseconds
361
+ * @llm-rule WHEN: Implementing retry delays and exponential backoff
362
+ * @llm-rule AVOID: Busy waiting - proper sleep prevents CPU waste
363
+ */
364
+ sleep(ms) {
365
+ return new Promise(resolve => setTimeout(resolve, ms));
366
+ }
367
+ /**
368
+ * Check if this transport should log the given level
369
+ * @llm-rule WHEN: Logger asks if transport handles this level
370
+ * @llm-rule AVOID: Complex level logic - simple comparison is sufficient
371
+ */
372
+ shouldLog(level, configLevel) {
373
+ const levels = {
374
+ error: 0, warn: 1, info: 2, debug: 3
375
+ };
376
+ return levels[level] <= levels[configLevel];
377
+ }
378
+ /**
379
+ * Flush pending logs to HTTP endpoint
380
+ * @llm-rule WHEN: App shutdown or ensuring logs are sent
381
+ * @llm-rule AVOID: Frequent flushing - impacts performance and external service limits
382
+ */
383
+ async flush() {
384
+ await this.flushBatch();
385
+ }
386
+ /**
387
+ * Close HTTP transport and cleanup resources
388
+ * @llm-rule WHEN: App shutdown or logger cleanup
389
+ * @llm-rule AVOID: Abrupt shutdown - graceful close ensures logs are sent
390
+ */
391
+ async close() {
392
+ // Clear flush timer
393
+ if (this.flushTimer) {
394
+ clearInterval(this.flushTimer);
395
+ this.flushTimer = null;
396
+ }
397
+ // Flush remaining logs
398
+ await this.flushBatch();
399
+ }
400
+ }
401
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/logger/transports/http.ts"],"names":[],"mappings":"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"}