@aion0/bastion 0.1.7
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 +183 -0
- package/README.zh.md +468 -0
- package/config/default.yaml +73 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +31 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/env.d.ts +3 -0
- package/dist/cli/commands/env.d.ts.map +1 -0
- package/dist/cli/commands/env.js +83 -0
- package/dist/cli/commands/env.js.map +1 -0
- package/dist/cli/commands/health.d.ts +3 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +45 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/openclaw.d.ts +3 -0
- package/dist/cli/commands/openclaw.d.ts.map +1 -0
- package/dist/cli/commands/openclaw.js +1062 -0
- package/dist/cli/commands/openclaw.js.map +1 -0
- package/dist/cli/commands/proxy.d.ts +8 -0
- package/dist/cli/commands/proxy.d.ts.map +1 -0
- package/dist/cli/commands/proxy.js +433 -0
- package/dist/cli/commands/proxy.js.map +1 -0
- package/dist/cli/commands/start.d.ts +3 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +62 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +3 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +32 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +28 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/token.d.ts +3 -0
- package/dist/cli/commands/token.d.ts.map +1 -0
- package/dist/cli/commands/token.js +32 -0
- package/dist/cli/commands/token.js.map +1 -0
- package/dist/cli/commands/trust-ca.d.ts +3 -0
- package/dist/cli/commands/trust-ca.d.ts.map +1 -0
- package/dist/cli/commands/trust-ca.js +44 -0
- package/dist/cli/commands/trust-ca.js.map +1 -0
- package/dist/cli/commands/wrap.d.ts +3 -0
- package/dist/cli/commands/wrap.d.ts.map +1 -0
- package/dist/cli/commands/wrap.js +70 -0
- package/dist/cli/commands/wrap.js.map +1 -0
- package/dist/cli/daemon.d.ts +11 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +82 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +60 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +12 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +73 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +16 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +85 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +3 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/dashboard/api-routes.d.ts +6 -0
- package/dist/dashboard/api-routes.d.ts.map +1 -0
- package/dist/dashboard/api-routes.js +671 -0
- package/dist/dashboard/api-routes.js.map +1 -0
- package/dist/dashboard/api.d.ts +4 -0
- package/dist/dashboard/api.d.ts.map +1 -0
- package/dist/dashboard/api.js +25 -0
- package/dist/dashboard/api.js.map +1 -0
- package/dist/dashboard/page.d.ts +3 -0
- package/dist/dashboard/page.d.ts.map +1 -0
- package/dist/dashboard/page.js +1622 -0
- package/dist/dashboard/page.js.map +1 -0
- package/dist/dlp/actions.d.ts +13 -0
- package/dist/dlp/actions.d.ts.map +1 -0
- package/dist/dlp/actions.js +3 -0
- package/dist/dlp/actions.js.map +1 -0
- package/dist/dlp/ai-validator.d.ts +28 -0
- package/dist/dlp/ai-validator.d.ts.map +1 -0
- package/dist/dlp/ai-validator.js +214 -0
- package/dist/dlp/ai-validator.js.map +1 -0
- package/dist/dlp/engine.d.ts +34 -0
- package/dist/dlp/engine.d.ts.map +1 -0
- package/dist/dlp/engine.js +342 -0
- package/dist/dlp/engine.js.map +1 -0
- package/dist/dlp/entropy.d.ts +22 -0
- package/dist/dlp/entropy.d.ts.map +1 -0
- package/dist/dlp/entropy.js +43 -0
- package/dist/dlp/entropy.js.map +1 -0
- package/dist/dlp/message-cache.d.ts +45 -0
- package/dist/dlp/message-cache.d.ts.map +1 -0
- package/dist/dlp/message-cache.js +251 -0
- package/dist/dlp/message-cache.js.map +1 -0
- package/dist/dlp/patterns/context-aware.d.ts +4 -0
- package/dist/dlp/patterns/context-aware.d.ts.map +1 -0
- package/dist/dlp/patterns/context-aware.js +45 -0
- package/dist/dlp/patterns/context-aware.js.map +1 -0
- package/dist/dlp/patterns/high-confidence.d.ts +4 -0
- package/dist/dlp/patterns/high-confidence.d.ts.map +1 -0
- package/dist/dlp/patterns/high-confidence.js +140 -0
- package/dist/dlp/patterns/high-confidence.js.map +1 -0
- package/dist/dlp/patterns/prompt-injection.d.ts +4 -0
- package/dist/dlp/patterns/prompt-injection.d.ts.map +1 -0
- package/dist/dlp/patterns/prompt-injection.js +244 -0
- package/dist/dlp/patterns/prompt-injection.js.map +1 -0
- package/dist/dlp/patterns/validated.d.ts +4 -0
- package/dist/dlp/patterns/validated.d.ts.map +1 -0
- package/dist/dlp/patterns/validated.js +21 -0
- package/dist/dlp/patterns/validated.js.map +1 -0
- package/dist/dlp/remote-sync.d.ts +47 -0
- package/dist/dlp/remote-sync.d.ts.map +1 -0
- package/dist/dlp/remote-sync.js +252 -0
- package/dist/dlp/remote-sync.js.map +1 -0
- package/dist/dlp/semantics.d.ts +27 -0
- package/dist/dlp/semantics.d.ts.map +1 -0
- package/dist/dlp/semantics.js +93 -0
- package/dist/dlp/semantics.js.map +1 -0
- package/dist/dlp/structure.d.ts +25 -0
- package/dist/dlp/structure.d.ts.map +1 -0
- package/dist/dlp/structure.js +86 -0
- package/dist/dlp/structure.js.map +1 -0
- package/dist/dlp/validators.d.ts +6 -0
- package/dist/dlp/validators.d.ts.map +1 -0
- package/dist/dlp/validators.js +46 -0
- package/dist/dlp/validators.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/license/verify.d.ts +18 -0
- package/dist/license/verify.d.ts.map +1 -0
- package/dist/license/verify.js +71 -0
- package/dist/license/verify.js.map +1 -0
- package/dist/metrics/collector.d.ts +11 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +17 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/metrics/dashboard.d.ts +6 -0
- package/dist/metrics/dashboard.d.ts.map +1 -0
- package/dist/metrics/dashboard.js +66 -0
- package/dist/metrics/dashboard.js.map +1 -0
- package/dist/metrics/pricing.d.ts +10 -0
- package/dist/metrics/pricing.d.ts.map +1 -0
- package/dist/metrics/pricing.js +62 -0
- package/dist/metrics/pricing.js.map +1 -0
- package/dist/optimizer/cache.d.ts +14 -0
- package/dist/optimizer/cache.d.ts.map +1 -0
- package/dist/optimizer/cache.js +58 -0
- package/dist/optimizer/cache.js.map +1 -0
- package/dist/optimizer/estimator.d.ts +6 -0
- package/dist/optimizer/estimator.d.ts.map +1 -0
- package/dist/optimizer/estimator.js +12 -0
- package/dist/optimizer/estimator.js.map +1 -0
- package/dist/optimizer/reorder.d.ts +9 -0
- package/dist/optimizer/reorder.d.ts.map +1 -0
- package/dist/optimizer/reorder.js +27 -0
- package/dist/optimizer/reorder.js.map +1 -0
- package/dist/optimizer/trimmer.d.ts +9 -0
- package/dist/optimizer/trimmer.d.ts.map +1 -0
- package/dist/optimizer/trimmer.js +47 -0
- package/dist/optimizer/trimmer.js.map +1 -0
- package/dist/plugin-api/index.d.ts +3 -0
- package/dist/plugin-api/index.d.ts.map +1 -0
- package/dist/plugin-api/index.js +6 -0
- package/dist/plugin-api/index.js.map +1 -0
- package/dist/plugin-api/types.d.ts +77 -0
- package/dist/plugin-api/types.d.ts.map +1 -0
- package/dist/plugin-api/types.js +6 -0
- package/dist/plugin-api/types.js.map +1 -0
- package/dist/plugins/adapter.d.ts +12 -0
- package/dist/plugins/adapter.d.ts.map +1 -0
- package/dist/plugins/adapter.js +116 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/builtin/audit-logger.d.ts +9 -0
- package/dist/plugins/builtin/audit-logger.d.ts.map +1 -0
- package/dist/plugins/builtin/audit-logger.js +53 -0
- package/dist/plugins/builtin/audit-logger.js.map +1 -0
- package/dist/plugins/builtin/dlp-scanner.d.ts +19 -0
- package/dist/plugins/builtin/dlp-scanner.d.ts.map +1 -0
- package/dist/plugins/builtin/dlp-scanner.js +284 -0
- package/dist/plugins/builtin/dlp-scanner.js.map +1 -0
- package/dist/plugins/builtin/metrics-collector.d.ts +4 -0
- package/dist/plugins/builtin/metrics-collector.d.ts.map +1 -0
- package/dist/plugins/builtin/metrics-collector.js +111 -0
- package/dist/plugins/builtin/metrics-collector.js.map +1 -0
- package/dist/plugins/builtin/token-optimizer.d.ts +10 -0
- package/dist/plugins/builtin/token-optimizer.d.ts.map +1 -0
- package/dist/plugins/builtin/token-optimizer.js +120 -0
- package/dist/plugins/builtin/token-optimizer.js.map +1 -0
- package/dist/plugins/builtin/tool-guard.d.ts +20 -0
- package/dist/plugins/builtin/tool-guard.d.ts.map +1 -0
- package/dist/plugins/builtin/tool-guard.js +259 -0
- package/dist/plugins/builtin/tool-guard.js.map +1 -0
- package/dist/plugins/context.d.ts +8 -0
- package/dist/plugins/context.d.ts.map +1 -0
- package/dist/plugins/context.js +33 -0
- package/dist/plugins/context.js.map +1 -0
- package/dist/plugins/event-bus.d.ts +9 -0
- package/dist/plugins/event-bus.d.ts.map +1 -0
- package/dist/plugins/event-bus.js +25 -0
- package/dist/plugins/event-bus.js.map +1 -0
- package/dist/plugins/index.d.ts +18 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +148 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +14 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +98 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +91 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +3 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/proxy/certs.d.ts +10 -0
- package/dist/proxy/certs.d.ts.map +1 -0
- package/dist/proxy/certs.js +110 -0
- package/dist/proxy/certs.js.map +1 -0
- package/dist/proxy/connect.d.ts +11 -0
- package/dist/proxy/connect.d.ts.map +1 -0
- package/dist/proxy/connect.js +298 -0
- package/dist/proxy/connect.js.map +1 -0
- package/dist/proxy/forwarder.d.ts +14 -0
- package/dist/proxy/forwarder.d.ts.map +1 -0
- package/dist/proxy/forwarder.js +342 -0
- package/dist/proxy/forwarder.js.map +1 -0
- package/dist/proxy/passthrough.d.ts +4 -0
- package/dist/proxy/passthrough.d.ts.map +1 -0
- package/dist/proxy/passthrough.js +68 -0
- package/dist/proxy/passthrough.js.map +1 -0
- package/dist/proxy/providers/anthropic.d.ts +4 -0
- package/dist/proxy/providers/anthropic.d.ts.map +1 -0
- package/dist/proxy/providers/anthropic.js +46 -0
- package/dist/proxy/providers/anthropic.js.map +1 -0
- package/dist/proxy/providers/classify.d.ts +14 -0
- package/dist/proxy/providers/classify.d.ts.map +1 -0
- package/dist/proxy/providers/classify.js +37 -0
- package/dist/proxy/providers/classify.js.map +1 -0
- package/dist/proxy/providers/claude-web.d.ts +8 -0
- package/dist/proxy/providers/claude-web.d.ts.map +1 -0
- package/dist/proxy/providers/claude-web.js +50 -0
- package/dist/proxy/providers/claude-web.js.map +1 -0
- package/dist/proxy/providers/gemini.d.ts +4 -0
- package/dist/proxy/providers/gemini.d.ts.map +1 -0
- package/dist/proxy/providers/gemini.js +38 -0
- package/dist/proxy/providers/gemini.js.map +1 -0
- package/dist/proxy/providers/index.d.ts +27 -0
- package/dist/proxy/providers/index.d.ts.map +1 -0
- package/dist/proxy/providers/index.js +32 -0
- package/dist/proxy/providers/index.js.map +1 -0
- package/dist/proxy/providers/messaging.d.ts +2 -0
- package/dist/proxy/providers/messaging.d.ts.map +1 -0
- package/dist/proxy/providers/messaging.js +53 -0
- package/dist/proxy/providers/messaging.js.map +1 -0
- package/dist/proxy/providers/openai.d.ts +4 -0
- package/dist/proxy/providers/openai.d.ts.map +1 -0
- package/dist/proxy/providers/openai.js +38 -0
- package/dist/proxy/providers/openai.js.map +1 -0
- package/dist/proxy/providers/telegram.d.ts +8 -0
- package/dist/proxy/providers/telegram.d.ts.map +1 -0
- package/dist/proxy/providers/telegram.js +35 -0
- package/dist/proxy/providers/telegram.js.map +1 -0
- package/dist/proxy/router.d.ts +12 -0
- package/dist/proxy/router.d.ts.map +1 -0
- package/dist/proxy/router.js +26 -0
- package/dist/proxy/router.js.map +1 -0
- package/dist/proxy/safety.d.ts +13 -0
- package/dist/proxy/safety.d.ts.map +1 -0
- package/dist/proxy/safety.js +58 -0
- package/dist/proxy/safety.js.map +1 -0
- package/dist/proxy/server.d.ts +8 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +126 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/proxy/streaming.d.ts +21 -0
- package/dist/proxy/streaming.d.ts.map +1 -0
- package/dist/proxy/streaming.js +70 -0
- package/dist/proxy/streaming.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +44 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/encryption.d.ts +11 -0
- package/dist/storage/encryption.d.ts.map +1 -0
- package/dist/storage/encryption.js +47 -0
- package/dist/storage/encryption.js.map +1 -0
- package/dist/storage/migrations.d.ts +3 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +265 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/repositories/audit-log.d.ts +115 -0
- package/dist/storage/repositories/audit-log.d.ts.map +1 -0
- package/dist/storage/repositories/audit-log.js +586 -0
- package/dist/storage/repositories/audit-log.js.map +1 -0
- package/dist/storage/repositories/cache.d.ts +26 -0
- package/dist/storage/repositories/cache.d.ts.map +1 -0
- package/dist/storage/repositories/cache.js +44 -0
- package/dist/storage/repositories/cache.js.map +1 -0
- package/dist/storage/repositories/dlp-config-history.d.ts +17 -0
- package/dist/storage/repositories/dlp-config-history.d.ts.map +1 -0
- package/dist/storage/repositories/dlp-config-history.js +30 -0
- package/dist/storage/repositories/dlp-config-history.js.map +1 -0
- package/dist/storage/repositories/dlp-events.d.ts +35 -0
- package/dist/storage/repositories/dlp-events.d.ts.map +1 -0
- package/dist/storage/repositories/dlp-events.js +57 -0
- package/dist/storage/repositories/dlp-events.js.map +1 -0
- package/dist/storage/repositories/dlp-patterns.d.ts +70 -0
- package/dist/storage/repositories/dlp-patterns.d.ts.map +1 -0
- package/dist/storage/repositories/dlp-patterns.js +187 -0
- package/dist/storage/repositories/dlp-patterns.js.map +1 -0
- package/dist/storage/repositories/optimizer-events.d.ts +28 -0
- package/dist/storage/repositories/optimizer-events.d.ts.map +1 -0
- package/dist/storage/repositories/optimizer-events.js +49 -0
- package/dist/storage/repositories/optimizer-events.js.map +1 -0
- package/dist/storage/repositories/plugin-events.d.ts +34 -0
- package/dist/storage/repositories/plugin-events.d.ts.map +1 -0
- package/dist/storage/repositories/plugin-events.js +64 -0
- package/dist/storage/repositories/plugin-events.js.map +1 -0
- package/dist/storage/repositories/requests.d.ts +68 -0
- package/dist/storage/repositories/requests.d.ts.map +1 -0
- package/dist/storage/repositories/requests.js +113 -0
- package/dist/storage/repositories/requests.js.map +1 -0
- package/dist/storage/repositories/sessions.d.ts +23 -0
- package/dist/storage/repositories/sessions.d.ts.map +1 -0
- package/dist/storage/repositories/sessions.js +42 -0
- package/dist/storage/repositories/sessions.js.map +1 -0
- package/dist/storage/repositories/tool-calls.d.ts +49 -0
- package/dist/storage/repositories/tool-calls.d.ts.map +1 -0
- package/dist/storage/repositories/tool-calls.js +61 -0
- package/dist/storage/repositories/tool-calls.js.map +1 -0
- package/dist/storage/repositories/tool-guard-rules.d.ts +50 -0
- package/dist/storage/repositories/tool-guard-rules.d.ts.map +1 -0
- package/dist/storage/repositories/tool-guard-rules.js +120 -0
- package/dist/storage/repositories/tool-guard-rules.js.map +1 -0
- package/dist/tool-guard/alert.d.ts +30 -0
- package/dist/tool-guard/alert.d.ts.map +1 -0
- package/dist/tool-guard/alert.js +113 -0
- package/dist/tool-guard/alert.js.map +1 -0
- package/dist/tool-guard/extractor.d.ts +10 -0
- package/dist/tool-guard/extractor.d.ts.map +1 -0
- package/dist/tool-guard/extractor.js +309 -0
- package/dist/tool-guard/extractor.js.map +1 -0
- package/dist/tool-guard/rules.d.ts +18 -0
- package/dist/tool-guard/rules.d.ts.map +1 -0
- package/dist/tool-guard/rules.js +255 -0
- package/dist/tool-guard/rules.js.map +1 -0
- package/dist/tool-guard/streaming-guard.d.ts +57 -0
- package/dist/tool-guard/streaming-guard.d.ts.map +1 -0
- package/dist/tool-guard/streaming-guard.js +389 -0
- package/dist/tool-guard/streaming-guard.js.map +1 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +8 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +54 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/timeout.d.ts +5 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +26 -0
- package/dist/utils/timeout.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveRoute = resolveRoute;
|
|
4
|
+
exports.sendError = sendError;
|
|
5
|
+
const index_js_1 = require("./providers/index.js");
|
|
6
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
7
|
+
const log = (0, logger_js_1.createLogger)('router');
|
|
8
|
+
function resolveRoute(req, opts) {
|
|
9
|
+
const path = req.url ?? '/';
|
|
10
|
+
const match = (0, index_js_1.getProvider)(path, opts);
|
|
11
|
+
if (!match) {
|
|
12
|
+
log.warn('No provider matched', { path });
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const upstreamUrl = match.provider.baseUrl + path;
|
|
16
|
+
return {
|
|
17
|
+
provider: match.provider,
|
|
18
|
+
pathPrefix: match.pathPrefix,
|
|
19
|
+
upstreamUrl,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function sendError(res, statusCode, message) {
|
|
23
|
+
res.writeHead(statusCode, { 'content-type': 'application/json' });
|
|
24
|
+
res.end(JSON.stringify({ error: { message, type: 'gateway_error' } }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/proxy/router.ts"],"names":[],"mappings":";;AAYA,oCAeC;AAED,8BAGC;AA/BD,mDAAwE;AACxE,kDAAkD;AAElD,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,QAAQ,CAAC,CAAC;AAQnC,SAAgB,YAAY,CAAC,GAAoB,EAAE,IAAqC;IACtF,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAA,sBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IAClD,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CAAC,GAAmB,EAAE,UAAkB,EAAE,OAAe;IAChF,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAClE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Server } from 'node:http';
|
|
2
|
+
import type { ServerResponse, IncomingMessage } from 'node:http';
|
|
3
|
+
/**
|
|
4
|
+
* Five-layer safety net:
|
|
5
|
+
* 1. Health check endpoint
|
|
6
|
+
* 2. Graceful shutdown
|
|
7
|
+
* 3. Uncaught exception handler
|
|
8
|
+
* 4. Unhandled rejection handler
|
|
9
|
+
* 5. Process signal handlers
|
|
10
|
+
*/
|
|
11
|
+
export declare function handleHealthCheck(req: IncomingMessage, res: ServerResponse): boolean;
|
|
12
|
+
export declare function setupGracefulShutdown(server: Server, cleanup: () => void): void;
|
|
13
|
+
//# sourceMappingURL=safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/proxy/safety.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAKjE;;;;;;;GAOG;AAEH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAYpF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAkC/E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleHealthCheck = handleHealthCheck;
|
|
4
|
+
exports.setupGracefulShutdown = setupGracefulShutdown;
|
|
5
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
6
|
+
const log = (0, logger_js_1.createLogger)('safety');
|
|
7
|
+
/**
|
|
8
|
+
* Five-layer safety net:
|
|
9
|
+
* 1. Health check endpoint
|
|
10
|
+
* 2. Graceful shutdown
|
|
11
|
+
* 3. Uncaught exception handler
|
|
12
|
+
* 4. Unhandled rejection handler
|
|
13
|
+
* 5. Process signal handlers
|
|
14
|
+
*/
|
|
15
|
+
function handleHealthCheck(req, res) {
|
|
16
|
+
if (req.url === '/health' && req.method === 'GET') {
|
|
17
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
18
|
+
res.end(JSON.stringify({
|
|
19
|
+
status: 'ok',
|
|
20
|
+
uptime: process.uptime(),
|
|
21
|
+
memory: process.memoryUsage().rss,
|
|
22
|
+
pid: process.pid,
|
|
23
|
+
}));
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
function setupGracefulShutdown(server, cleanup) {
|
|
29
|
+
let isShuttingDown = false;
|
|
30
|
+
const shutdown = (signal) => {
|
|
31
|
+
if (isShuttingDown)
|
|
32
|
+
return;
|
|
33
|
+
isShuttingDown = true;
|
|
34
|
+
log.info('Received shutdown signal', { signal });
|
|
35
|
+
server.close(() => {
|
|
36
|
+
log.info('Server closed');
|
|
37
|
+
cleanup();
|
|
38
|
+
process.exit(0);
|
|
39
|
+
});
|
|
40
|
+
// Force exit after 10 seconds
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
log.error('Forced shutdown after timeout');
|
|
43
|
+
cleanup();
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}, 10000).unref();
|
|
46
|
+
};
|
|
47
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
48
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
49
|
+
process.on('uncaughtException', (err) => {
|
|
50
|
+
log.error('Uncaught exception', { error: err.message, stack: err.stack });
|
|
51
|
+
// Continue running — fail-open philosophy
|
|
52
|
+
});
|
|
53
|
+
process.on('unhandledRejection', (reason) => {
|
|
54
|
+
log.error('Unhandled rejection', { reason: String(reason) });
|
|
55
|
+
// Continue running — fail-open philosophy
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/proxy/safety.ts"],"names":[],"mappings":";;AAeA,8CAYC;AAED,sDAkCC;AA7DD,kDAAkD;AAElD,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,QAAQ,CAAC,CAAC;AAEnC;;;;;;;GAOG;AAEH,SAAgB,iBAAiB,CAAC,GAAoB,EAAE,GAAmB;IACzE,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACrB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;YACxB,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAc,EAAE,OAAmB;IACvE,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAE;QAClC,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1B,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1E,0CAA0C;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,0CAA0C;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Server } from 'node:http';
|
|
2
|
+
import type Database from 'better-sqlite3';
|
|
3
|
+
import type { BastionConfig } from '../config/schema.js';
|
|
4
|
+
import type { PluginManager } from '../plugins/index.js';
|
|
5
|
+
import type { ConfigManager } from '../config/manager.js';
|
|
6
|
+
export declare function createProxyServer(config: BastionConfig, pluginManager: PluginManager, cleanup: () => void, db?: Database.Database, configManager?: ConfigManager, getPluginState?: (pluginName: string, key: string) => unknown | undefined): Server;
|
|
7
|
+
export declare function startServer(server: Server, config: BastionConfig): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAa1D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,MAAM,IAAI,EACnB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EACtB,aAAa,CAAC,EAAE,aAAa,EAC7B,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,GACxE,MAAM,CA4GR;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createProxyServer = createProxyServer;
|
|
4
|
+
exports.startServer = startServer;
|
|
5
|
+
const node_http_1 = require("node:http");
|
|
6
|
+
const router_js_1 = require("./router.js");
|
|
7
|
+
const forwarder_js_1 = require("./forwarder.js");
|
|
8
|
+
const passthrough_js_1 = require("./passthrough.js");
|
|
9
|
+
const safety_js_1 = require("./safety.js");
|
|
10
|
+
const page_js_1 = require("../dashboard/page.js");
|
|
11
|
+
const api_routes_js_1 = require("../dashboard/api-routes.js");
|
|
12
|
+
const connect_js_1 = require("./connect.js");
|
|
13
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
14
|
+
const log = (0, logger_js_1.createLogger)('server');
|
|
15
|
+
function createProxyServer(config, pluginManager, cleanup, db, configManager, getPluginState) {
|
|
16
|
+
// Set up API router if we have both db and configManager
|
|
17
|
+
const apiRouter = db && configManager
|
|
18
|
+
? (0, api_routes_js_1.createApiRouter)(db, configManager, pluginManager, getPluginState)
|
|
19
|
+
: null;
|
|
20
|
+
const server = (0, node_http_1.createServer)(async (req, res) => {
|
|
21
|
+
// Layer 1: Health check
|
|
22
|
+
if ((0, safety_js_1.handleHealthCheck)(req, res))
|
|
23
|
+
return;
|
|
24
|
+
// Dashboard
|
|
25
|
+
const dashPath = (req.url ?? '').split('?')[0];
|
|
26
|
+
if (req.method === 'GET' && (dashPath === '/dashboard' || dashPath === '/dashboard/')) {
|
|
27
|
+
(0, page_js_1.serveDashboard)(res);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Auth check for /api/* routes
|
|
31
|
+
if (req.url?.startsWith('/api/') && configManager) {
|
|
32
|
+
const authCfg = configManager.get().server.auth;
|
|
33
|
+
if (authCfg?.enabled !== false && authCfg?.token) {
|
|
34
|
+
const excluded = (authCfg.excludePaths ?? []).some(p => req.url.startsWith(p));
|
|
35
|
+
if (!excluded) {
|
|
36
|
+
const authHeader = req.headers['authorization'];
|
|
37
|
+
const token = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null;
|
|
38
|
+
if (token !== authCfg.token) {
|
|
39
|
+
res.writeHead(401, { 'content-type': 'application/json' });
|
|
40
|
+
res.end(JSON.stringify({ error: 'Unauthorized' }));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// API routes (GET, PUT)
|
|
47
|
+
if (apiRouter && (req.url?.startsWith('/api/') ?? false)) {
|
|
48
|
+
if (apiRouter(req, res))
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Route to known provider path (exclude messaging providers in direct HTTP mode)
|
|
52
|
+
const route = (0, router_js_1.resolveRoute)(req, { excludeMessaging: true });
|
|
53
|
+
// If scanMethods is configured and non-empty, only scan listed methods
|
|
54
|
+
const scanMethods = config.server.scanMethods ?? [];
|
|
55
|
+
if (scanMethods.length > 0 && !scanMethods.includes(req.method ?? '')) {
|
|
56
|
+
(0, passthrough_js_1.passthroughRequest)(req, res, config.timeouts.upstream);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// For direct HTTP mode, read session from X-Bastion-Session header
|
|
60
|
+
const sessionId = req.headers['x-bastion-session'];
|
|
61
|
+
// Determine provider and upstream URL — use route if matched,
|
|
62
|
+
// otherwise create fallback provider so unmatched paths (e.g. GET /v1/models)
|
|
63
|
+
// still go through the plugin pipeline for audit/DLP scanning
|
|
64
|
+
let provider;
|
|
65
|
+
let upstreamUrl;
|
|
66
|
+
if (route) {
|
|
67
|
+
provider = route.provider;
|
|
68
|
+
upstreamUrl = route.upstreamUrl;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const upstream = (0, passthrough_js_1.detectUpstream)(req.headers);
|
|
72
|
+
upstreamUrl = upstream + (req.url ?? '/');
|
|
73
|
+
const hostname = new URL(upstream).hostname;
|
|
74
|
+
provider = {
|
|
75
|
+
name: hostname.replace(/\./g, '-'),
|
|
76
|
+
baseUrl: upstream,
|
|
77
|
+
authHeader: '',
|
|
78
|
+
transformHeaders(headers) {
|
|
79
|
+
const result = {};
|
|
80
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
81
|
+
const lower = key.toLowerCase();
|
|
82
|
+
if (lower !== 'host' && lower !== 'connection' && lower !== 'transfer-encoding') {
|
|
83
|
+
result[key] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
},
|
|
88
|
+
extractModel() { return hostname; },
|
|
89
|
+
extractUsage() {
|
|
90
|
+
return { inputTokens: 0, outputTokens: 0 };
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await (0, forwarder_js_1.forwardRequest)(req, res, {
|
|
96
|
+
provider,
|
|
97
|
+
upstreamUrl,
|
|
98
|
+
upstreamTimeout: config.timeouts.upstream,
|
|
99
|
+
pluginManager,
|
|
100
|
+
sessionId,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
log.error('Request handling failed', { error: err.message });
|
|
105
|
+
if (!res.headersSent) {
|
|
106
|
+
(0, router_js_1.sendError)(res, 500, 'Internal gateway error');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
(0, safety_js_1.setupGracefulShutdown)(server, cleanup);
|
|
111
|
+
// Enable HTTPS_PROXY mode (CONNECT handler for MITM on API domains)
|
|
112
|
+
(0, connect_js_1.setupConnectHandler)(server, config, pluginManager);
|
|
113
|
+
return server;
|
|
114
|
+
}
|
|
115
|
+
function startServer(server, config) {
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
server.listen(config.server.port, config.server.host, () => {
|
|
118
|
+
log.info('Bastion AI Gateway started', {
|
|
119
|
+
host: config.server.host,
|
|
120
|
+
port: config.server.port,
|
|
121
|
+
});
|
|
122
|
+
resolve();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE parser — inspects streaming events for metrics/DLP without modifying the stream.
|
|
3
|
+
* Raw bytes are always forwarded unmodified to clients.
|
|
4
|
+
*/
|
|
5
|
+
export interface SSEEvent {
|
|
6
|
+
event?: string;
|
|
7
|
+
data: string;
|
|
8
|
+
}
|
|
9
|
+
export type SSEEventHandler = (event: SSEEvent) => void;
|
|
10
|
+
export declare class SSEParser {
|
|
11
|
+
private buffer;
|
|
12
|
+
private currentEvent;
|
|
13
|
+
private currentData;
|
|
14
|
+
private onEvent;
|
|
15
|
+
constructor(onEvent: SSEEventHandler);
|
|
16
|
+
feed(chunk: string): void;
|
|
17
|
+
flush(): void;
|
|
18
|
+
}
|
|
19
|
+
/** Extract JSON data from an SSE event, returns null if not valid JSON */
|
|
20
|
+
export declare function parseSSEData(event: SSEEvent): Record<string, unknown> | null;
|
|
21
|
+
//# sourceMappingURL=streaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/proxy/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAExD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,OAAO,CAAkB;gBAErB,OAAO,EAAE,eAAe;IAIpC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAwBzB,KAAK,IAAI,IAAI;CAiBd;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAO5E"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SSE parser — inspects streaming events for metrics/DLP without modifying the stream.
|
|
4
|
+
* Raw bytes are always forwarded unmodified to clients.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SSEParser = void 0;
|
|
8
|
+
exports.parseSSEData = parseSSEData;
|
|
9
|
+
class SSEParser {
|
|
10
|
+
buffer = '';
|
|
11
|
+
currentEvent;
|
|
12
|
+
currentData = [];
|
|
13
|
+
onEvent;
|
|
14
|
+
constructor(onEvent) {
|
|
15
|
+
this.onEvent = onEvent;
|
|
16
|
+
}
|
|
17
|
+
feed(chunk) {
|
|
18
|
+
this.buffer += chunk;
|
|
19
|
+
const lines = this.buffer.split('\n');
|
|
20
|
+
// Keep the last incomplete line in the buffer
|
|
21
|
+
this.buffer = lines.pop() ?? '';
|
|
22
|
+
for (const rawLine of lines) {
|
|
23
|
+
// Strip trailing \r to handle both \n and \r\n line endings
|
|
24
|
+
const line = rawLine.endsWith('\r') ? rawLine.slice(0, -1) : rawLine;
|
|
25
|
+
if (line.startsWith('event: ')) {
|
|
26
|
+
this.currentEvent = line.slice(7).trim();
|
|
27
|
+
}
|
|
28
|
+
else if (line.startsWith('data: ')) {
|
|
29
|
+
this.currentData.push(line.slice(6));
|
|
30
|
+
}
|
|
31
|
+
else if (line === '') {
|
|
32
|
+
// Empty line = end of event
|
|
33
|
+
if (this.currentData.length > 0) {
|
|
34
|
+
this.onEvent({ event: this.currentEvent, data: this.currentData.join('\n') });
|
|
35
|
+
}
|
|
36
|
+
this.currentEvent = undefined;
|
|
37
|
+
this.currentData = [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
flush() {
|
|
42
|
+
// Emit any pending event
|
|
43
|
+
if (this.currentData.length > 0) {
|
|
44
|
+
this.onEvent({ event: this.currentEvent, data: this.currentData.join('\n') });
|
|
45
|
+
this.currentEvent = undefined;
|
|
46
|
+
this.currentData = [];
|
|
47
|
+
}
|
|
48
|
+
// Check remaining buffer for a final data line
|
|
49
|
+
if (this.buffer.trim()) {
|
|
50
|
+
const line = this.buffer.trim();
|
|
51
|
+
if (line.startsWith('data: ')) {
|
|
52
|
+
this.onEvent({ event: undefined, data: line.slice(6) });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this.buffer = '';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.SSEParser = SSEParser;
|
|
59
|
+
/** Extract JSON data from an SSE event, returns null if not valid JSON */
|
|
60
|
+
function parseSSEData(event) {
|
|
61
|
+
if (event.data === '[DONE]')
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
return JSON.parse(event.data);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/proxy/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export declare function getDatabase(dbPath?: string): Database.Database;
|
|
3
|
+
export declare function closeDatabase(): void;
|
|
4
|
+
/** Create an in-memory database for testing */
|
|
5
|
+
export declare function createTestDatabase(): Database.Database;
|
|
6
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAWtC,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAe9D;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAMtD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getDatabase = getDatabase;
|
|
7
|
+
exports.closeDatabase = closeDatabase;
|
|
8
|
+
exports.createTestDatabase = createTestDatabase;
|
|
9
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const paths_js_1 = require("../config/paths.js");
|
|
13
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
14
|
+
const migrations_js_1 = require("./migrations.js");
|
|
15
|
+
const log = (0, logger_js_1.createLogger)('database');
|
|
16
|
+
let db = null;
|
|
17
|
+
function getDatabase(dbPath) {
|
|
18
|
+
if (db)
|
|
19
|
+
return db;
|
|
20
|
+
const resolvedPath = dbPath ?? paths_js_1.paths.databaseFile;
|
|
21
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(resolvedPath), { recursive: true });
|
|
22
|
+
db = new better_sqlite3_1.default(resolvedPath);
|
|
23
|
+
db.pragma('journal_mode = WAL');
|
|
24
|
+
db.pragma('foreign_keys = ON');
|
|
25
|
+
db.pragma('busy_timeout = 5000');
|
|
26
|
+
(0, migrations_js_1.runMigrations)(db);
|
|
27
|
+
log.info('Database initialized', { path: resolvedPath });
|
|
28
|
+
return db;
|
|
29
|
+
}
|
|
30
|
+
function closeDatabase() {
|
|
31
|
+
if (db) {
|
|
32
|
+
db.close();
|
|
33
|
+
db = null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Create an in-memory database for testing */
|
|
37
|
+
function createTestDatabase() {
|
|
38
|
+
const testDb = new better_sqlite3_1.default(':memory:');
|
|
39
|
+
testDb.pragma('journal_mode = WAL');
|
|
40
|
+
testDb.pragma('foreign_keys = ON');
|
|
41
|
+
(0, migrations_js_1.runMigrations)(testDb);
|
|
42
|
+
return testDb;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":";;;;;AAWA,kCAeC;AAED,sCAKC;AAGD,gDAMC;AA1CD,oEAAsC;AACtC,qCAAoC;AACpC,yCAAoC;AACpC,iDAA2C;AAC3C,kDAAkD;AAClD,mDAAgD;AAEhD,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,UAAU,CAAC,CAAC;AAErC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,SAAgB,WAAW,CAAC,MAAe;IACzC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,YAAY,GAAG,MAAM,IAAI,gBAAK,CAAC,YAAY,CAAC;IAClD,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,EAAE,GAAG,IAAI,wBAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,IAAA,6BAAa,EAAC,EAAE,CAAC,CAAC;IAClB,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAEzD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,aAAa;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,SAAgB,kBAAkB;IAChC,MAAM,MAAM,GAAG,IAAI,wBAAQ,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACnC,IAAA,6BAAa,EAAC,MAAM,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function getEncryptionKey(keyPath?: string): Buffer;
|
|
2
|
+
export interface EncryptedData {
|
|
3
|
+
encrypted: Buffer;
|
|
4
|
+
iv: Buffer;
|
|
5
|
+
authTag: Buffer;
|
|
6
|
+
}
|
|
7
|
+
export declare function encrypt(plaintext: string, key?: Buffer): EncryptedData;
|
|
8
|
+
export declare function decrypt(data: EncryptedData, key?: Buffer): string;
|
|
9
|
+
/** Reset the cached key (for testing) */
|
|
10
|
+
export declare function resetEncryptionKey(): void;
|
|
11
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/storage/encryption.ts"],"names":[],"mappings":"AAWA,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAczD;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,CAStE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEncryptionKey = getEncryptionKey;
|
|
4
|
+
exports.encrypt = encrypt;
|
|
5
|
+
exports.decrypt = decrypt;
|
|
6
|
+
exports.resetEncryptionKey = resetEncryptionKey;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const paths_js_1 = require("../config/paths.js");
|
|
11
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
12
|
+
const IV_LENGTH = 12;
|
|
13
|
+
const AUTH_TAG_LENGTH = 16;
|
|
14
|
+
let encryptionKey = null;
|
|
15
|
+
function getEncryptionKey(keyPath) {
|
|
16
|
+
if (encryptionKey)
|
|
17
|
+
return encryptionKey;
|
|
18
|
+
const resolvedPath = keyPath ?? paths_js_1.paths.encryptionKeyFile;
|
|
19
|
+
if ((0, node_fs_1.existsSync)(resolvedPath)) {
|
|
20
|
+
encryptionKey = (0, node_fs_1.readFileSync)(resolvedPath);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(resolvedPath), { recursive: true });
|
|
24
|
+
encryptionKey = (0, node_crypto_1.randomBytes)(32);
|
|
25
|
+
(0, node_fs_1.writeFileSync)(resolvedPath, encryptionKey, { mode: 0o600 });
|
|
26
|
+
}
|
|
27
|
+
return encryptionKey;
|
|
28
|
+
}
|
|
29
|
+
function encrypt(plaintext, key) {
|
|
30
|
+
const k = key ?? getEncryptionKey();
|
|
31
|
+
const iv = (0, node_crypto_1.randomBytes)(IV_LENGTH);
|
|
32
|
+
const cipher = (0, node_crypto_1.createCipheriv)(ALGORITHM, k, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
33
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);
|
|
34
|
+
const authTag = cipher.getAuthTag();
|
|
35
|
+
return { encrypted, iv, authTag };
|
|
36
|
+
}
|
|
37
|
+
function decrypt(data, key) {
|
|
38
|
+
const k = key ?? getEncryptionKey();
|
|
39
|
+
const decipher = (0, node_crypto_1.createDecipheriv)(ALGORITHM, k, data.iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
40
|
+
decipher.setAuthTag(data.authTag);
|
|
41
|
+
return decipher.update(data.encrypted) + decipher.final('utf-8');
|
|
42
|
+
}
|
|
43
|
+
/** Reset the cached key (for testing) */
|
|
44
|
+
function resetEncryptionKey() {
|
|
45
|
+
encryptionKey = null;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/storage/encryption.ts"],"names":[],"mappings":";;AAWA,4CAcC;AAQD,0BASC;AAED,0BAMC;AAGD,gDAEC;AAvDD,6CAA4E;AAC5E,qCAA6E;AAC7E,yCAAoC;AACpC,iDAA2C;AAE3C,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAExC,MAAM,YAAY,GAAG,OAAO,IAAI,gBAAK,CAAC,iBAAiB,CAAC;IAExD,IAAI,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,aAAa,GAAG,IAAA,sBAAY,EAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,aAAa,GAAG,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC;QAChC,IAAA,uBAAa,EAAC,YAAY,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAQD,SAAgB,OAAO,CAAC,SAAiB,EAAE,GAAY;IACrD,MAAM,CAAC,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,IAAA,yBAAW,EAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,4BAAc,EAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;IAEpF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,OAAO,CAAC,IAAmB,EAAE,GAAY;IACvD,MAAM,CAAC,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAA,8BAAgB,EAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7F,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,yCAAyC;AACzC,SAAgB,kBAAkB;IAChC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/storage/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAkP3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAqCzD"}
|