@eamonboyle/mssql-mcp 1.4.1 → 1.6.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.
- package/README.md +329 -361
- package/dist/config.d.ts +30 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +142 -34
- package/dist/config.js.map +1 -1
- package/dist/db.d.ts +4 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +37 -23
- package/dist/db.js.map +1 -1
- package/dist/index.js +77 -44
- package/dist/index.js.map +1 -1
- package/dist/resourceRegistry.d.ts +6 -0
- package/dist/resourceRegistry.d.ts.map +1 -1
- package/dist/resourceRegistry.js +7 -1
- package/dist/resourceRegistry.js.map +1 -1
- package/dist/schema.d.ts +13 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +34 -6
- package/dist/schema.js.map +1 -1
- package/dist/toolRegistry.d.ts.map +1 -1
- package/dist/toolRegistry.js +25 -61
- package/dist/toolRegistry.js.map +1 -1
- package/dist/tools/ListDatabasesTool.d.ts.map +1 -1
- package/dist/tools/ListDatabasesTool.js.map +1 -1
- package/dist/tools/ListLargestTablesTool.d.ts +24 -0
- package/dist/tools/ListLargestTablesTool.d.ts.map +1 -0
- package/dist/tools/ListLargestTablesTool.js +65 -0
- package/dist/tools/ListLargestTablesTool.js.map +1 -0
- package/package.json +5 -3
- package/dist/tools/FilterDataTool.d.ts +0 -33
- package/dist/tools/FilterDataTool.d.ts.map +0 -1
- package/dist/tools/FilterDataTool.js +0 -47
- package/dist/tools/FilterDataTool.js.map +0 -1
package/dist/config.d.ts
CHANGED
|
@@ -1,13 +1,36 @@
|
|
|
1
|
+
type Environment = NodeJS.ProcessEnv;
|
|
1
2
|
export type McpTransportMode = "stdio" | "http";
|
|
3
|
+
export interface SqlConnectionConfig {
|
|
4
|
+
serverName: string;
|
|
5
|
+
serverPort?: number;
|
|
6
|
+
dbUser: string;
|
|
7
|
+
dbPassword: string;
|
|
8
|
+
encrypt: boolean;
|
|
9
|
+
trustServerCertificate: boolean;
|
|
10
|
+
connectionTimeoutSeconds: number;
|
|
11
|
+
queryTimeoutMs: number;
|
|
12
|
+
}
|
|
13
|
+
export interface EnvironmentConfig extends SqlConnectionConfig {
|
|
14
|
+
databaseName: string;
|
|
15
|
+
databases: string[];
|
|
16
|
+
readOnly: boolean;
|
|
17
|
+
enableDdl: boolean;
|
|
18
|
+
maxRows: number;
|
|
19
|
+
maxWriteRows: number;
|
|
20
|
+
requireWritePreview: boolean;
|
|
21
|
+
mcpTransport: McpTransportMode;
|
|
22
|
+
mcpHttpHost: string;
|
|
23
|
+
mcpHttpPort: number;
|
|
24
|
+
mcpBaseUrl?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function configureRuntimeEnvironment(environment: EnvironmentConfig): void;
|
|
27
|
+
export declare function parseDatabaseList(value: string | undefined): string[];
|
|
28
|
+
export declare function parseSqlConnectionConfig(env?: Environment): SqlConnectionConfig;
|
|
29
|
+
export declare function parseEnvironmentConfig(env?: Environment): EnvironmentConfig;
|
|
2
30
|
export declare function getMaxRows(): number;
|
|
3
|
-
export declare function getQueryTimeoutMs(): number;
|
|
4
31
|
export declare function getDefaultSearchLimit(): number;
|
|
5
32
|
export declare function clampRowLimit(limit: unknown, fallback?: number): number;
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function getMcpHttpPort(): number;
|
|
8
|
-
export declare function getMcpHttpHost(): string;
|
|
9
|
-
export declare function getMcpBaseUrl(): string | undefined;
|
|
10
|
-
export declare function isDdlEnabled(): boolean;
|
|
33
|
+
export declare function getMcpEndpointUrl(environment: Pick<EnvironmentConfig, "mcpBaseUrl" | "mcpHttpHost" | "mcpHttpPort">): string;
|
|
11
34
|
export declare function getMaxWriteRows(): number;
|
|
12
|
-
export
|
|
35
|
+
export {};
|
|
13
36
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,KAAK,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAErC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB,EAAE,OAAO,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,iBAAiB,GAC7B,IAAI,CAKN;AAmHD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CASrE;AAED,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,WAAyB,GAC7B,mBAAmB,CAuBrB;AAED,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,WAAyB,GAC7B,iBAAiB,CAgDnB;AAeD,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAe,GAAG,MAAM,CAa7E;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,IAAI,CACf,iBAAiB,EACjB,YAAY,GAAG,aAAa,GAAG,aAAa,CAC7C,GACA,MAAM,CAKR;AAED,wBAAgB,eAAe,IAAI,MAAM,CASxC"}
|
package/dist/config.js
CHANGED
|
@@ -1,37 +1,158 @@
|
|
|
1
1
|
const DEFAULT_MAX_ROWS = 10000;
|
|
2
2
|
const DEFAULT_QUERY_TIMEOUT_MS = 30000;
|
|
3
3
|
const DEFAULT_SEARCH_LIMIT = 100;
|
|
4
|
+
const DEFAULT_CONNECTION_TIMEOUT_SECONDS = 30;
|
|
4
5
|
const DEFAULT_HTTP_PORT = 3333;
|
|
5
6
|
const DEFAULT_HTTP_HOST = "127.0.0.1";
|
|
6
7
|
const DEFAULT_MAX_WRITE_ROWS = 100;
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
let runtimeEnvironment;
|
|
9
|
+
export function configureRuntimeEnvironment(environment) {
|
|
10
|
+
runtimeEnvironment = {
|
|
11
|
+
...environment,
|
|
12
|
+
databases: [...environment.databases],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function parseInteger(name, value, fallback, minimum = 1, maximum) {
|
|
16
|
+
if (value === undefined || value.trim() === "") {
|
|
9
17
|
return fallback;
|
|
10
18
|
}
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
19
|
+
const range = maximum !== undefined
|
|
20
|
+
? `between ${minimum} and ${maximum}`
|
|
21
|
+
: `of at least ${minimum}`;
|
|
22
|
+
const normalized = value.trim();
|
|
23
|
+
if (!/^\d+$/.test(normalized)) {
|
|
24
|
+
throw new Error(`${name} must be a whole number ${range}.`);
|
|
25
|
+
}
|
|
26
|
+
const parsed = Number(normalized);
|
|
27
|
+
if (!Number.isSafeInteger(parsed) ||
|
|
28
|
+
parsed < minimum ||
|
|
29
|
+
(maximum !== undefined && parsed > maximum)) {
|
|
30
|
+
throw new Error(`${name} must be a whole number ${range}.`);
|
|
14
31
|
}
|
|
15
32
|
return parsed;
|
|
16
33
|
}
|
|
17
|
-
function
|
|
18
|
-
|
|
34
|
+
function parseRequiredString(name, value) {
|
|
35
|
+
const normalized = value?.trim();
|
|
36
|
+
if (!normalized) {
|
|
37
|
+
throw new Error(`${name} is required and must not be blank.`);
|
|
38
|
+
}
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
41
|
+
function parseBoolean(name, value, fallback) {
|
|
42
|
+
if ((value === undefined || value.trim() === "") && fallback !== undefined) {
|
|
19
43
|
return fallback;
|
|
20
44
|
}
|
|
21
|
-
const normalized = value
|
|
45
|
+
const normalized = value?.trim().toLowerCase();
|
|
22
46
|
if (normalized === "true") {
|
|
23
47
|
return true;
|
|
24
48
|
}
|
|
25
49
|
if (normalized === "false") {
|
|
26
50
|
return false;
|
|
27
51
|
}
|
|
28
|
-
|
|
52
|
+
const requirement = fallback === undefined ? "is required and must be" : "must be";
|
|
53
|
+
throw new Error(`${name} ${requirement} either "true" or "false".`);
|
|
29
54
|
}
|
|
30
|
-
|
|
31
|
-
|
|
55
|
+
function parseServerPort(value) {
|
|
56
|
+
if (value === undefined || value.trim() === "") {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const normalized = value.trim();
|
|
60
|
+
if (!/^\d+$/.test(normalized)) {
|
|
61
|
+
throw new Error("SERVER_PORT must be a valid TCP port between 1 and 65535.");
|
|
62
|
+
}
|
|
63
|
+
const port = Number(normalized);
|
|
64
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
65
|
+
throw new Error("SERVER_PORT must be a valid TCP port between 1 and 65535.");
|
|
66
|
+
}
|
|
67
|
+
return port;
|
|
68
|
+
}
|
|
69
|
+
function parseMcpBaseUrl(value) {
|
|
70
|
+
const normalized = value?.trim();
|
|
71
|
+
if (!normalized) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
let url;
|
|
75
|
+
try {
|
|
76
|
+
url = new URL(normalized);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw new Error("MCP_BASE_URL must be a valid absolute HTTP or HTTPS URL.");
|
|
80
|
+
}
|
|
81
|
+
if ((url.protocol !== "http:" && url.protocol !== "https:") ||
|
|
82
|
+
url.username ||
|
|
83
|
+
url.password ||
|
|
84
|
+
url.search ||
|
|
85
|
+
url.hash) {
|
|
86
|
+
throw new Error("MCP_BASE_URL must be a valid absolute HTTP or HTTPS URL.");
|
|
87
|
+
}
|
|
88
|
+
url.pathname = url.pathname.replace(/\/+$/, "");
|
|
89
|
+
return url.toString().replace(/\/$/, "");
|
|
90
|
+
}
|
|
91
|
+
export function parseDatabaseList(value) {
|
|
92
|
+
if (!value?.trim()) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
return value
|
|
96
|
+
.split(",")
|
|
97
|
+
.map((database) => database.trim())
|
|
98
|
+
.filter(Boolean);
|
|
99
|
+
}
|
|
100
|
+
export function parseSqlConnectionConfig(env = process.env) {
|
|
101
|
+
return {
|
|
102
|
+
serverName: env.SERVER_NAME?.trim() || "localhost",
|
|
103
|
+
serverPort: parseServerPort(env.SERVER_PORT),
|
|
104
|
+
dbUser: parseRequiredString("DB_USER", env.DB_USER),
|
|
105
|
+
dbPassword: parseRequiredString("DB_PASSWORD", env.DB_PASSWORD),
|
|
106
|
+
encrypt: parseBoolean("ENCRYPT", env.ENCRYPT, false),
|
|
107
|
+
trustServerCertificate: parseBoolean("TRUST_SERVER_CERTIFICATE", env.TRUST_SERVER_CERTIFICATE, true),
|
|
108
|
+
connectionTimeoutSeconds: parseInteger("CONNECTION_TIMEOUT", env.CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT_SECONDS),
|
|
109
|
+
queryTimeoutMs: parseInteger("QUERY_TIMEOUT_MS", env.QUERY_TIMEOUT_MS, DEFAULT_QUERY_TIMEOUT_MS),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function parseEnvironmentConfig(env = process.env) {
|
|
113
|
+
const explicitDefault = env.DATABASE_NAME?.trim();
|
|
114
|
+
const configuredDatabases = parseDatabaseList(env.DATABASES);
|
|
115
|
+
const databases = configuredDatabases.length > 0
|
|
116
|
+
? configuredDatabases
|
|
117
|
+
: explicitDefault
|
|
118
|
+
? [explicitDefault]
|
|
119
|
+
: [];
|
|
120
|
+
if (databases.length === 0) {
|
|
121
|
+
throw new Error("At least one of DATABASE_NAME or DATABASES is required and must contain a database name.");
|
|
122
|
+
}
|
|
123
|
+
const databaseName = explicitDefault && databases.includes(explicitDefault)
|
|
124
|
+
? explicitDefault
|
|
125
|
+
: databases[0];
|
|
126
|
+
return {
|
|
127
|
+
...parseSqlConnectionConfig(env),
|
|
128
|
+
databaseName,
|
|
129
|
+
databases,
|
|
130
|
+
readOnly: parseBoolean("READONLY", env.READONLY, false),
|
|
131
|
+
enableDdl: parseBoolean("ENABLE_DDL", env.ENABLE_DDL, false),
|
|
132
|
+
maxRows: parseInteger("MAX_ROWS", env.MAX_ROWS, DEFAULT_MAX_ROWS),
|
|
133
|
+
maxWriteRows: parseInteger("MAX_WRITE_ROWS", env.MAX_WRITE_ROWS, DEFAULT_MAX_WRITE_ROWS),
|
|
134
|
+
requireWritePreview: parseBoolean("REQUIRE_WRITE_PREVIEW", env.REQUIRE_WRITE_PREVIEW, true),
|
|
135
|
+
mcpTransport: parseMcpTransport(env.MCP_TRANSPORT),
|
|
136
|
+
mcpHttpHost: env.MCP_HTTP_HOST?.trim() || DEFAULT_HTTP_HOST,
|
|
137
|
+
mcpHttpPort: parseInteger("MCP_HTTP_PORT", env.MCP_HTTP_PORT, DEFAULT_HTTP_PORT, 1, 65535),
|
|
138
|
+
mcpBaseUrl: parseMcpBaseUrl(env.MCP_BASE_URL),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function parseMcpTransport(value) {
|
|
142
|
+
if (value === undefined || value.trim() === "") {
|
|
143
|
+
return "stdio";
|
|
144
|
+
}
|
|
145
|
+
const normalized = value.trim().toLowerCase();
|
|
146
|
+
if (normalized === "stdio" || normalized === "http") {
|
|
147
|
+
return normalized;
|
|
148
|
+
}
|
|
149
|
+
throw new Error('MCP_TRANSPORT must be either "stdio" or "http".');
|
|
32
150
|
}
|
|
33
|
-
export function
|
|
34
|
-
|
|
151
|
+
export function getMaxRows() {
|
|
152
|
+
if (runtimeEnvironment) {
|
|
153
|
+
return runtimeEnvironment.maxRows;
|
|
154
|
+
}
|
|
155
|
+
return parseInteger("MAX_ROWS", process.env.MAX_ROWS, DEFAULT_MAX_ROWS);
|
|
35
156
|
}
|
|
36
157
|
export function getDefaultSearchLimit() {
|
|
37
158
|
return Math.min(getMaxRows(), DEFAULT_SEARCH_LIMIT);
|
|
@@ -47,28 +168,15 @@ export function clampRowLimit(limit, fallback = getMaxRows()) {
|
|
|
47
168
|
}
|
|
48
169
|
return Math.min(Math.floor(parsed), getMaxRows());
|
|
49
170
|
}
|
|
50
|
-
export function
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
export function getMcpHttpPort() {
|
|
56
|
-
return parsePositiveInt(process.env.MCP_HTTP_PORT, DEFAULT_HTTP_PORT);
|
|
57
|
-
}
|
|
58
|
-
export function getMcpHttpHost() {
|
|
59
|
-
return process.env.MCP_HTTP_HOST?.trim() || DEFAULT_HTTP_HOST;
|
|
60
|
-
}
|
|
61
|
-
export function getMcpBaseUrl() {
|
|
62
|
-
const value = process.env.MCP_BASE_URL?.trim();
|
|
63
|
-
return value ? value : undefined;
|
|
64
|
-
}
|
|
65
|
-
export function isDdlEnabled() {
|
|
66
|
-
return parseBoolean(process.env.ENABLE_DDL, false);
|
|
171
|
+
export function getMcpEndpointUrl(environment) {
|
|
172
|
+
const baseUrl = environment.mcpBaseUrl ??
|
|
173
|
+
`http://${environment.mcpHttpHost}:${environment.mcpHttpPort}`;
|
|
174
|
+
return `${baseUrl.replace(/\/+$/, "")}/mcp`;
|
|
67
175
|
}
|
|
68
176
|
export function getMaxWriteRows() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return
|
|
177
|
+
if (runtimeEnvironment) {
|
|
178
|
+
return runtimeEnvironment.maxWriteRows;
|
|
179
|
+
}
|
|
180
|
+
return parseInteger("MAX_WRITE_ROWS", process.env.MAX_WRITE_ROWS, DEFAULT_MAX_WRITE_ROWS);
|
|
73
181
|
}
|
|
74
182
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,iBAAiB,GAAG,WAAW,CAAC;AACtC,MAAM,sBAAsB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import sql from "mssql";
|
|
2
|
+
import { type EnvironmentConfig, type SqlConnectionConfig } from "./config.js";
|
|
3
|
+
export declare function configureSqlConnection(config: SqlConnectionConfig): void;
|
|
4
|
+
export declare function configureDatabase(environment: EnvironmentConfig): void;
|
|
2
5
|
export declare function getDefaultDatabaseName(): string | null;
|
|
3
6
|
/**
|
|
4
7
|
* Returns the list of allowed database names.
|
|
@@ -10,6 +13,7 @@ export declare function getAllowedDatabases(): string[];
|
|
|
10
13
|
* Returns null if invalid.
|
|
11
14
|
*/
|
|
12
15
|
export declare function resolveDatabaseName(databaseName?: string): string | null;
|
|
16
|
+
export declare function buildSqlConfig(databaseName: string, environment: SqlConnectionConfig): sql.config;
|
|
13
17
|
/**
|
|
14
18
|
* Ensures a connection pool exists for the given database.
|
|
15
19
|
*/
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAEzB,MAAM,aAAa,CAAC;AAQrB,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAExE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAItE;AASD,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAgBtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAW9C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE;AAED,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,mBAAmB,GAC/B,GAAG,CAAC,MAAM,CAqBZ;AAsBD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAoB7B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnD;AAED,wBAAsB,mBAAmB,CACvC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBvD"}
|
package/dist/db.js
CHANGED
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import sql from "mssql";
|
|
2
|
-
import {
|
|
2
|
+
import { parseDatabaseList, } from "./config.js";
|
|
3
3
|
// Connection pools keyed by database name
|
|
4
4
|
const sqlPools = new Map();
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
let sqlConnectionConfig;
|
|
6
|
+
let configuredDefaultDatabase;
|
|
7
|
+
let configuredDatabases;
|
|
8
|
+
export function configureSqlConnection(config) {
|
|
9
|
+
sqlConnectionConfig = { ...config };
|
|
10
|
+
}
|
|
11
|
+
export function configureDatabase(environment) {
|
|
12
|
+
configureSqlConnection(environment);
|
|
13
|
+
configuredDefaultDatabase = environment.databaseName;
|
|
14
|
+
configuredDatabases = [...environment.databases];
|
|
15
|
+
}
|
|
16
|
+
function getSqlConnectionConfig() {
|
|
17
|
+
if (!sqlConnectionConfig) {
|
|
18
|
+
throw new Error("SQL connection configuration has not been initialized.");
|
|
8
19
|
}
|
|
9
|
-
return
|
|
10
|
-
.split(",")
|
|
11
|
-
.map((db) => db.trim())
|
|
12
|
-
.filter(Boolean);
|
|
20
|
+
return sqlConnectionConfig;
|
|
13
21
|
}
|
|
14
22
|
export function getDefaultDatabaseName() {
|
|
23
|
+
if (configuredDefaultDatabase) {
|
|
24
|
+
return configuredDefaultDatabase;
|
|
25
|
+
}
|
|
15
26
|
const allowedDatabases = parseDatabaseList(process.env.DATABASES);
|
|
16
27
|
const explicitDefault = process.env.DATABASE_NAME?.trim();
|
|
17
28
|
if (allowedDatabases.length === 0) {
|
|
@@ -27,6 +38,9 @@ export function getDefaultDatabaseName() {
|
|
|
27
38
|
* If DATABASES is set, returns those; otherwise returns only DATABASE_NAME.
|
|
28
39
|
*/
|
|
29
40
|
export function getAllowedDatabases() {
|
|
41
|
+
if (configuredDatabases) {
|
|
42
|
+
return [...configuredDatabases];
|
|
43
|
+
}
|
|
30
44
|
const allowedDatabases = parseDatabaseList(process.env.DATABASES);
|
|
31
45
|
if (allowedDatabases.length > 0) {
|
|
32
46
|
return allowedDatabases;
|
|
@@ -49,25 +63,25 @@ export function resolveDatabaseName(databaseName) {
|
|
|
49
63
|
return resolved;
|
|
50
64
|
return null;
|
|
51
65
|
}
|
|
52
|
-
function
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
? parseInt(process.env.CONNECTION_TIMEOUT, 10)
|
|
56
|
-
: 30;
|
|
57
|
-
return {
|
|
58
|
-
server: process.env.SERVER_NAME || "localhost",
|
|
66
|
+
export function buildSqlConfig(databaseName, environment) {
|
|
67
|
+
const config = {
|
|
68
|
+
server: environment.serverName,
|
|
59
69
|
database: databaseName,
|
|
60
|
-
user:
|
|
61
|
-
password:
|
|
62
|
-
requestTimeout:
|
|
70
|
+
user: environment.dbUser,
|
|
71
|
+
password: environment.dbPassword,
|
|
72
|
+
requestTimeout: environment.queryTimeoutMs,
|
|
63
73
|
options: {
|
|
64
|
-
encrypt:
|
|
65
|
-
trustServerCertificate: trustServerCertificate
|
|
74
|
+
encrypt: environment.encrypt,
|
|
75
|
+
trustServerCertificate: environment.trustServerCertificate,
|
|
66
76
|
enableArithAbort: true,
|
|
67
77
|
useUTC: false,
|
|
68
78
|
},
|
|
69
|
-
connectionTimeout:
|
|
79
|
+
connectionTimeout: environment.connectionTimeoutSeconds * 1000,
|
|
70
80
|
};
|
|
81
|
+
if (environment.serverPort !== undefined) {
|
|
82
|
+
config.port = environment.serverPort;
|
|
83
|
+
}
|
|
84
|
+
return config;
|
|
71
85
|
}
|
|
72
86
|
async function resolveConfiguredDatabase(databaseName) {
|
|
73
87
|
const resolved = resolveDatabaseName(databaseName);
|
|
@@ -100,7 +114,7 @@ export async function ensureSqlConnection(databaseName) {
|
|
|
100
114
|
}
|
|
101
115
|
sqlPools.delete(databaseName);
|
|
102
116
|
}
|
|
103
|
-
const config =
|
|
117
|
+
const config = buildSqlConfig(databaseName, getSqlConnectionConfig());
|
|
104
118
|
const pool = new sql.ConnectionPool(config);
|
|
105
119
|
await pool.connect();
|
|
106
120
|
sqlPools.set(databaseName, pool);
|
|
@@ -131,7 +145,7 @@ export async function getDedicatedSqlPool(databaseName) {
|
|
|
131
145
|
};
|
|
132
146
|
}
|
|
133
147
|
const config = {
|
|
134
|
-
...
|
|
148
|
+
...buildSqlConfig(resolved.databaseName, getSqlConnectionConfig()),
|
|
135
149
|
pool: {
|
|
136
150
|
max: 1,
|
|
137
151
|
min: 0,
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|