@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.
- package/LICENSE +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- 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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"}
|