@databasin/mcp-client 0.1.0 → 0.2.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 +132 -61
- package/dist/auth-schema.d.ts +23 -0
- package/dist/auth-schema.d.ts.map +1 -0
- package/dist/auth-schema.js +42 -0
- package/dist/auth-schema.js.map +1 -0
- package/dist/auth-tools.d.ts +10 -0
- package/dist/auth-tools.d.ts.map +1 -0
- package/dist/auth-tools.js +60 -0
- package/dist/auth-tools.js.map +1 -0
- package/dist/auth.d.ts +22 -11
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +71 -71
- package/dist/auth.js.map +1 -1
- package/dist/browser.d.ts +20 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +19 -17
- package/dist/browser.js.map +1 -1
- package/dist/cli.d.ts +31 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +148 -67
- package/dist/cli.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/correlation.d.ts +6 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +15 -0
- package/dist/correlation.js.map +1 -0
- package/dist/credential-store.d.ts +21 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +46 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/errors.d.ts +17 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +24 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/login-url.d.ts +18 -0
- package/dist/login-url.d.ts.map +1 -0
- package/dist/login-url.js +82 -0
- package/dist/login-url.js.map +1 -0
- package/dist/mcp-endpoint.d.ts +5 -0
- package/dist/mcp-endpoint.d.ts.map +1 -0
- package/dist/mcp-endpoint.js +22 -0
- package/dist/mcp-endpoint.js.map +1 -0
- package/dist/proxy-tools.d.ts +5 -0
- package/dist/proxy-tools.d.ts.map +1 -0
- package/dist/proxy-tools.js +39 -0
- package/dist/proxy-tools.js.map +1 -0
- package/dist/remote-mcp.d.ts +27 -0
- package/dist/remote-mcp.d.ts.map +1 -0
- package/dist/remote-mcp.js +70 -0
- package/dist/remote-mcp.js.map +1 -0
- package/dist/safety.d.ts +4 -0
- package/dist/safety.d.ts.map +1 -1
- package/dist/safety.js +94 -10
- package/dist/safety.js.map +1 -1
- package/dist/server.d.ts +4 -6
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +32 -15
- package/dist/server.js.map +1 -1
- package/dist/token-validation.d.ts +5 -0
- package/dist/token-validation.d.ts.map +1 -0
- package/dist/token-validation.js +183 -0
- package/dist/token-validation.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -7
- package/dist/api-client.d.ts +0 -43
- package/dist/api-client.d.ts.map +0 -1
- package/dist/api-client.js +0 -154
- package/dist/api-client.js.map +0 -1
- package/dist/mappers.d.ts +0 -56
- package/dist/mappers.d.ts.map +0 -1
- package/dist/mappers.js +0 -171
- package/dist/mappers.js.map +0 -1
- package/dist/schemas.d.ts +0 -154
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -102
- package/dist/schemas.js.map +0 -1
- package/dist/tools.d.ts +0 -17
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -117
- package/dist/tools.js.map +0 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { DataBasinError } from './errors.js';
|
|
2
|
+
const MAX_ACCESS_TOKEN_BYTES = 64 * 1024;
|
|
3
|
+
const MAX_JWT_PAYLOAD_BYTES = 32 * 1024;
|
|
4
|
+
const TOKEN_REJECTED_MESSAGE = 'Microsoft Entra returned an access token that did not match the configured DataBasin API.';
|
|
5
|
+
/**
|
|
6
|
+
* MSAL records the account's environment as whichever canonical alias Entra's
|
|
7
|
+
* instance-discovery metadata prefers — observed as login.windows.net in
|
|
8
|
+
* practice (2026-08-26), which the previous exact pin of
|
|
9
|
+
* login.microsoftonline.com rejected, invalidating every successful sign-in.
|
|
10
|
+
* These are the four first-party aliases from Entra's published instance
|
|
11
|
+
* metadata for the worldwide cloud; anything else is still rejected, and the
|
|
12
|
+
* token's issuer/audience/scope/tenant checks are unchanged.
|
|
13
|
+
*/
|
|
14
|
+
const ENTRA_ACCOUNT_ENVIRONMENTS = new Set([
|
|
15
|
+
'login.microsoftonline.com',
|
|
16
|
+
'login.windows.net',
|
|
17
|
+
'login.microsoft.com',
|
|
18
|
+
'sts.windows.net'
|
|
19
|
+
]);
|
|
20
|
+
export function accountMatchesProfile(account, profile) {
|
|
21
|
+
return sameTenant(account.tenantId, profile.tenantId)
|
|
22
|
+
&& ENTRA_ACCOUNT_ENVIRONMENTS.has(account.environment.toLowerCase());
|
|
23
|
+
}
|
|
24
|
+
export function validateAccessTokenResult(result, profile, nowMs) {
|
|
25
|
+
assertAuthenticationResult(result);
|
|
26
|
+
assertMsalMetadata(result, profile, nowMs);
|
|
27
|
+
const requirements = tokenRequirements(profile);
|
|
28
|
+
if (!hasRequiredMsalScope(result.scopes, requirements))
|
|
29
|
+
rejectToken();
|
|
30
|
+
const claims = decodeJwtPayload(result.accessToken);
|
|
31
|
+
assertTokenClaims(claims, profile, requirements, nowMs);
|
|
32
|
+
// This local payload check is defense-in-depth only. The DataBasin API remains
|
|
33
|
+
// responsible for cryptographic signature and authorization validation.
|
|
34
|
+
return result.accessToken;
|
|
35
|
+
}
|
|
36
|
+
function assertAuthenticationResult(result) {
|
|
37
|
+
if (!result)
|
|
38
|
+
rejectToken();
|
|
39
|
+
if (!result.accessToken)
|
|
40
|
+
rejectToken();
|
|
41
|
+
if (!result.account)
|
|
42
|
+
rejectToken();
|
|
43
|
+
}
|
|
44
|
+
function assertMsalMetadata(result, profile, nowMs) {
|
|
45
|
+
if (!Number.isFinite(nowMs))
|
|
46
|
+
rejectToken();
|
|
47
|
+
if (!accountMatchesProfile(result.account, profile))
|
|
48
|
+
rejectToken();
|
|
49
|
+
if (!sameTenant(result.tenantId, profile.tenantId))
|
|
50
|
+
rejectToken();
|
|
51
|
+
if (!matchesConfiguredAuthority(result.authority, profile.tenantId))
|
|
52
|
+
rejectToken();
|
|
53
|
+
if (result.tokenType.toLowerCase() !== 'bearer')
|
|
54
|
+
rejectToken();
|
|
55
|
+
if (!(result.expiresOn instanceof Date))
|
|
56
|
+
rejectToken();
|
|
57
|
+
const expiresOn = result.expiresOn.getTime();
|
|
58
|
+
if (!Number.isFinite(expiresOn) || expiresOn <= nowMs)
|
|
59
|
+
rejectToken();
|
|
60
|
+
}
|
|
61
|
+
function assertTokenClaims(claims, profile, requirements, nowMs) {
|
|
62
|
+
if (!sameTenant(stringClaim(claims, 'tid'), profile.tenantId))
|
|
63
|
+
rejectToken();
|
|
64
|
+
const issuer = stringClaim(claims, 'iss').toLowerCase();
|
|
65
|
+
if (!allowedIssuers(profile.tenantId).has(issuer))
|
|
66
|
+
rejectToken();
|
|
67
|
+
if (!matchesAudience(stringClaim(claims, 'aud'), requirements))
|
|
68
|
+
rejectToken();
|
|
69
|
+
if (!hasDelegatedScope(stringClaim(claims, 'scp'), requirements.delegatedScope))
|
|
70
|
+
rejectToken();
|
|
71
|
+
const nowSeconds = Math.floor(nowMs / 1_000);
|
|
72
|
+
if (numericDateClaim(claims, 'exp') <= nowSeconds)
|
|
73
|
+
rejectToken();
|
|
74
|
+
if (numericDateClaim(claims, 'nbf') > nowSeconds)
|
|
75
|
+
rejectToken();
|
|
76
|
+
}
|
|
77
|
+
function matchesAudience(audience, requirements) {
|
|
78
|
+
return audience === requirements.resourceUri || audience === requirements.resourceClientId;
|
|
79
|
+
}
|
|
80
|
+
function hasDelegatedScope(rawScopes, requiredScope) {
|
|
81
|
+
const expected = requiredScope.toLowerCase();
|
|
82
|
+
return rawScopes.split(/\s+/u).filter(Boolean).some((scope) => scope.toLowerCase() === expected);
|
|
83
|
+
}
|
|
84
|
+
function tokenRequirements(profile) {
|
|
85
|
+
if (profile.scopes.length !== 1)
|
|
86
|
+
rejectToken();
|
|
87
|
+
const configuredScope = profile.scopes[0];
|
|
88
|
+
const match = /^api:\/\/([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\/([A-Za-z0-9._-]{1,128})$/iu.exec(configuredScope);
|
|
89
|
+
if (!match)
|
|
90
|
+
rejectToken();
|
|
91
|
+
return {
|
|
92
|
+
resourceUri: `api://${match[1]}`,
|
|
93
|
+
resourceClientId: match[1],
|
|
94
|
+
configuredScope,
|
|
95
|
+
delegatedScope: match[2]
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function hasRequiredMsalScope(scopes, requirements) {
|
|
99
|
+
const accepted = new Set([
|
|
100
|
+
requirements.configuredScope.toLowerCase(),
|
|
101
|
+
requirements.delegatedScope.toLowerCase()
|
|
102
|
+
]);
|
|
103
|
+
return scopes.some((scope) => accepted.has(scope.trim().toLowerCase()));
|
|
104
|
+
}
|
|
105
|
+
function matchesConfiguredAuthority(raw, tenantId) {
|
|
106
|
+
try {
|
|
107
|
+
const authority = new URL(raw);
|
|
108
|
+
const expectedPath = `/${tenantId.toLowerCase()}`;
|
|
109
|
+
const path = authority.pathname.toLowerCase();
|
|
110
|
+
const safeOrigin = [
|
|
111
|
+
authority.protocol === 'https:',
|
|
112
|
+
ENTRA_ACCOUNT_ENVIRONMENTS.has(authority.hostname.toLowerCase()),
|
|
113
|
+
authority.port === '',
|
|
114
|
+
authority.username === '',
|
|
115
|
+
authority.password === '',
|
|
116
|
+
authority.search === '',
|
|
117
|
+
authority.hash === ''
|
|
118
|
+
].every(Boolean);
|
|
119
|
+
return safeOrigin && (path === expectedPath || path === `${expectedPath}/`);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function allowedIssuers(tenantId) {
|
|
126
|
+
const tenant = tenantId.toLowerCase();
|
|
127
|
+
return new Set([
|
|
128
|
+
`https://sts.windows.net/${tenant}/`,
|
|
129
|
+
`https://login.microsoftonline.com/${tenant}/v2.0`
|
|
130
|
+
]);
|
|
131
|
+
}
|
|
132
|
+
function decodeJwtPayload(accessToken) {
|
|
133
|
+
if (Buffer.byteLength(accessToken, 'utf8') > MAX_ACCESS_TOKEN_BYTES)
|
|
134
|
+
rejectToken();
|
|
135
|
+
const segments = accessToken.split('.');
|
|
136
|
+
if (segments.length !== 3)
|
|
137
|
+
rejectToken();
|
|
138
|
+
if (segments.some((segment) => !/^[A-Za-z0-9_-]+$/u.test(segment)))
|
|
139
|
+
rejectToken();
|
|
140
|
+
const payloadSegment = segments[1];
|
|
141
|
+
if (payloadSegment.length % 4 === 1)
|
|
142
|
+
rejectToken();
|
|
143
|
+
return parseJwtPayload(payloadSegment);
|
|
144
|
+
}
|
|
145
|
+
function parseJwtPayload(payloadSegment) {
|
|
146
|
+
try {
|
|
147
|
+
const bytes = Buffer.from(payloadSegment, 'base64url');
|
|
148
|
+
if (bytes.length > MAX_JWT_PAYLOAD_BYTES)
|
|
149
|
+
rejectToken();
|
|
150
|
+
if (bytes.toString('base64url') !== payloadSegment)
|
|
151
|
+
rejectToken();
|
|
152
|
+
const parsed = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
|
|
153
|
+
if (!parsed || typeof parsed !== 'object')
|
|
154
|
+
rejectToken();
|
|
155
|
+
if (Array.isArray(parsed))
|
|
156
|
+
rejectToken();
|
|
157
|
+
return parsed;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (error instanceof DataBasinError)
|
|
161
|
+
throw error;
|
|
162
|
+
rejectToken();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function stringClaim(claims, name) {
|
|
166
|
+
const value = claims[name];
|
|
167
|
+
if (typeof value !== 'string' || value.length === 0 || value.length > 2_048)
|
|
168
|
+
rejectToken();
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
function numericDateClaim(claims, name) {
|
|
172
|
+
const value = claims[name];
|
|
173
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)
|
|
174
|
+
rejectToken();
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
function sameTenant(actual, expected) {
|
|
178
|
+
return actual.toLowerCase() === expected.toLowerCase();
|
|
179
|
+
}
|
|
180
|
+
function rejectToken() {
|
|
181
|
+
throw new DataBasinError('UNAUTHENTICATED', TOKEN_REJECTED_MESSAGE);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=token-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-validation.js","sourceRoot":"","sources":["../src/token-validation.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.2.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = '0.
|
|
1
|
+
export const VERSION = '0.2.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@databasin/mcp-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Local stdio MCP server for DataBasin with Microsoft Entra sign-in.",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
6
8
|
"bin": {
|
|
7
9
|
"databasin-mcp": "dist/cli.js"
|
|
8
10
|
},
|
|
@@ -17,16 +19,19 @@
|
|
|
17
19
|
"README.md"
|
|
18
20
|
],
|
|
19
21
|
"engines": {
|
|
20
|
-
"node": "
|
|
22
|
+
"node": "^22.20.0 || ^24.0.0"
|
|
21
23
|
},
|
|
22
24
|
"scripts": {
|
|
23
25
|
"clean": "node scripts/clean.mjs",
|
|
24
26
|
"build": "npm run clean && tsc -p tsconfig.json",
|
|
25
27
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
26
|
-
"test": "vitest run",
|
|
28
|
+
"test": "vitest run --exclude tests/stdio.e2e.test.ts",
|
|
27
29
|
"test:stdio": "npm run build && vitest run tests/stdio.e2e.test.ts",
|
|
28
|
-
"verify": "npm run typecheck && npm
|
|
29
|
-
"
|
|
30
|
+
"verify": "npm run typecheck && npm test && npm run test:stdio",
|
|
31
|
+
"verify:package": "node scripts/verify-package.mjs",
|
|
32
|
+
"qualify:package": "node scripts/qualify-packed.mjs",
|
|
33
|
+
"qualify:np": "node scripts/qualify-packed-np.mjs",
|
|
34
|
+
"prepack": "npm run build"
|
|
30
35
|
},
|
|
31
36
|
"keywords": [
|
|
32
37
|
"databasin",
|
|
@@ -49,12 +54,12 @@
|
|
|
49
54
|
"dependencies": {
|
|
50
55
|
"@azure/msal-node": "5.5.0",
|
|
51
56
|
"@azure/msal-node-extensions": "5.3.5",
|
|
57
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
52
58
|
"@modelcontextprotocol/server": "2.0.0",
|
|
53
59
|
"zod": "4.2.0"
|
|
54
60
|
},
|
|
55
61
|
"devDependencies": {
|
|
56
|
-
"@
|
|
57
|
-
"@types/node": "22.19.7",
|
|
62
|
+
"@types/node": "24.13.3",
|
|
58
63
|
"typescript": "5.9.3",
|
|
59
64
|
"vitest": "4.1.10"
|
|
60
65
|
}
|
package/dist/api-client.d.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { DataBasinProfile } from './config.js';
|
|
2
|
-
import type { BrowseSchemaInput, SearchInput } from './schemas.js';
|
|
3
|
-
export interface DataBasinApi {
|
|
4
|
-
getProjects(signal?: AbortSignal): Promise<unknown>;
|
|
5
|
-
getAccessibleConnections(signal?: AbortSignal): Promise<unknown>;
|
|
6
|
-
search(input: SearchInput, signal?: AbortSignal): Promise<unknown>;
|
|
7
|
-
browseSchema(input: BrowseSchemaInput, signal?: AbortSignal): Promise<unknown>;
|
|
8
|
-
getOperation(operationId: string, options: {
|
|
9
|
-
offset: number;
|
|
10
|
-
limit: number;
|
|
11
|
-
}, signal?: AbortSignal): Promise<unknown>;
|
|
12
|
-
cancelOperation(operationId: string, signal?: AbortSignal): Promise<unknown>;
|
|
13
|
-
}
|
|
14
|
-
export interface DataBasinApiClientOptions {
|
|
15
|
-
baseUrl: string;
|
|
16
|
-
auth: {
|
|
17
|
-
profile: DataBasinProfile;
|
|
18
|
-
getAccessToken(): Promise<string>;
|
|
19
|
-
};
|
|
20
|
-
fetchImpl?: typeof fetch;
|
|
21
|
-
maxResponseBytes?: number;
|
|
22
|
-
timeoutMs?: number;
|
|
23
|
-
}
|
|
24
|
-
export declare class DataBasinApiClient implements DataBasinApi {
|
|
25
|
-
private readonly baseUrl;
|
|
26
|
-
private readonly auth;
|
|
27
|
-
private readonly fetchImpl;
|
|
28
|
-
private readonly maxResponseBytes;
|
|
29
|
-
private readonly timeoutMs;
|
|
30
|
-
constructor(options: DataBasinApiClientOptions);
|
|
31
|
-
getProjects(signal?: AbortSignal): Promise<unknown>;
|
|
32
|
-
getAccessibleConnections(signal?: AbortSignal): Promise<unknown>;
|
|
33
|
-
search(input: SearchInput, signal?: AbortSignal): Promise<unknown>;
|
|
34
|
-
browseSchema(input: BrowseSchemaInput, signal?: AbortSignal): Promise<unknown>;
|
|
35
|
-
getOperation(operationId: string, options: {
|
|
36
|
-
offset: number;
|
|
37
|
-
limit: number;
|
|
38
|
-
}, signal?: AbortSignal): Promise<unknown>;
|
|
39
|
-
cancelOperation(operationId: string, signal?: AbortSignal): Promise<unknown>;
|
|
40
|
-
private request;
|
|
41
|
-
}
|
|
42
|
-
export declare function normalizeApiBase(raw: string): string;
|
|
43
|
-
//# sourceMappingURL=api-client.d.ts.map
|
package/dist/api-client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKnE,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,wBAAwB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,OAAO,EAAE,gBAAgB,CAAC;QAC1B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,yBAAyB;IAQ9C,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,wBAAwB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlE,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxE,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3H,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;YAI9D,OAAO;CAoCtB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYpD"}
|
package/dist/api-client.js
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { DataBasinError, LoginRequiredError } from './errors.js';
|
|
2
|
-
export class DataBasinApiClient {
|
|
3
|
-
baseUrl;
|
|
4
|
-
auth;
|
|
5
|
-
fetchImpl;
|
|
6
|
-
maxResponseBytes;
|
|
7
|
-
timeoutMs;
|
|
8
|
-
constructor(options) {
|
|
9
|
-
this.baseUrl = normalizeApiBase(options.baseUrl);
|
|
10
|
-
this.auth = options.auth;
|
|
11
|
-
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
12
|
-
this.maxResponseBytes = options.maxResponseBytes ?? 5_000_000;
|
|
13
|
-
this.timeoutMs = options.timeoutMs ?? 30_000;
|
|
14
|
-
}
|
|
15
|
-
getProjects(signal) {
|
|
16
|
-
return this.request('GET', '/my/projects', undefined, signal);
|
|
17
|
-
}
|
|
18
|
-
getAccessibleConnections(signal) {
|
|
19
|
-
return this.request('GET', '/connections/accessible', undefined, signal);
|
|
20
|
-
}
|
|
21
|
-
search(input, signal) {
|
|
22
|
-
const params = new URLSearchParams({ q: input.q, limit: String(input.limit) });
|
|
23
|
-
if (input.projectId)
|
|
24
|
-
params.set('projectId', input.projectId);
|
|
25
|
-
if (input.organizationId !== undefined)
|
|
26
|
-
params.set('orgId', String(input.organizationId));
|
|
27
|
-
if (input.types?.length)
|
|
28
|
-
params.set('types', input.types.join(','));
|
|
29
|
-
return this.request('GET', `/search?${params.toString()}`, undefined, signal);
|
|
30
|
-
}
|
|
31
|
-
browseSchema(input, signal) {
|
|
32
|
-
const params = new URLSearchParams({ connectorId: String(input.connectorId) });
|
|
33
|
-
let path = '/databasin/catalogs';
|
|
34
|
-
if (input.level !== 'catalogs')
|
|
35
|
-
params.set('catalog', input.catalog);
|
|
36
|
-
if (input.level === 'schemas')
|
|
37
|
-
path = '/databasin/schemas';
|
|
38
|
-
if (input.level === 'tables' || input.level === 'columns') {
|
|
39
|
-
path = input.level === 'tables' ? '/databasin/tables' : '/databasin/columns';
|
|
40
|
-
params.set('schema', input.schema);
|
|
41
|
-
}
|
|
42
|
-
if (input.level === 'columns')
|
|
43
|
-
params.set('table', input.table);
|
|
44
|
-
return this.request('GET', `${path}?${params.toString()}`, undefined, signal);
|
|
45
|
-
}
|
|
46
|
-
async getOperation(operationId, options, signal) {
|
|
47
|
-
const encoded = encodeURIComponent(operationId);
|
|
48
|
-
const status = await this.request('GET', `/databasin/query/${encoded}/status`, undefined, signal, true);
|
|
49
|
-
const statusObject = asRecord(status);
|
|
50
|
-
if (String(statusObject.status ?? '').toLowerCase() !== 'completed')
|
|
51
|
-
return status;
|
|
52
|
-
const params = new URLSearchParams({ offset: String(options.offset), limit: String(options.limit) });
|
|
53
|
-
const results = await this.request('GET', `/databasin/query/${encoded}/results?${params.toString()}`, undefined, signal);
|
|
54
|
-
return { ...statusObject, ...asRecord(results) };
|
|
55
|
-
}
|
|
56
|
-
cancelOperation(operationId, signal) {
|
|
57
|
-
return this.request('POST', `/databasin/query/${encodeURIComponent(operationId)}/cancel`, undefined, signal);
|
|
58
|
-
}
|
|
59
|
-
async request(method, path, body, callerSignal, allowFailedOperation = false) {
|
|
60
|
-
const accessToken = await this.auth.getAccessToken();
|
|
61
|
-
const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
|
|
62
|
-
const signal = callerSignal ? AbortSignal.any([callerSignal, timeoutSignal]) : timeoutSignal;
|
|
63
|
-
let response;
|
|
64
|
-
try {
|
|
65
|
-
response = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
66
|
-
method,
|
|
67
|
-
signal,
|
|
68
|
-
redirect: 'error',
|
|
69
|
-
headers: {
|
|
70
|
-
accept: 'application/json',
|
|
71
|
-
authorization: `Bearer ${accessToken}`,
|
|
72
|
-
...(body === undefined ? {} : { 'content-type': 'application/json' })
|
|
73
|
-
},
|
|
74
|
-
...(body === undefined ? {} : { body: JSON.stringify(body) })
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
throw new DataBasinError('DEPENDENCY_UNAVAILABLE', 'The DataBasin API could not be reached.');
|
|
79
|
-
}
|
|
80
|
-
const payload = await readJson(response, this.maxResponseBytes);
|
|
81
|
-
if (response.ok)
|
|
82
|
-
return payload;
|
|
83
|
-
if (allowFailedOperation && response.status === 500 && isFailedOperation(payload))
|
|
84
|
-
return payload;
|
|
85
|
-
if (response.status === 401)
|
|
86
|
-
throw new LoginRequiredError(this.auth.profile.environment);
|
|
87
|
-
if (response.status === 403)
|
|
88
|
-
throw new DataBasinError('POLICY_DENIED', 'DataBasin denied access to this resource.');
|
|
89
|
-
if (response.status === 404)
|
|
90
|
-
throw new DataBasinError('NOT_FOUND', 'The requested DataBasin resource was not found.');
|
|
91
|
-
if (response.status >= 500)
|
|
92
|
-
throw new DataBasinError('DEPENDENCY_UNAVAILABLE', 'The DataBasin API is temporarily unavailable.');
|
|
93
|
-
throw new DataBasinError('OPERATION_FAILED', `The DataBasin API rejected the request with HTTP ${response.status}.`);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
export function normalizeApiBase(raw) {
|
|
97
|
-
const url = new URL(raw);
|
|
98
|
-
if (url.protocol !== 'https:') {
|
|
99
|
-
throw new Error('The DataBasin API URL must use HTTPS.');
|
|
100
|
-
}
|
|
101
|
-
url.search = '';
|
|
102
|
-
url.hash = '';
|
|
103
|
-
url.username = '';
|
|
104
|
-
url.password = '';
|
|
105
|
-
const path = url.pathname.replace(/\/+$/u, '');
|
|
106
|
-
url.pathname = path.endsWith('/api') ? path : `${path}/api`;
|
|
107
|
-
return url.toString().replace(/\/$/u, '');
|
|
108
|
-
}
|
|
109
|
-
async function readJson(response, maxBytes) {
|
|
110
|
-
const contentLength = Number(response.headers.get('content-length'));
|
|
111
|
-
if (Number.isFinite(contentLength) && contentLength > maxBytes) {
|
|
112
|
-
throw new DataBasinError('POLICY_DENIED', 'The DataBasin API response exceeded the size limit.');
|
|
113
|
-
}
|
|
114
|
-
if (!response.body)
|
|
115
|
-
return null;
|
|
116
|
-
const reader = response.body.getReader();
|
|
117
|
-
const chunks = [];
|
|
118
|
-
let total = 0;
|
|
119
|
-
while (true) {
|
|
120
|
-
const { done, value } = await reader.read();
|
|
121
|
-
if (done)
|
|
122
|
-
break;
|
|
123
|
-
total += value.byteLength;
|
|
124
|
-
if (total > maxBytes) {
|
|
125
|
-
await reader.cancel();
|
|
126
|
-
throw new DataBasinError('POLICY_DENIED', 'The DataBasin API response exceeded the size limit.');
|
|
127
|
-
}
|
|
128
|
-
chunks.push(value);
|
|
129
|
-
}
|
|
130
|
-
if (total === 0)
|
|
131
|
-
return null;
|
|
132
|
-
const bytes = new Uint8Array(total);
|
|
133
|
-
let offset = 0;
|
|
134
|
-
for (const chunk of chunks) {
|
|
135
|
-
bytes.set(chunk, offset);
|
|
136
|
-
offset += chunk.byteLength;
|
|
137
|
-
}
|
|
138
|
-
try {
|
|
139
|
-
return JSON.parse(new TextDecoder().decode(bytes));
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
if (response.ok)
|
|
143
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an invalid response.');
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
function asRecord(value) {
|
|
148
|
-
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
149
|
-
}
|
|
150
|
-
function isFailedOperation(value) {
|
|
151
|
-
const record = asRecord(value);
|
|
152
|
-
return record.status === 'failed' && typeof record.queryId === 'string' && record.queryId.length > 0;
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=api-client.js.map
|
package/dist/api-client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/mappers.d.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { type BrowseSchemaInput } from './schemas.js';
|
|
2
|
-
export declare function mapProjects(payload: unknown): Array<{
|
|
3
|
-
id: string;
|
|
4
|
-
name: string | null;
|
|
5
|
-
organizationId: string | null;
|
|
6
|
-
}>;
|
|
7
|
-
export declare function mapConnections(payload: unknown): Array<{
|
|
8
|
-
id: string | number;
|
|
9
|
-
}>;
|
|
10
|
-
export declare function mapSearch(payload: unknown, limit: number): {
|
|
11
|
-
items: {
|
|
12
|
-
id: string;
|
|
13
|
-
type: "unknown" | "pipeline" | "connector" | "automation";
|
|
14
|
-
name: string;
|
|
15
|
-
description: string | null;
|
|
16
|
-
projectId: string | null;
|
|
17
|
-
organizationId: string | null;
|
|
18
|
-
updatedAt: string | null;
|
|
19
|
-
}[];
|
|
20
|
-
truncated: boolean;
|
|
21
|
-
};
|
|
22
|
-
export declare function mapSchema(payload: unknown, input: BrowseSchemaInput): {
|
|
23
|
-
connectorId: number;
|
|
24
|
-
level: "catalogs" | "schemas" | "tables" | "columns";
|
|
25
|
-
items: {
|
|
26
|
-
name: string;
|
|
27
|
-
type: string | null;
|
|
28
|
-
comment: string | null;
|
|
29
|
-
}[];
|
|
30
|
-
truncated: boolean;
|
|
31
|
-
};
|
|
32
|
-
export declare function mapOperation(payload: unknown, requestedId: string, options: {
|
|
33
|
-
offset: number;
|
|
34
|
-
limit: number;
|
|
35
|
-
}): {
|
|
36
|
-
operationId: string;
|
|
37
|
-
status: "failed" | "unknown" | "queued" | "running" | "completed" | "cancelled";
|
|
38
|
-
engineType: string | null;
|
|
39
|
-
resultKind: string | null;
|
|
40
|
-
columns: {
|
|
41
|
-
name: string;
|
|
42
|
-
type: string | null;
|
|
43
|
-
}[];
|
|
44
|
-
rowCount: number | null;
|
|
45
|
-
rows: unknown[][];
|
|
46
|
-
offset: number;
|
|
47
|
-
limit: number;
|
|
48
|
-
hasMore: boolean | null;
|
|
49
|
-
truncated: boolean;
|
|
50
|
-
message: string | null;
|
|
51
|
-
};
|
|
52
|
-
export declare function mapCancel(payload: unknown, requestedId: string): {
|
|
53
|
-
operationId: string;
|
|
54
|
-
status: "failed" | "unknown" | "queued" | "running" | "completed" | "cancelled";
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=mappers.d.ts.map
|
package/dist/mappers.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../src/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAKtB,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAUvH;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,CAS/E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;EA+BxD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB;;;;;;;;;EAyBnE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;EAiC7G;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;;;EAU9D"}
|