@querypanel/node-sdk 1.0.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/dist/cjs/index.d.ts +63 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +108 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/index.d.ts +63 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +104 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface AskRequestBody {
|
|
2
|
+
question: string;
|
|
3
|
+
}
|
|
4
|
+
export interface AskOptions {
|
|
5
|
+
tenantId?: string;
|
|
6
|
+
userId?: string;
|
|
7
|
+
scopes?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface AskResponseBody {
|
|
10
|
+
vegaLiteSpec: string;
|
|
11
|
+
notes: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface TrainingExample {
|
|
14
|
+
question: string;
|
|
15
|
+
sql: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TrainRequestBody {
|
|
18
|
+
tenant_id: string;
|
|
19
|
+
ddl?: string;
|
|
20
|
+
examples?: TrainingExample[];
|
|
21
|
+
businessDoc?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TrainResponseBody {
|
|
24
|
+
message: string;
|
|
25
|
+
processed: {
|
|
26
|
+
ddl: number;
|
|
27
|
+
examples: number;
|
|
28
|
+
businessDoc: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface StatsResponseBody {
|
|
32
|
+
trainingData: Array<{
|
|
33
|
+
kind: string;
|
|
34
|
+
count: number;
|
|
35
|
+
last_updated: string | null;
|
|
36
|
+
}>;
|
|
37
|
+
total: number;
|
|
38
|
+
}
|
|
39
|
+
export interface StatsOptions {
|
|
40
|
+
tenantId?: string;
|
|
41
|
+
userId?: string;
|
|
42
|
+
scopes?: string[];
|
|
43
|
+
}
|
|
44
|
+
export declare class QueryPanelSdkAPI {
|
|
45
|
+
private readonly baseUrl;
|
|
46
|
+
private readonly token?;
|
|
47
|
+
private readonly privateKey?;
|
|
48
|
+
private readonly organizationId?;
|
|
49
|
+
private cachedPrivateKey?;
|
|
50
|
+
constructor(baseUrl: string, jwtTokenOrPrivateKey: string, organizationId?: string);
|
|
51
|
+
ask(body: AskRequestBody, options?: AskOptions, signal?: AbortSignal): Promise<AskResponseBody>;
|
|
52
|
+
train(body: TrainRequestBody, options?: {
|
|
53
|
+
userId?: string;
|
|
54
|
+
scopes?: string[];
|
|
55
|
+
}, signal?: AbortSignal): Promise<TrainResponseBody>;
|
|
56
|
+
stats(options?: StatsOptions, signal?: AbortSignal): Promise<StatsResponseBody>;
|
|
57
|
+
private get;
|
|
58
|
+
private post;
|
|
59
|
+
private generateJWT;
|
|
60
|
+
private headers;
|
|
61
|
+
private parseResponse;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAM;gBAEnB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAa5E,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjI,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAIvE,GAAG;YASH,IAAI;YAUJ,WAAW;YA+BX,OAAO;YAkBP,aAAa;CAc9B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryPanelSdkAPI = void 0;
|
|
4
|
+
const jose_1 = require("jose");
|
|
5
|
+
class QueryPanelSdkAPI {
|
|
6
|
+
constructor(baseUrl, jwtTokenOrPrivateKey, organizationId) {
|
|
7
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
8
|
+
if (organizationId) {
|
|
9
|
+
// New mode: generate JWTs
|
|
10
|
+
this.privateKey = jwtTokenOrPrivateKey;
|
|
11
|
+
this.organizationId = organizationId;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
// Legacy mode: use provided JWT
|
|
15
|
+
this.token = jwtTokenOrPrivateKey;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async ask(body, options, signal) {
|
|
19
|
+
return await this.post("/ask", body, options?.tenantId, options?.userId, options?.scopes, signal);
|
|
20
|
+
}
|
|
21
|
+
async train(body, options, signal) {
|
|
22
|
+
return await this.post("/train", body, body.tenant_id, options?.userId, options?.scopes, signal);
|
|
23
|
+
}
|
|
24
|
+
async stats(options, signal) {
|
|
25
|
+
return await this.get("/stats", options?.tenantId, options?.userId, options?.scopes, signal);
|
|
26
|
+
}
|
|
27
|
+
async get(path, tenantId, userId, scopes, signal) {
|
|
28
|
+
const res = await fetch(this.baseUrl + path, {
|
|
29
|
+
method: "GET",
|
|
30
|
+
headers: await this.headers(tenantId, userId, scopes),
|
|
31
|
+
signal,
|
|
32
|
+
});
|
|
33
|
+
return await this.parseResponse(res);
|
|
34
|
+
}
|
|
35
|
+
async post(path, body, tenantId, userId, scopes, signal) {
|
|
36
|
+
const res = await fetch(this.baseUrl + path, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: await this.headers(tenantId, userId, scopes),
|
|
39
|
+
body: JSON.stringify(body ?? {}),
|
|
40
|
+
signal,
|
|
41
|
+
});
|
|
42
|
+
return await this.parseResponse(res);
|
|
43
|
+
}
|
|
44
|
+
async generateJWT(tenantId, userId, scopes) {
|
|
45
|
+
if (!this.privateKey || !this.organizationId) {
|
|
46
|
+
throw new Error("Private key and organization ID are required for JWT generation");
|
|
47
|
+
}
|
|
48
|
+
// Cache the imported private key to avoid re-importing on every request
|
|
49
|
+
if (!this.cachedPrivateKey) {
|
|
50
|
+
this.cachedPrivateKey = await (0, jose_1.importPKCS8)(this.privateKey, 'RS256');
|
|
51
|
+
}
|
|
52
|
+
const payload = {
|
|
53
|
+
organizationId: this.organizationId,
|
|
54
|
+
};
|
|
55
|
+
if (tenantId) {
|
|
56
|
+
payload.tenantId = tenantId;
|
|
57
|
+
}
|
|
58
|
+
if (userId) {
|
|
59
|
+
payload.userId = userId;
|
|
60
|
+
}
|
|
61
|
+
if (scopes && scopes.length > 0) {
|
|
62
|
+
payload.scopes = scopes;
|
|
63
|
+
}
|
|
64
|
+
return await new jose_1.SignJWT(payload)
|
|
65
|
+
.setProtectedHeader({ alg: 'RS256' })
|
|
66
|
+
.setIssuedAt()
|
|
67
|
+
.setExpirationTime('1h')
|
|
68
|
+
.sign(this.cachedPrivateKey);
|
|
69
|
+
}
|
|
70
|
+
async headers(tenantId, userId, scopes) {
|
|
71
|
+
let authToken;
|
|
72
|
+
if (this.token) {
|
|
73
|
+
// Legacy mode: use provided JWT
|
|
74
|
+
authToken = this.token;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// New mode: generate JWT
|
|
78
|
+
authToken = await this.generateJWT(tenantId, userId, scopes);
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
"Authorization": `Bearer ${authToken}`,
|
|
82
|
+
"Content-Type": "application/json",
|
|
83
|
+
"Accept": "application/json",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async parseResponse(res) {
|
|
87
|
+
const text = await res.text();
|
|
88
|
+
let json = undefined;
|
|
89
|
+
try {
|
|
90
|
+
json = text ? JSON.parse(text) : undefined;
|
|
91
|
+
}
|
|
92
|
+
catch { }
|
|
93
|
+
if (!res.ok) {
|
|
94
|
+
const message = json?.error || res.statusText || "Request failed";
|
|
95
|
+
const err = new Error(message);
|
|
96
|
+
err.status = res.status;
|
|
97
|
+
if (json?.details)
|
|
98
|
+
err.details = json.details;
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
return json;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.QueryPanelSdkAPI = QueryPanelSdkAPI;
|
|
105
|
+
// Optional: polyfill fetch for Node < 18 if global fetch is not available
|
|
106
|
+
// Consumers on older Node can pass a fetch implementation by assigning globalThis.fetch
|
|
107
|
+
// Example: globalThis.fetch = (await import('node-fetch')).default as any;
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface AskRequestBody {
|
|
2
|
+
question: string;
|
|
3
|
+
}
|
|
4
|
+
export interface AskOptions {
|
|
5
|
+
tenantId?: string;
|
|
6
|
+
userId?: string;
|
|
7
|
+
scopes?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface AskResponseBody {
|
|
10
|
+
vegaLiteSpec: string;
|
|
11
|
+
notes: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface TrainingExample {
|
|
14
|
+
question: string;
|
|
15
|
+
sql: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TrainRequestBody {
|
|
18
|
+
tenant_id: string;
|
|
19
|
+
ddl?: string;
|
|
20
|
+
examples?: TrainingExample[];
|
|
21
|
+
businessDoc?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TrainResponseBody {
|
|
24
|
+
message: string;
|
|
25
|
+
processed: {
|
|
26
|
+
ddl: number;
|
|
27
|
+
examples: number;
|
|
28
|
+
businessDoc: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface StatsResponseBody {
|
|
32
|
+
trainingData: Array<{
|
|
33
|
+
kind: string;
|
|
34
|
+
count: number;
|
|
35
|
+
last_updated: string | null;
|
|
36
|
+
}>;
|
|
37
|
+
total: number;
|
|
38
|
+
}
|
|
39
|
+
export interface StatsOptions {
|
|
40
|
+
tenantId?: string;
|
|
41
|
+
userId?: string;
|
|
42
|
+
scopes?: string[];
|
|
43
|
+
}
|
|
44
|
+
export declare class QueryPanelSdkAPI {
|
|
45
|
+
private readonly baseUrl;
|
|
46
|
+
private readonly token?;
|
|
47
|
+
private readonly privateKey?;
|
|
48
|
+
private readonly organizationId?;
|
|
49
|
+
private cachedPrivateKey?;
|
|
50
|
+
constructor(baseUrl: string, jwtTokenOrPrivateKey: string, organizationId?: string);
|
|
51
|
+
ask(body: AskRequestBody, options?: AskOptions, signal?: AbortSignal): Promise<AskResponseBody>;
|
|
52
|
+
train(body: TrainRequestBody, options?: {
|
|
53
|
+
userId?: string;
|
|
54
|
+
scopes?: string[];
|
|
55
|
+
}, signal?: AbortSignal): Promise<TrainResponseBody>;
|
|
56
|
+
stats(options?: StatsOptions, signal?: AbortSignal): Promise<StatsResponseBody>;
|
|
57
|
+
private get;
|
|
58
|
+
private post;
|
|
59
|
+
private generateJWT;
|
|
60
|
+
private headers;
|
|
61
|
+
private parseResponse;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAM;gBAEnB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAa5E,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjI,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAIvE,GAAG;YASH,IAAI;YAUJ,WAAW;YA+BX,OAAO;YAkBP,aAAa;CAc9B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { SignJWT, importPKCS8 } from 'jose';
|
|
2
|
+
export class QueryPanelSdkAPI {
|
|
3
|
+
constructor(baseUrl, jwtTokenOrPrivateKey, organizationId) {
|
|
4
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
5
|
+
if (organizationId) {
|
|
6
|
+
// New mode: generate JWTs
|
|
7
|
+
this.privateKey = jwtTokenOrPrivateKey;
|
|
8
|
+
this.organizationId = organizationId;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
// Legacy mode: use provided JWT
|
|
12
|
+
this.token = jwtTokenOrPrivateKey;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async ask(body, options, signal) {
|
|
16
|
+
return await this.post("/ask", body, options?.tenantId, options?.userId, options?.scopes, signal);
|
|
17
|
+
}
|
|
18
|
+
async train(body, options, signal) {
|
|
19
|
+
return await this.post("/train", body, body.tenant_id, options?.userId, options?.scopes, signal);
|
|
20
|
+
}
|
|
21
|
+
async stats(options, signal) {
|
|
22
|
+
return await this.get("/stats", options?.tenantId, options?.userId, options?.scopes, signal);
|
|
23
|
+
}
|
|
24
|
+
async get(path, tenantId, userId, scopes, signal) {
|
|
25
|
+
const res = await fetch(this.baseUrl + path, {
|
|
26
|
+
method: "GET",
|
|
27
|
+
headers: await this.headers(tenantId, userId, scopes),
|
|
28
|
+
signal,
|
|
29
|
+
});
|
|
30
|
+
return await this.parseResponse(res);
|
|
31
|
+
}
|
|
32
|
+
async post(path, body, tenantId, userId, scopes, signal) {
|
|
33
|
+
const res = await fetch(this.baseUrl + path, {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: await this.headers(tenantId, userId, scopes),
|
|
36
|
+
body: JSON.stringify(body ?? {}),
|
|
37
|
+
signal,
|
|
38
|
+
});
|
|
39
|
+
return await this.parseResponse(res);
|
|
40
|
+
}
|
|
41
|
+
async generateJWT(tenantId, userId, scopes) {
|
|
42
|
+
if (!this.privateKey || !this.organizationId) {
|
|
43
|
+
throw new Error("Private key and organization ID are required for JWT generation");
|
|
44
|
+
}
|
|
45
|
+
// Cache the imported private key to avoid re-importing on every request
|
|
46
|
+
if (!this.cachedPrivateKey) {
|
|
47
|
+
this.cachedPrivateKey = await importPKCS8(this.privateKey, 'RS256');
|
|
48
|
+
}
|
|
49
|
+
const payload = {
|
|
50
|
+
organizationId: this.organizationId,
|
|
51
|
+
};
|
|
52
|
+
if (tenantId) {
|
|
53
|
+
payload.tenantId = tenantId;
|
|
54
|
+
}
|
|
55
|
+
if (userId) {
|
|
56
|
+
payload.userId = userId;
|
|
57
|
+
}
|
|
58
|
+
if (scopes && scopes.length > 0) {
|
|
59
|
+
payload.scopes = scopes;
|
|
60
|
+
}
|
|
61
|
+
return await new SignJWT(payload)
|
|
62
|
+
.setProtectedHeader({ alg: 'RS256' })
|
|
63
|
+
.setIssuedAt()
|
|
64
|
+
.setExpirationTime('1h')
|
|
65
|
+
.sign(this.cachedPrivateKey);
|
|
66
|
+
}
|
|
67
|
+
async headers(tenantId, userId, scopes) {
|
|
68
|
+
let authToken;
|
|
69
|
+
if (this.token) {
|
|
70
|
+
// Legacy mode: use provided JWT
|
|
71
|
+
authToken = this.token;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// New mode: generate JWT
|
|
75
|
+
authToken = await this.generateJWT(tenantId, userId, scopes);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
"Authorization": `Bearer ${authToken}`,
|
|
79
|
+
"Content-Type": "application/json",
|
|
80
|
+
"Accept": "application/json",
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async parseResponse(res) {
|
|
84
|
+
const text = await res.text();
|
|
85
|
+
let json = undefined;
|
|
86
|
+
try {
|
|
87
|
+
json = text ? JSON.parse(text) : undefined;
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
if (!res.ok) {
|
|
91
|
+
const message = json?.error || res.statusText || "Request failed";
|
|
92
|
+
const err = new Error(message);
|
|
93
|
+
err.status = res.status;
|
|
94
|
+
if (json?.details)
|
|
95
|
+
err.details = json.details;
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
return json;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Optional: polyfill fetch for Node < 18 if global fetch is not available
|
|
102
|
+
// Consumers on older Node can pass a fetch implementation by assigning globalThis.fetch
|
|
103
|
+
// Example: globalThis.fetch = (await import('node-fetch')).default as any;
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@querypanel/node-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/esm/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/esm/index.d.ts",
|
|
11
|
+
"import": "./dist/esm/index.js",
|
|
12
|
+
"require": "./dist/cjs/index.js",
|
|
13
|
+
"default": "./dist/esm/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18.0.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "npm run build:cjs && npm run build:esm && npm run build:package-json",
|
|
24
|
+
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
25
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
26
|
+
"build:package-json": "echo '{\"type\": \"commonjs\"}' > dist/cjs/package.json",
|
|
27
|
+
"build:watch": "tsc -p tsconfig.esm.json -w",
|
|
28
|
+
"prepublishOnly": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"jose": "^5.9.6"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"typescript": "^5.9.2"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|