@databasin/mcp-client 0.2.0-beta.1 → 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 +30 -26
- 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/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.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/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/server.d.ts +3 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -6
- package/dist/server.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +3 -2
- package/dist/abort.d.ts +0 -5
- package/dist/abort.d.ts.map +0 -1
- package/dist/abort.js +0 -25
- package/dist/abort.js.map +0 -1
- package/dist/api-client.d.ts +0 -58
- package/dist/api-client.d.ts.map +0 -1
- package/dist/api-client.js +0 -151
- package/dist/api-client.js.map +0 -1
- package/dist/api-contract.d.ts +0 -59
- package/dist/api-contract.d.ts.map +0 -1
- package/dist/api-contract.js +0 -47
- package/dist/api-contract.js.map +0 -1
- package/dist/api-profile.d.ts +0 -5
- package/dist/api-profile.d.ts.map +0 -1
- package/dist/api-profile.js +0 -38
- package/dist/api-profile.js.map +0 -1
- package/dist/api-request.d.ts +0 -27
- package/dist/api-request.d.ts.map +0 -1
- package/dist/api-request.js +0 -147
- package/dist/api-request.js.map +0 -1
- package/dist/api-response.d.ts +0 -9
- package/dist/api-response.d.ts.map +0 -1
- package/dist/api-response.js +0 -206
- package/dist/api-response.js.map +0 -1
- package/dist/schemas.d.ts +0 -431
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -289
- package/dist/schemas.js.map +0 -1
- package/dist/tools.d.ts +0 -28
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -328
- package/dist/tools.js.map +0 -1
package/dist/api-request.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { abortableDelay, abortedRequest, throwIfAborted } from './abort.js';
|
|
2
|
-
import { resolveMcpEndpoint } from './api-contract.js';
|
|
3
|
-
import { errorCorrelationId, mapHttpError, parseRetryAfter, readJsonResponse, responseCorrelationId, validCorrelationId, withCorrelation } from './api-response.js';
|
|
4
|
-
import { DataBasinError } from './errors.js';
|
|
5
|
-
import { correlationId } from './safety.js';
|
|
6
|
-
export async function executeFacadeRequest(options, request) {
|
|
7
|
-
throwIfAborted(request.signal);
|
|
8
|
-
const accessToken = await acquireAccessToken(options.getAccessToken, request.signal);
|
|
9
|
-
throwIfAborted(request.signal);
|
|
10
|
-
const requestCorrelationId = correlationId();
|
|
11
|
-
const endpoint = resolveMcpEndpoint(request.endpoint, { runId: request.runId, queryId: request.queryId, query: request.query });
|
|
12
|
-
for (let attempt = 0;; attempt += 1) {
|
|
13
|
-
throwIfAborted(request.signal, requestCorrelationId);
|
|
14
|
-
const result = await fetchAttempt(options, request, endpoint, accessToken, requestCorrelationId);
|
|
15
|
-
const serverCorrelationId = responseCorrelationId(result.response);
|
|
16
|
-
if (result.response.ok) {
|
|
17
|
-
return parseSuccess(result, request.schema, serverCorrelationId, requestCorrelationId);
|
|
18
|
-
}
|
|
19
|
-
const effectiveId = serverCorrelationId ?? errorCorrelationId(result.payload) ?? requestCorrelationId;
|
|
20
|
-
const retryAfter = parseRetryAfter(result.response.headers.get('retry-after'), options.now());
|
|
21
|
-
if (!isRetryable(result.response.status, attempt, retryAfter)) {
|
|
22
|
-
throw mapHttpError(result.response.status, result.payload, effectiveId, retryAfter);
|
|
23
|
-
}
|
|
24
|
-
await waitForRetry(options, retryAfter, request.signal, effectiveId);
|
|
25
|
-
throwIfAborted(request.signal, effectiveId);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
export const defaultRetryDelay = abortableDelay;
|
|
29
|
-
async function acquireAccessToken(getAccessToken, signal) {
|
|
30
|
-
throwIfAborted(signal);
|
|
31
|
-
let pending;
|
|
32
|
-
try {
|
|
33
|
-
pending = getAccessToken();
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
throwIfAborted(signal);
|
|
37
|
-
throw error;
|
|
38
|
-
}
|
|
39
|
-
const accessToken = await settleWithAbort(pending, signal);
|
|
40
|
-
throwIfAborted(signal);
|
|
41
|
-
return accessToken;
|
|
42
|
-
}
|
|
43
|
-
async function settleWithAbort(pending, signal) {
|
|
44
|
-
if (!signal)
|
|
45
|
-
return pending;
|
|
46
|
-
throwIfAborted(signal);
|
|
47
|
-
return new Promise((resolve, reject) => {
|
|
48
|
-
const cleanup = () => signal.removeEventListener('abort', abort);
|
|
49
|
-
const abort = () => {
|
|
50
|
-
cleanup();
|
|
51
|
-
reject(abortedRequest());
|
|
52
|
-
};
|
|
53
|
-
signal.addEventListener('abort', abort, { once: true });
|
|
54
|
-
pending.then((value) => {
|
|
55
|
-
cleanup();
|
|
56
|
-
resolve(value);
|
|
57
|
-
}, (error) => {
|
|
58
|
-
cleanup();
|
|
59
|
-
reject(error);
|
|
60
|
-
});
|
|
61
|
-
if (signal.aborted)
|
|
62
|
-
abort();
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
async function fetchAttempt(options, request, endpoint, accessToken, requestCorrelationId) {
|
|
66
|
-
const controller = new AbortController();
|
|
67
|
-
let timedOut = false;
|
|
68
|
-
const timeout = setTimeout(() => {
|
|
69
|
-
timedOut = true;
|
|
70
|
-
controller.abort();
|
|
71
|
-
}, request.timeoutMs ?? options.timeoutMs);
|
|
72
|
-
const abortCaller = () => controller.abort();
|
|
73
|
-
request.signal?.addEventListener('abort', abortCaller, { once: true });
|
|
74
|
-
let response;
|
|
75
|
-
try {
|
|
76
|
-
throwIfAborted(request.signal, requestCorrelationId);
|
|
77
|
-
response = await (options.fetchImpl ?? globalThis.fetch)(`${options.baseUrl}${endpoint.path}`, requestInit(request, endpoint.method, accessToken, requestCorrelationId, controller.signal));
|
|
78
|
-
if (response.redirected)
|
|
79
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an unexpected redirect.');
|
|
80
|
-
return { response, payload: await readJsonResponse(response, options.maxResponseBytes, controller.signal) };
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
throw normalizeAttemptError(error, response, request.signal, timedOut, requestCorrelationId);
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
clearTimeout(timeout);
|
|
87
|
-
request.signal?.removeEventListener('abort', abortCaller);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
function requestInit(request, method, accessToken, requestCorrelationId, signal) {
|
|
91
|
-
return {
|
|
92
|
-
method,
|
|
93
|
-
signal,
|
|
94
|
-
redirect: 'error',
|
|
95
|
-
headers: {
|
|
96
|
-
accept: 'application/json',
|
|
97
|
-
// Caller headers are spread first so the reserved headers below always win.
|
|
98
|
-
...request.headers,
|
|
99
|
-
...(request.body === undefined ? {} : { 'content-type': 'application/json' }),
|
|
100
|
-
authorization: `Bearer ${accessToken}`,
|
|
101
|
-
'x-correlation-id': requestCorrelationId
|
|
102
|
-
},
|
|
103
|
-
...(request.body === undefined ? {} : { body: JSON.stringify(request.body) })
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
function normalizeAttemptError(error, response, callerSignal, timedOut, requestCorrelationId) {
|
|
107
|
-
const effectiveId = responseCorrelationIdIfPresent(response)
|
|
108
|
-
?? errorCorrelationIfPresent(error)
|
|
109
|
-
?? requestCorrelationId;
|
|
110
|
-
if (callerSignal?.aborted)
|
|
111
|
-
return abortedRequest(effectiveId);
|
|
112
|
-
if (timedOut)
|
|
113
|
-
return new DataBasinError('REQUEST_TIMEOUT', 'The DataBasin request timed out.', { correlationId: effectiveId });
|
|
114
|
-
if (error instanceof DataBasinError)
|
|
115
|
-
return withCorrelation(error, effectiveId);
|
|
116
|
-
return new DataBasinError('DEPENDENCY_UNAVAILABLE', 'The DataBasin API could not be reached.', { correlationId: effectiveId });
|
|
117
|
-
}
|
|
118
|
-
function parseSuccess(result, schema, serverCorrelationId, requestCorrelationId) {
|
|
119
|
-
if (!serverCorrelationId) {
|
|
120
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API omitted a valid correlation identifier.', { correlationId: requestCorrelationId });
|
|
121
|
-
}
|
|
122
|
-
const parsed = schema.safeParse(result.payload);
|
|
123
|
-
if (!parsed.success || parsed.data.correlationId !== serverCorrelationId) {
|
|
124
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an invalid success envelope.', { correlationId: serverCorrelationId });
|
|
125
|
-
}
|
|
126
|
-
return parsed.data;
|
|
127
|
-
}
|
|
128
|
-
async function waitForRetry(options, milliseconds, signal, correlation) {
|
|
129
|
-
try {
|
|
130
|
-
await options.sleepImpl(milliseconds, signal);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
if (signal?.aborted)
|
|
134
|
-
throw abortedRequest(correlation);
|
|
135
|
-
throw new DataBasinError('REQUEST_TIMEOUT', 'The DataBasin retry window expired.', { correlationId: correlation });
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
function isRetryable(status, attempt, retryAfter) {
|
|
139
|
-
return (status === 429 || status === 503) && attempt === 0 && retryAfter !== undefined;
|
|
140
|
-
}
|
|
141
|
-
function responseCorrelationIdIfPresent(response) {
|
|
142
|
-
return response === undefined ? undefined : responseCorrelationId(response);
|
|
143
|
-
}
|
|
144
|
-
function errorCorrelationIfPresent(error) {
|
|
145
|
-
return error instanceof DataBasinError ? validCorrelationId(error.details.correlationId) : undefined;
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=api-request.js.map
|
package/dist/api-request.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-request.js","sourceRoot":"","sources":["../src/api-request.ts"],"names":[],"mappings":"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"}
|
package/dist/api-response.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { DataBasinError } from './errors.js';
|
|
2
|
-
export { validCorrelationId } from './correlation.js';
|
|
3
|
-
export declare function readJsonResponse(response: Response, maxBytes: number, signal: AbortSignal): Promise<unknown>;
|
|
4
|
-
export declare function parseRetryAfter(value: string | null, nowMs: number, maximumMs?: number): number | undefined;
|
|
5
|
-
export declare function mapHttpError(status: number, payload: unknown, correlationId: string, retryAfterMs: number | undefined): DataBasinError;
|
|
6
|
-
export declare function responseCorrelationId(response: Response): string | undefined;
|
|
7
|
-
export declare function errorCorrelationId(payload: unknown): string | undefined;
|
|
8
|
-
export declare function withCorrelation(error: DataBasinError, correlationId: string): DataBasinError;
|
|
9
|
-
//# sourceMappingURL=api-response.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-response.d.ts","sourceRoot":"","sources":["../src/api-response.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA+C,MAAM,aAAa,CAAC;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,SAAQ,GAChB,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,cAAc,CAShB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAK5F"}
|
package/dist/api-response.js
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { validCorrelationId } from './correlation.js';
|
|
2
|
-
import { DataBasinError, LoginRequiredError } from './errors.js';
|
|
3
|
-
export { validCorrelationId } from './correlation.js';
|
|
4
|
-
export async function readJsonResponse(response, maxBytes, signal) {
|
|
5
|
-
assertJsonResponse(response, maxBytes);
|
|
6
|
-
const reader = response.body.getReader();
|
|
7
|
-
const chunks = await readBoundedChunks(reader, maxBytes, signal);
|
|
8
|
-
try {
|
|
9
|
-
return JSON.parse(new TextDecoder().decode(joinChunks(chunks)));
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned invalid JSON.');
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export function parseRetryAfter(value, nowMs, maximumMs = 5_000) {
|
|
16
|
-
if (value === null)
|
|
17
|
-
return undefined;
|
|
18
|
-
const trimmed = value.trim();
|
|
19
|
-
if (/^\d+$/u.test(trimmed))
|
|
20
|
-
return Math.min(Number(trimmed) * 1_000, maximumMs);
|
|
21
|
-
const date = Date.parse(trimmed);
|
|
22
|
-
if (!Number.isFinite(date))
|
|
23
|
-
return undefined;
|
|
24
|
-
return Math.min(Math.max(0, date - nowMs), maximumMs);
|
|
25
|
-
}
|
|
26
|
-
export function mapHttpError(status, payload, correlationId, retryAfterMs) {
|
|
27
|
-
const code = safeServerCode(payload) ?? statusCode(status);
|
|
28
|
-
if (status === 401)
|
|
29
|
-
return new LoginRequiredError('DataBasin', { correlationId });
|
|
30
|
-
const reason = code === 'POLICY_DENIED' ? safeReason(payload) : undefined;
|
|
31
|
-
return new DataBasinError(code, ERROR_MESSAGES[code], {
|
|
32
|
-
correlationId,
|
|
33
|
-
...(retryAfterMs === undefined ? {} : { retryAfterMs }),
|
|
34
|
-
...(reason === undefined ? {} : { reason })
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
export function responseCorrelationId(response) {
|
|
38
|
-
return validCorrelationId(response.headers.get('x-correlation-id'));
|
|
39
|
-
}
|
|
40
|
-
export function errorCorrelationId(payload) {
|
|
41
|
-
return validCorrelationId(asRecord(asRecord(payload).error).correlationId);
|
|
42
|
-
}
|
|
43
|
-
export function withCorrelation(error, correlationId) {
|
|
44
|
-
return new DataBasinError(error.code, error.message, {
|
|
45
|
-
...error.details,
|
|
46
|
-
correlationId
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
function assertJsonResponse(response, maxBytes) {
|
|
50
|
-
const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
|
|
51
|
-
if (!contentType.includes('application/json') && !contentType.includes('+json')) {
|
|
52
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned a non-JSON response.');
|
|
53
|
-
}
|
|
54
|
-
const contentLength = Number(response.headers.get('content-length'));
|
|
55
|
-
if (Number.isFinite(contentLength) && contentLength > maxBytes) {
|
|
56
|
-
throw new DataBasinError('POLICY_DENIED', 'The DataBasin API response exceeded the size limit.');
|
|
57
|
-
}
|
|
58
|
-
if (!response.body)
|
|
59
|
-
throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an empty response.');
|
|
60
|
-
}
|
|
61
|
-
async function readBoundedChunks(reader, maxBytes, signal) {
|
|
62
|
-
const chunks = [];
|
|
63
|
-
let total = 0;
|
|
64
|
-
while (true) {
|
|
65
|
-
const { done, value } = await readChunk(reader, signal);
|
|
66
|
-
if (done)
|
|
67
|
-
return chunks;
|
|
68
|
-
total += value.byteLength;
|
|
69
|
-
if (total > maxBytes) {
|
|
70
|
-
cancelReaderBestEffort(reader);
|
|
71
|
-
throw new DataBasinError('POLICY_DENIED', 'The DataBasin API response exceeded the size limit.');
|
|
72
|
-
}
|
|
73
|
-
chunks.push(value);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
async function readChunk(reader, signal) {
|
|
77
|
-
if (signal.aborted) {
|
|
78
|
-
cancelReaderBestEffort(reader);
|
|
79
|
-
throw new Error('aborted');
|
|
80
|
-
}
|
|
81
|
-
return new Promise((resolve, reject) => {
|
|
82
|
-
const abort = () => {
|
|
83
|
-
cancelReaderBestEffort(reader);
|
|
84
|
-
reject(new Error('aborted'));
|
|
85
|
-
};
|
|
86
|
-
signal.addEventListener('abort', abort, { once: true });
|
|
87
|
-
reader.read().then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
function joinChunks(chunks) {
|
|
91
|
-
const total = chunks.reduce((size, chunk) => size + chunk.byteLength, 0);
|
|
92
|
-
const bytes = new Uint8Array(total);
|
|
93
|
-
let offset = 0;
|
|
94
|
-
for (const chunk of chunks) {
|
|
95
|
-
bytes.set(chunk, offset);
|
|
96
|
-
offset += chunk.byteLength;
|
|
97
|
-
}
|
|
98
|
-
return bytes;
|
|
99
|
-
}
|
|
100
|
-
function cancelReaderBestEffort(reader) {
|
|
101
|
-
try {
|
|
102
|
-
void reader.cancel().catch(() => undefined);
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// Cleanup must never delay or replace the bounded failure.
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function statusCode(status) {
|
|
109
|
-
if (status === 401)
|
|
110
|
-
return 'UNAUTHENTICATED';
|
|
111
|
-
if (status === 403)
|
|
112
|
-
return 'POLICY_DENIED';
|
|
113
|
-
if (status === 404)
|
|
114
|
-
return 'NOT_FOUND';
|
|
115
|
-
if (status === 408 || status === 504)
|
|
116
|
-
return 'REQUEST_TIMEOUT';
|
|
117
|
-
if (status === 429)
|
|
118
|
-
return 'RATE_LIMITED';
|
|
119
|
-
if (status >= 500)
|
|
120
|
-
return 'DEPENDENCY_UNAVAILABLE';
|
|
121
|
-
return 'OPERATION_FAILED';
|
|
122
|
-
}
|
|
123
|
-
function safeServerCode(payload) {
|
|
124
|
-
const object = asRecord(payload);
|
|
125
|
-
const nested = asRecord(object.error);
|
|
126
|
-
const value = typeof object.code === 'string'
|
|
127
|
-
? object.code
|
|
128
|
-
: typeof nested.code === 'string' ? nested.code : undefined;
|
|
129
|
-
if (!value)
|
|
130
|
-
return undefined;
|
|
131
|
-
const normalized = value.toLowerCase();
|
|
132
|
-
return SERVER_CODE_ALIASES[normalized]
|
|
133
|
-
?? (KNOWN_CODES.has(value) ? value : undefined);
|
|
134
|
-
}
|
|
135
|
-
// Populated only when the facade's "reason" is an EXACT match against this
|
|
136
|
-
// client's own copy of the allowlist -- never trust the facade's message text
|
|
137
|
-
// otherwise, and never substring/prefix match. This is additive to (never a
|
|
138
|
-
// replacement for) the generic ERROR_MESSAGES text above.
|
|
139
|
-
function safeReason(payload) {
|
|
140
|
-
const object = asRecord(payload);
|
|
141
|
-
const nested = asRecord(object.error);
|
|
142
|
-
const value = typeof object.reason === 'string'
|
|
143
|
-
? object.reason
|
|
144
|
-
: typeof nested.reason === 'string' ? nested.reason : undefined;
|
|
145
|
-
return value !== undefined && POLICY_DENIED_REASONS.has(value) ? value : undefined;
|
|
146
|
-
}
|
|
147
|
-
function asRecord(value) {
|
|
148
|
-
return value && typeof value === 'object' && !Array.isArray(value)
|
|
149
|
-
? value
|
|
150
|
-
: {};
|
|
151
|
-
}
|
|
152
|
-
const SERVER_CODE_ALIASES = Object.freeze({
|
|
153
|
-
invalid_argument: 'INVALID_ARGUMENT',
|
|
154
|
-
invalid_request: 'INVALID_ARGUMENT',
|
|
155
|
-
unauthorized: 'UNAUTHENTICATED',
|
|
156
|
-
unauthenticated: 'UNAUTHENTICATED',
|
|
157
|
-
not_found: 'NOT_FOUND',
|
|
158
|
-
forbidden: 'POLICY_DENIED',
|
|
159
|
-
policy_denied: 'POLICY_DENIED',
|
|
160
|
-
rate_limited: 'RATE_LIMITED',
|
|
161
|
-
request_timeout: 'REQUEST_TIMEOUT',
|
|
162
|
-
dependency_unavailable: 'DEPENDENCY_UNAVAILABLE',
|
|
163
|
-
operation_failed: 'OPERATION_FAILED',
|
|
164
|
-
internal_error: 'INTERNAL_ERROR'
|
|
165
|
-
});
|
|
166
|
-
const ERROR_MESSAGES = Object.freeze({
|
|
167
|
-
INVALID_ARGUMENT: 'The DataBasin request was invalid.',
|
|
168
|
-
UNAUTHENTICATED: 'DataBasin login is required.',
|
|
169
|
-
NOT_FOUND: 'The requested DataBasin resource was not found.',
|
|
170
|
-
POLICY_DENIED: 'DataBasin denied access to this resource.',
|
|
171
|
-
RATE_LIMITED: 'DataBasin temporarily rate-limited this request.',
|
|
172
|
-
REQUEST_ABORTED: 'The DataBasin request was cancelled by the caller.',
|
|
173
|
-
REQUEST_TIMEOUT: 'The DataBasin request timed out.',
|
|
174
|
-
DEPENDENCY_UNAVAILABLE: 'The DataBasin API is temporarily unavailable.',
|
|
175
|
-
OPERATION_FAILED: 'The DataBasin API rejected the request.',
|
|
176
|
-
INTERNAL_ERROR: 'The DataBasin operation could not be completed.'
|
|
177
|
-
});
|
|
178
|
-
const KNOWN_CODES = new Set(Object.keys(ERROR_MESSAGES));
|
|
179
|
-
// Exact-match allowlist of upstream DataBasin API denial literals that are safe
|
|
180
|
-
// to surface verbatim. Sourced by reading (read-only) tpi-datalake-api's
|
|
181
|
-
// controllers reachable from the facade's EDGE_PATHS/WORKER_PATHS
|
|
182
|
-
// (/my/projects, /search, /databasin/catalogs|schemas|tables|columns,
|
|
183
|
-
// /connector, /my/organizations):
|
|
184
|
-
// - "You do not have access to this organization"
|
|
185
|
-
// ControllerApiBase.requireOrgAccess (app/controllers/ControllerApiBase.scala)
|
|
186
|
-
// and SearchController.search's own literal of the same text
|
|
187
|
-
// - "You are not authorized to perform this action"
|
|
188
|
-
// ControllerApiBase.unauthorizedMessage / processUnauthorized, reached via
|
|
189
|
-
// ProjectsController.getProjectsForUser, UniversalQueryController's
|
|
190
|
-
// withAuthorizedConnector, ConnectorsController.getConnector, and
|
|
191
|
-
// OrganizationsController.getOrganizationsForUser
|
|
192
|
-
// - "Invalid or missing authentication token"
|
|
193
|
-
// SearchController.search
|
|
194
|
-
// - "User not found"
|
|
195
|
-
// SearchController.search
|
|
196
|
-
// This is a second, independent copy of the facade's own allowlist (defense in
|
|
197
|
-
// depth) -- the facade's "reason" field is never trusted blindly, even though
|
|
198
|
-
// it is a first-party service. Do NOT add substring/regex matches here, and do
|
|
199
|
-
// not add a literal unless it is reachable from one of the paths above.
|
|
200
|
-
const POLICY_DENIED_REASONS = new Set([
|
|
201
|
-
'You do not have access to this organization',
|
|
202
|
-
'You are not authorized to perform this action',
|
|
203
|
-
'Invalid or missing authentication token',
|
|
204
|
-
'User not found'
|
|
205
|
-
]);
|
|
206
|
-
//# sourceMappingURL=api-response.js.map
|
package/dist/api-response.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-response.js","sourceRoot":"","sources":["../src/api-response.ts"],"names":[],"mappings":"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"}
|