@calebmabry/postgres-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +223 -0
  3. package/dist/config.d.ts +44 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +53 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/db.d.ts +46 -0
  8. package/dist/db.d.ts.map +1 -0
  9. package/dist/db.js +140 -0
  10. package/dist/db.js.map +1 -0
  11. package/dist/http-server.d.ts +3 -0
  12. package/dist/http-server.d.ts.map +1 -0
  13. package/dist/http-server.js +184 -0
  14. package/dist/http-server.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +33 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/logger.d.ts +8 -0
  20. package/dist/logger.d.ts.map +1 -0
  21. package/dist/logger.js +85 -0
  22. package/dist/logger.js.map +1 -0
  23. package/dist/register-tools.d.ts +6 -0
  24. package/dist/register-tools.d.ts.map +1 -0
  25. package/dist/register-tools.js +83 -0
  26. package/dist/register-tools.js.map +1 -0
  27. package/dist/tools/describe.d.ts +31 -0
  28. package/dist/tools/describe.d.ts.map +1 -0
  29. package/dist/tools/describe.js +61 -0
  30. package/dist/tools/describe.js.map +1 -0
  31. package/dist/tools/functions.d.ts +20 -0
  32. package/dist/tools/functions.d.ts.map +1 -0
  33. package/dist/tools/functions.js +65 -0
  34. package/dist/tools/functions.js.map +1 -0
  35. package/dist/tools/indexes.d.ts +17 -0
  36. package/dist/tools/indexes.d.ts.map +1 -0
  37. package/dist/tools/indexes.js +82 -0
  38. package/dist/tools/indexes.js.map +1 -0
  39. package/dist/tools/list.d.ts +22 -0
  40. package/dist/tools/list.d.ts.map +1 -0
  41. package/dist/tools/list.js +64 -0
  42. package/dist/tools/list.js.map +1 -0
  43. package/dist/tools/performance.d.ts +26 -0
  44. package/dist/tools/performance.d.ts.map +1 -0
  45. package/dist/tools/performance.js +125 -0
  46. package/dist/tools/performance.js.map +1 -0
  47. package/dist/tools/query.d.ts +6 -0
  48. package/dist/tools/query.d.ts.map +1 -0
  49. package/dist/tools/query.js +318 -0
  50. package/dist/tools/query.js.map +1 -0
  51. package/dist/tools/schemas.d.ts +10 -0
  52. package/dist/tools/schemas.d.ts.map +1 -0
  53. package/dist/tools/schemas.js +51 -0
  54. package/dist/tools/schemas.js.map +1 -0
  55. package/dist/validation.d.ts +159 -0
  56. package/dist/validation.d.ts.map +1 -0
  57. package/dist/validation.js +90 -0
  58. package/dist/validation.js.map +1 -0
  59. package/dist/version.d.ts +3 -0
  60. package/dist/version.d.ts.map +1 -0
  61. package/dist/version.js +11 -0
  62. package/dist/version.js.map +1 -0
  63. package/package.json +78 -0
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2025, abiswas97
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,223 @@
1
+ # Postgres MCP Server
2
+
3
+ [![npm version](https://badge.fury.io/js/@calebmabry%2Fpostgres-mcp-server.svg)](https://www.npmjs.com/package/@calebmabry/postgres-mcp-server)
4
+ [![Tests](https://github.com/caleb-mabry/postgres-mcp/actions/workflows/test.yml/badge.svg)](https://github.com/caleb-mabry/postgres-mcp/actions/workflows/test.yml)
5
+ [![GitHub issues](https://img.shields.io/github/issues/caleb-mabry/postgres-mcp)](https://github.com/caleb-mabry/postgres-mcp/issues)
6
+ [![Documentation](https://img.shields.io/badge/docs-docusaurus-blue)](https://caleb-mabry.github.io/postgres-mcp/)
7
+
8
+ A Model Context Protocol (MCP) server that provides secure database access to PostgreSQL through Kysely ORM. This server enables Claude Desktop to interact with PostgreSQL databases using natural language.
9
+
10
+ ## 📚 Documentation
11
+
12
+ **Full documentation is available at: [caleb-mabry.github.io/postgres-mcp](https://caleb-mabry.github.io/postgres-mcp/)**
13
+
14
+ ### Quick Links
15
+ - [Getting Started](https://caleb-mabry.github.io/postgres-mcp/docs/intro)
16
+ - [Claude Desktop Setup](https://caleb-mabry.github.io/postgres-mcp/docs/setup/claude-desktop)
17
+ - [HTTP Server Setup](https://caleb-mabry.github.io/postgres-mcp/docs/setup/http-server)
18
+ - [Docker Setup](https://caleb-mabry.github.io/postgres-mcp/docs/setup/docker)
19
+ - [Usage Modes](https://caleb-mabry.github.io/postgres-mcp/docs/guides/usage-modes)
20
+
21
+ ## Features
22
+
23
+ - **MCP Tools**: Query execution, table listing, schema inspection, and constraint information
24
+ - **Type Safety**: Full TypeScript support with typed inputs/outputs
25
+ - **Connection Pooling**: Configurable connection limits with idle timeout
26
+ - **Error Handling**: Graceful error messages for connection and query issues
27
+ - **Security**: Parameterized queries to prevent SQL injection
28
+
29
+ ## Quick Start
30
+
31
+ ### For Claude Desktop Users
32
+
33
+ See the **[📖 Claude Desktop Setup Guide](https://caleb-mabry.github.io/postgres-mcp/docs/setup/claude-desktop)** for complete instructions.
34
+
35
+ ### For HTTP/API Usage
36
+
37
+ See the **[📖 HTTP Server Setup Guide](https://caleb-mabry.github.io/postgres-mcp/docs/setup/http-server)** for complete instructions.
38
+
39
+ ### For Docker
40
+
41
+ See the **[📖 Docker Setup Guide](https://caleb-mabry.github.io/postgres-mcp/docs/setup/docker)** for complete instructions.
42
+
43
+ ### Direct Installation
44
+
45
+ ```bash
46
+ npx -y @calebmabry/postgres-mcp-server
47
+ ```
48
+
49
+ ## Configuration
50
+
51
+ Create a `.env` file with your database credentials:
52
+
53
+ ```env
54
+ DB_HOST=127.0.0.1
55
+ DB_PORT=5432
56
+ DB_USER=postgres
57
+ DB_PASSWORD=your_password_here
58
+ DB_NAME=postgres
59
+ DB_SSL=true
60
+
61
+ # HTTP Server mode only (optional)
62
+ PORT=3000
63
+ ALLOWED_HOSTS=localhost,127.0.0.1
64
+ ```
65
+
66
+ ## Available Tools
67
+
68
+ | Tool | Description | Required Parameters | Optional Parameters |
69
+ | --------------------- | ------------------------------------------- | ----------------------------------- | ----------------------------------------------------------- |
70
+ | **`query`** | Execute SQL queries with pagination support | `sql` (string) | `pageSize` (1-500), `offset` (number), `parameters` (array) |
71
+ | **`describe_table`** | Get table structure and column details | `schema` (string), `table` (string) | - |
72
+ | **`list_tables`** | List all tables in a schema | `schema` (string) | - |
73
+ | **`list_schemas`** | List all schemas in the database | - | `includeSystemSchemas` (boolean) |
74
+ | **`get_constraints`** | Get table constraints (PK, FK, etc.) | `schema` (string), `table` (string) | - |
75
+ | **`list_indexes`** | List indexes for a table or schema | `schema` (string) | `table` (string) |
76
+ | **`list_views`** | List views in a schema | `schema` (string) | - |
77
+ | **`list_functions`** | List functions and procedures | `schema` (string) | - |
78
+ | **`explain_query`** | Get query execution plan | `sql` (string) | `analyze` (boolean), `format` (text/json/xml/yaml) |
79
+ | **`get_table_stats`** | Get table size and statistics | `schema` (string) | `table` (string) |
80
+
81
+ ### Key Features
82
+
83
+ - **Pagination**: Query tool supports up to 500 rows per page with automatic LIMIT/OFFSET handling
84
+ - **Security**: Parameterized queries prevent SQL injection, READ_ONLY mode by default
85
+ - **Type Safety**: Full TypeScript support with Zod schema validation
86
+
87
+ ## Client Configuration
88
+
89
+ The postgres-mcp-server works with any MCP-compatible client. See configuration examples below:
90
+
91
+ ### Claude Desktop
92
+
93
+ Add to `claude_desktop_config.json`:
94
+
95
+ ```json
96
+ {
97
+ "mcpServers": {
98
+ "postgres-mcp-server": {
99
+ "command": "npx",
100
+ "args": ["-y", "@calebmabry/postgres-mcp-server"],
101
+ "env": {
102
+ "DB_HOST": "127.0.0.1",
103
+ "DB_PORT": "5432",
104
+ "DB_USER": "postgres",
105
+ "DB_PASSWORD": "your_password_here",
106
+ "DB_NAME": "your_database_name",
107
+ "DB_SSL": "false",
108
+ "READ_ONLY": "true"
109
+ }
110
+ }
111
+ }
112
+ }
113
+ ```
114
+
115
+ **Config locations:**
116
+ - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
117
+ - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
118
+
119
+ See [claude_config_example.json](./claude_config_example.json) for a full example.
120
+
121
+ ### Cline (VS Code)
122
+
123
+ Add to `.cline/mcp_settings.json`:
124
+
125
+ ```json
126
+ {
127
+ "mcpServers": {
128
+ "postgres-mcp-server": {
129
+ "command": "npx",
130
+ "args": ["-y", "@calebmabry/postgres-mcp-server"],
131
+ "env": {
132
+ "DB_HOST": "localhost",
133
+ "DB_NAME": "your_database",
134
+ "DB_USER": "postgres",
135
+ "DB_PASSWORD": "your_password"
136
+ }
137
+ }
138
+ }
139
+ }
140
+ ```
141
+
142
+ See [cline_mcp_settings_example.json](./cline_mcp_settings_example.json) for a full example.
143
+
144
+ ### Zed Editor
145
+
146
+ Add to Zed settings (Settings → Context Servers):
147
+
148
+ ```json
149
+ {
150
+ "context_servers": {
151
+ "postgres-mcp-server": {
152
+ "command": {
153
+ "path": "npx",
154
+ "args": ["-y", "@calebmabry/postgres-mcp-server"]
155
+ },
156
+ "settings": {
157
+ "DB_HOST": "localhost",
158
+ "DB_NAME": "your_database",
159
+ "DB_USER": "postgres",
160
+ "DB_PASSWORD": "your_password"
161
+ }
162
+ }
163
+ }
164
+ }
165
+ ```
166
+
167
+ See [zed_settings_example.json](./zed_settings_example.json) for a full example.
168
+
169
+ ### Docker
170
+
171
+ Use the included Dockerfile or docker-compose.yml:
172
+
173
+ ```bash
174
+ docker-compose up -d
175
+ ```
176
+
177
+ See [docker-compose.example.yml](./docker-compose.example.yml) for a full example.
178
+
179
+ ## Development
180
+
181
+ ```bash
182
+ # Clone and install dependencies
183
+ git clone https://github.com/caleb-mabry/postgres-mcp.git
184
+ cd postgres-mcp-server
185
+ npm install
186
+
187
+ # Run in development mode with hot reload
188
+ npm run dev
189
+
190
+ # Build for production
191
+ npm run build
192
+
193
+ # Run tests
194
+ npm run test
195
+
196
+ # Run specific test suites
197
+ npm run test:unit
198
+ npm run test:integration
199
+ ```
200
+
201
+ ## Environment Variables
202
+
203
+ | Variable | Default | Description |
204
+ | ------------------- | ----------- | --------------------------------------- |
205
+ | `DB_HOST` | `127.0.0.1` | PostgreSQL host |
206
+ | `DB_PORT` | `5432` | PostgreSQL port |
207
+ | `DB_USER` | `postgres` | Database user |
208
+ | `DB_PASSWORD` | _required_ | Database password |
209
+ | `DB_NAME` | `postgres` | Database name |
210
+ | `DB_SSL` | `true` | Enable SSL connection |
211
+ | `READ_ONLY` | `true` | Restrict to SELECT/WITH/EXPLAIN queries |
212
+ | `QUERY_TIMEOUT` | `30000` | Query timeout in milliseconds |
213
+ | `MODE` | `stdio` | Server mode in Docker: `stdio` or `http` |
214
+
215
+ For detailed documentation on all features and setup options, visit **[caleb-mabry.github.io/postgres-mcp](https://caleb-mabry.github.io/postgres-mcp/)**.
216
+ | `MAX_PAGE_SIZE` | `500` | Maximum rows per page |
217
+ | `DEFAULT_PAGE_SIZE` | `100` | Default page size when not specified |
218
+ | `PORT` | `3000` | HTTP server port (HTTP mode only) |
219
+ | `ALLOWED_HOSTS` | _none_ | Comma-separated allowed hosts (HTTP mode only). Example: `localhost,127.0.0.1,example.com` |
220
+
221
+ ## License
222
+
223
+ ISC
@@ -0,0 +1,44 @@
1
+ export interface AppConfig {
2
+ db: {
3
+ host: string;
4
+ port: number;
5
+ user: string;
6
+ password: string;
7
+ database: string;
8
+ maxConnections: number;
9
+ idleTimeoutMs: number;
10
+ connectionTimeoutMs: number;
11
+ queryTimeoutMs: number;
12
+ ssl: {
13
+ enabled: boolean;
14
+ rejectUnauthorized: boolean;
15
+ caCert?: string;
16
+ allowSelfSigned: boolean;
17
+ };
18
+ };
19
+ server: {
20
+ port: number;
21
+ allowedHosts?: string;
22
+ };
23
+ query: {
24
+ maxPageSize: number;
25
+ defaultPageSize: number;
26
+ autoLimit: boolean;
27
+ maxPayloadSize: number;
28
+ };
29
+ app: {
30
+ readOnly: boolean;
31
+ logLevel: "debug" | "info" | "warn" | "error";
32
+ };
33
+ }
34
+ /**
35
+ * Load and validate configuration from environment variables
36
+ * @param forceReload - Force reloading from environment variables (useful for tests)
37
+ */
38
+ export declare function loadConfig(forceReload?: boolean): AppConfig;
39
+ /**
40
+ * Singleton configuration instance
41
+ * Can be accessed directly for most use cases
42
+ */
43
+ export declare const config: AppConfig;
44
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IAExB,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC;QACvB,GAAG,EAAE;YACH,OAAO,EAAE,OAAO,CAAC;YACjB,kBAAkB,EAAE,OAAO,CAAC;YAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,eAAe,EAAE,OAAO,CAAC;SAC1B,CAAC;KACH,CAAC;IAGF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IAGF,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAGF,GAAG,EAAE;QACH,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;KAC/C,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,WAAW,UAAQ,GAAG,SAAS,CA+CzD;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,SAAwB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Centralized configuration management for environment variables
3
+ */
4
+ import * as dotenv from "dotenv";
5
+ dotenv.config();
6
+ /**
7
+ * Load and validate configuration from environment variables
8
+ * @param forceReload - Force reloading from environment variables (useful for tests)
9
+ */
10
+ export function loadConfig(forceReload = false) {
11
+ // For DB_PASSWORD, allow it to be empty in test/dev environments
12
+ // but it will still be required for actual DB connections
13
+ const dbPassword = process.env.DB_PASSWORD || "";
14
+ return {
15
+ db: {
16
+ host: process.env.DB_HOST || "127.0.0.1",
17
+ port: parseInt(process.env.DB_PORT || "5432", 10),
18
+ user: process.env.DB_USER || "postgres",
19
+ password: dbPassword,
20
+ database: process.env.DB_NAME || "postgres",
21
+ maxConnections: parseInt(process.env.DB_POOL_MAX || "5", 10),
22
+ idleTimeoutMs: parseInt(process.env.DB_IDLE_TIMEOUT || "5000", 10),
23
+ connectionTimeoutMs: parseInt(process.env.DB_CONNECTION_TIMEOUT || "10000", 10),
24
+ queryTimeoutMs: parseInt(process.env.DB_QUERY_TIMEOUT || "30000", 10),
25
+ ssl: {
26
+ enabled: process.env.DB_SSL !== "false",
27
+ rejectUnauthorized: process.env.DB_SSL_REJECT_UNAUTHORIZED !== "false",
28
+ caCert: process.env.DB_SSL_CA_CERT,
29
+ allowSelfSigned: process.env.DB_SSL_ALLOW_SELF_SIGNED === "true",
30
+ },
31
+ },
32
+ server: {
33
+ port: process.env.PORT ? parseInt(process.env.PORT, 10) : 3000,
34
+ allowedHosts: process.env.ALLOWED_HOSTS,
35
+ },
36
+ query: {
37
+ maxPageSize: parseInt(process.env.MAX_PAGE_SIZE || "500", 10),
38
+ defaultPageSize: parseInt(process.env.DEFAULT_PAGE_SIZE || "100", 10),
39
+ autoLimit: process.env.AUTO_LIMIT !== "false",
40
+ maxPayloadSize: parseInt(process.env.MAX_PAYLOAD_SIZE || String(5 * 1024 * 1024), 10),
41
+ },
42
+ app: {
43
+ readOnly: process.env.READ_ONLY !== "false",
44
+ logLevel: process.env.LOG_LEVEL || "info",
45
+ },
46
+ };
47
+ }
48
+ /**
49
+ * Singleton configuration instance
50
+ * Can be accessed directly for most use cases
51
+ */
52
+ export const config = loadConfig();
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,CAAC,MAAM,EAAE,CAAC;AA2ChB;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,WAAW,GAAG,KAAK;IAC5C,iEAAiE;IACjE,0DAA0D;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAEjD,OAAO;QACL,EAAE,EAAE;YACF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;YACxC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,CAAC;YACjD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU;YACvC,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU;YAC3C,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,EAAE,EAAE,CAAC;YAC5D,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,EAAE,EAAE,CAAC;YAClE,mBAAmB,EAAE,QAAQ,CAC3B,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAC5C,EAAE,CACH;YACD,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,EAAE,EAAE,CAAC;YACrE,GAAG,EAAE;gBACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,OAAO;gBACvC,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,OAAO;gBACtE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;gBAClC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,MAAM;aACjE;SACF;QAED,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9D,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;SACxC;QAED,KAAK,EAAE;YACL,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,EAAE,EAAE,CAAC;YAC7D,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,KAAK,EAAE,EAAE,CAAC;YACrE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO;YAC7C,cAAc,EAAE,QAAQ,CACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EACvD,EAAE,CACH;SACF;QAED,GAAG,EAAE;YACH,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO;YAC3C,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,SAA0C,IAAI,MAAM;SAC5E;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAc,UAAU,EAAE,CAAC"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ import { Kysely } from "kysely";
2
+ import { Pool } from "pg";
3
+ export interface Database {
4
+ [key: string]: any;
5
+ }
6
+ export interface DatabaseConfig {
7
+ host: string;
8
+ port: number;
9
+ user: string;
10
+ password: string;
11
+ database: string;
12
+ maxConnections: number;
13
+ idleTimeoutMs: number;
14
+ ssl: boolean | {
15
+ rejectUnauthorized: boolean;
16
+ ca?: string;
17
+ };
18
+ connectionTimeoutMs: number;
19
+ queryTimeoutMs: number;
20
+ }
21
+ declare class DatabaseManager {
22
+ private static instance;
23
+ private db;
24
+ private pool;
25
+ private config;
26
+ private constructor();
27
+ static getInstance(): DatabaseManager;
28
+ private loadConfig;
29
+ private buildSSLConfig;
30
+ getDatabase(): Kysely<Database>;
31
+ private connect;
32
+ close(): Promise<void>;
33
+ healthCheck(): Promise<{
34
+ healthy: boolean;
35
+ error?: string;
36
+ }>;
37
+ getConfig(): DatabaseConfig;
38
+ getPool(): Pool;
39
+ isConnected(): boolean;
40
+ }
41
+ export declare function getDb(): Kysely<Database>;
42
+ export declare function closeDb(): Promise<void>;
43
+ export declare function getPool(): Pool;
44
+ export declare function getDbManager(): DatabaseManager;
45
+ export {};
46
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmB,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAItC,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,OAAO,GAAG;QAAE,kBAAkB,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,EAAE,CAAiC;IAC3C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO;WAIO,WAAW,IAAI,eAAe;IAO5C,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,cAAc;IAwBf,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC;IAOtC,OAAO,CAAC,OAAO;IAoCF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBlE,SAAS,IAAI,cAAc;IAI3B,OAAO,IAAI,IAAI;IAOf,WAAW,IAAI,OAAO;CAG9B;AAED,wBAAgB,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,CAExC;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,YAAY,IAAI,eAAe,CAE9C"}
package/dist/db.js ADDED
@@ -0,0 +1,140 @@
1
+ import { Kysely, PostgresDialect } from "kysely";
2
+ import { Pool } from "pg";
3
+ import { config } from "./config.js";
4
+ import { log } from "./logger.js";
5
+ class DatabaseManager {
6
+ static instance = null;
7
+ db = null;
8
+ pool = null;
9
+ config;
10
+ constructor() {
11
+ this.config = this.loadConfig();
12
+ }
13
+ static getInstance() {
14
+ if (!DatabaseManager.instance) {
15
+ DatabaseManager.instance = new DatabaseManager();
16
+ }
17
+ return DatabaseManager.instance;
18
+ }
19
+ loadConfig() {
20
+ return {
21
+ host: config.db.host,
22
+ port: config.db.port,
23
+ user: config.db.user,
24
+ password: config.db.password,
25
+ database: config.db.database,
26
+ maxConnections: config.db.maxConnections,
27
+ idleTimeoutMs: config.db.idleTimeoutMs,
28
+ connectionTimeoutMs: config.db.connectionTimeoutMs,
29
+ queryTimeoutMs: config.db.queryTimeoutMs,
30
+ ssl: this.buildSSLConfig(),
31
+ };
32
+ }
33
+ buildSSLConfig() {
34
+ if (!config.db.ssl.enabled) {
35
+ return false;
36
+ }
37
+ const sslConfig = {
38
+ rejectUnauthorized: config.db.ssl.rejectUnauthorized,
39
+ };
40
+ // Add CA certificate if provided
41
+ if (config.db.ssl.caCert) {
42
+ sslConfig.ca = config.db.ssl.caCert;
43
+ }
44
+ // For when explicitly allowing self-signed certs
45
+ if (config.db.ssl.allowSelfSigned) {
46
+ sslConfig.rejectUnauthorized = false;
47
+ }
48
+ return sslConfig;
49
+ }
50
+ getDatabase() {
51
+ if (!this.db) {
52
+ this.connect();
53
+ }
54
+ return this.db;
55
+ }
56
+ connect() {
57
+ if (this.db) {
58
+ return;
59
+ }
60
+ const poolConfig = {
61
+ host: this.config.host,
62
+ port: this.config.port,
63
+ user: this.config.user,
64
+ password: this.config.password,
65
+ database: this.config.database,
66
+ max: this.config.maxConnections,
67
+ idleTimeoutMillis: this.config.idleTimeoutMs,
68
+ connectionTimeoutMillis: this.config.connectionTimeoutMs,
69
+ statement_timeout: this.config.queryTimeoutMs,
70
+ query_timeout: this.config.queryTimeoutMs,
71
+ ssl: this.config.ssl,
72
+ };
73
+ this.pool = new Pool(poolConfig);
74
+ this.pool.on("error", (err) => {
75
+ log.error(`Pool error: ${err.message}`, "db", { code: err.code });
76
+ });
77
+ this.pool.on("connect", () => {
78
+ log.debug("New pool connection established", "db");
79
+ });
80
+ this.db = new Kysely({
81
+ dialect: new PostgresDialect({
82
+ pool: this.pool,
83
+ }),
84
+ });
85
+ }
86
+ async close() {
87
+ if (this.db) {
88
+ await this.db.destroy();
89
+ this.db = null;
90
+ }
91
+ if (this.pool && !this.pool.ended) {
92
+ await this.pool.end();
93
+ this.pool = null;
94
+ }
95
+ }
96
+ async healthCheck() {
97
+ try {
98
+ if (!this.db) {
99
+ this.connect();
100
+ }
101
+ await this.db.selectFrom("information_schema.tables")
102
+ .select("table_name")
103
+ .limit(1)
104
+ .execute();
105
+ return { healthy: true };
106
+ }
107
+ catch (error) {
108
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
109
+ return {
110
+ healthy: false,
111
+ error: errorMessage,
112
+ };
113
+ }
114
+ }
115
+ getConfig() {
116
+ return { ...this.config }; // Return a copy to prevent modification
117
+ }
118
+ getPool() {
119
+ if (!this.pool) {
120
+ this.connect();
121
+ }
122
+ return this.pool;
123
+ }
124
+ isConnected() {
125
+ return this.db !== null && this.pool !== null;
126
+ }
127
+ }
128
+ export function getDb() {
129
+ return DatabaseManager.getInstance().getDatabase();
130
+ }
131
+ export async function closeDb() {
132
+ await DatabaseManager.getInstance().close();
133
+ }
134
+ export function getPool() {
135
+ return DatabaseManager.getInstance().getPool();
136
+ }
137
+ export function getDbManager() {
138
+ return DatabaseManager.getInstance();
139
+ }
140
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAmBlC,MAAM,eAAe;IACX,MAAM,CAAC,QAAQ,GAA2B,IAAI,CAAC;IAC/C,EAAE,GAA4B,IAAI,CAAC;IACnC,IAAI,GAAgB,IAAI,CAAC;IACzB,MAAM,CAAiB;IAE/B;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC9B,eAAe,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,eAAe,CAAC,QAAQ,CAAC;IAClC,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI;YACpB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI;YACpB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI;YACpB,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ;YAC5B,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ;YAC5B,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc;YACxC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,aAAa;YACtC,mBAAmB,EAAE,MAAM,CAAC,EAAE,CAAC,mBAAmB;YAClD,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc;YACxC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE;SAC3B,CAAC;IACJ,CAAC;IAEO,cAAc;QAGpB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAiD;YAC9D,kBAAkB,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB;SACrD,CAAC;QAEF,iCAAiC;QACjC,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACzB,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC,CAAC;QAED,iDAAiD;QACjD,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAClC,SAAS,CAAC,kBAAkB,GAAG,KAAK,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC,EAAG,CAAC;IAClB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAe;YAC7B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC/B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YAC5C,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;YACxD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAC7C,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YACzC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;SACrB,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAG,GAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3B,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAW;YAC7B,OAAO,EAAE,IAAI,eAAe,CAAC;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YAED,MAAM,IAAI,CAAC,EAAG,CAAC,UAAU,CAAC,2BAA2B,CAAC;iBACnD,MAAM,CAAC,YAAY,CAAC;iBACpB,KAAK,CAAC,CAAC,CAAC;iBACR,OAAO,EAAE,CAAC;YAEb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,SAAS;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,wCAAwC;IACrE,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC,IAAK,CAAC;IACpB,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAChD,CAAC;;AAGH,MAAM,UAAU,KAAK;IACnB,OAAO,eAAe,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,eAAe,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,CAAC,WAAW,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":""}