assistant-cloud 0.1.10 → 0.1.12
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/AssistantCloud.d.ts +5 -5
- package/dist/AssistantCloud.d.ts.map +1 -1
- package/dist/AssistantCloud.js +15 -19
- package/dist/AssistantCloud.js.map +1 -1
- package/dist/AssistantCloudAPI.d.ts +1 -1
- package/dist/AssistantCloudAPI.d.ts.map +1 -1
- package/dist/AssistantCloudAPI.js +73 -82
- package/dist/AssistantCloudAPI.js.map +1 -1
- package/dist/AssistantCloudAuthStrategy.js +132 -132
- package/dist/AssistantCloudAuthStrategy.js.map +1 -1
- package/dist/AssistantCloudAuthTokens.d.ts +1 -1
- package/dist/AssistantCloudAuthTokens.d.ts.map +1 -1
- package/dist/AssistantCloudAuthTokens.js +9 -12
- package/dist/AssistantCloudAuthTokens.js.map +1 -1
- package/dist/AssistantCloudFiles.d.ts +1 -1
- package/dist/AssistantCloudFiles.d.ts.map +1 -1
- package/dist/AssistantCloudFiles.js +18 -24
- package/dist/AssistantCloudFiles.js.map +1 -1
- package/dist/AssistantCloudRuns.d.ts +1 -1
- package/dist/AssistantCloudRuns.d.ts.map +1 -1
- package/dist/AssistantCloudRuns.js +33 -35
- package/dist/AssistantCloudRuns.js.map +1 -1
- package/dist/AssistantCloudThreadMessages.d.ts +1 -1
- package/dist/AssistantCloudThreadMessages.d.ts.map +1 -1
- package/dist/AssistantCloudThreadMessages.js +12 -21
- package/dist/AssistantCloudThreadMessages.js.map +1 -1
- package/dist/AssistantCloudThreads.d.ts +2 -2
- package/dist/AssistantCloudThreads.d.ts.map +1 -1
- package/dist/AssistantCloudThreads.js +28 -31
- package/dist/AssistantCloudThreads.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/tests/setup.js +7 -2718
- package/dist/tests/setup.js.map +1 -1
- package/package.json +9 -8
package/dist/AssistantCloud.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { AssistantCloudConfig } from "./AssistantCloudAPI";
|
|
2
|
-
import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens";
|
|
3
|
-
import { AssistantCloudRuns } from "./AssistantCloudRuns";
|
|
4
|
-
import { AssistantCloudThreads } from "./AssistantCloudThreads";
|
|
5
|
-
import { AssistantCloudFiles } from "./AssistantCloudFiles";
|
|
1
|
+
import { AssistantCloudConfig } from "./AssistantCloudAPI.js";
|
|
2
|
+
import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens.js";
|
|
3
|
+
import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
|
|
4
|
+
import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
|
|
5
|
+
import { AssistantCloudFiles } from "./AssistantCloudFiles.js";
|
|
6
6
|
export declare class AssistantCloud {
|
|
7
7
|
readonly threads: AssistantCloudThreads;
|
|
8
8
|
readonly auth: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloud.d.ts","sourceRoot":"","sources":["../src/AssistantCloud.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,oBAAoB,EAAE
|
|
1
|
+
{"version":3,"file":"AssistantCloud.d.ts","sourceRoot":"","sources":["../src/AssistantCloud.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,oBAAoB,EAAE,+BAA4B;AAC9E,OAAO,EAAE,wBAAwB,EAAE,sCAAmC;AACtE,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,qBAAqB,EAAE,mCAAgC;AAChE,OAAO,EAAE,mBAAmB,EAAE,iCAA8B;AAE5D,qBAAa,cAAc;IACzB,SAAgB,OAAO,wBAAC;IACxB,SAAgB,IAAI;;MAAC;IACrB,SAAgB,IAAI,qBAAC;IACrB,SAAgB,KAAK,sBAAC;gBAEV,MAAM,EAAE,oBAAoB;CASzC"}
|
package/dist/AssistantCloud.js
CHANGED
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
// src/AssistantCloud.tsx
|
|
2
1
|
import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
|
|
3
2
|
import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens.js";
|
|
4
3
|
import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
|
|
5
4
|
import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
|
|
6
5
|
import { AssistantCloudFiles } from "./AssistantCloudFiles.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
export {
|
|
23
|
-
AssistantCloud
|
|
24
|
-
};
|
|
6
|
+
export class AssistantCloud {
|
|
7
|
+
threads;
|
|
8
|
+
auth;
|
|
9
|
+
runs;
|
|
10
|
+
files;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
const api = new AssistantCloudAPI(config);
|
|
13
|
+
this.threads = new AssistantCloudThreads(api);
|
|
14
|
+
this.auth = {
|
|
15
|
+
tokens: new AssistantCloudAuthTokens(api),
|
|
16
|
+
};
|
|
17
|
+
this.runs = new AssistantCloudRuns(api);
|
|
18
|
+
this.files = new AssistantCloudFiles(api);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
25
21
|
//# sourceMappingURL=AssistantCloud.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"AssistantCloud.js","sourceRoot":"","sources":["../src/AssistantCloud.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAwB,+BAA4B;AAC9E,OAAO,EAAE,wBAAwB,EAAE,sCAAmC;AACtE,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,qBAAqB,EAAE,mCAAgC;AAChE,OAAO,EAAE,mBAAmB,EAAE,iCAA8B;AAE5D,MAAM,OAAO,cAAc;IACT,OAAO,CAAC;IACR,IAAI,CAAC;IACL,IAAI,CAAC;IACL,KAAK,CAAC;IAEtB,YAAY,MAA4B;QACtC,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG;YACV,MAAM,EAAE,IAAI,wBAAwB,CAAC,GAAG,CAAC;SAC1C,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudAPI.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAPI.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAI3B,
|
|
1
|
+
{"version":3,"file":"AssistantCloudAPI.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAPI.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAI3B,wCAAqC;AAEtC,MAAM,MAAM,oBAAoB,GAC5B;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACzC,GACD;IACE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AASN,KAAK,kBAAkB,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC;IAC9D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF,qBAAa,iBAAiB;IACrB,KAAK,EAAE,0BAA0B,CAAC;IAClC,QAAQ,SAAC;gBAEJ,MAAM,EAAE,oBAAoB;IAqB3B,cAAc;IAId,cAAc,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB;IAiDrB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;CAI5E"}
|
|
@@ -1,87 +1,78 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from "./AssistantCloudAuthStrategy.js";
|
|
7
|
-
var CloudAPIError = class extends Error {
|
|
8
|
-
constructor(message) {
|
|
9
|
-
super(message);
|
|
10
|
-
this.name = "APIError";
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
var AssistantCloudAPI = class {
|
|
14
|
-
_auth;
|
|
15
|
-
_baseUrl;
|
|
16
|
-
constructor(config) {
|
|
17
|
-
if ("authToken" in config) {
|
|
18
|
-
this._baseUrl = config.baseUrl;
|
|
19
|
-
this._auth = new AssistantCloudJWTAuthStrategy(config.authToken);
|
|
20
|
-
} else if ("apiKey" in config) {
|
|
21
|
-
this._baseUrl = "https://backend.assistant-api.com";
|
|
22
|
-
this._auth = new AssistantCloudAPIKeyAuthStrategy(
|
|
23
|
-
config.apiKey,
|
|
24
|
-
config.userId,
|
|
25
|
-
config.workspaceId
|
|
26
|
-
);
|
|
27
|
-
} else if ("anonymous" in config) {
|
|
28
|
-
this._baseUrl = config.baseUrl;
|
|
29
|
-
this._auth = new AssistantCloudAnonymousAuthStrategy(config.baseUrl);
|
|
30
|
-
} else {
|
|
31
|
-
throw new Error(
|
|
32
|
-
"Invalid configuration: Must provide authToken, apiKey, or anonymous configuration"
|
|
33
|
-
);
|
|
1
|
+
import { AssistantCloudJWTAuthStrategy, AssistantCloudAPIKeyAuthStrategy, AssistantCloudAnonymousAuthStrategy, } from "./AssistantCloudAuthStrategy.js";
|
|
2
|
+
class CloudAPIError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "APIError";
|
|
34
6
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
...authHeaders,
|
|
44
|
-
...options.headers,
|
|
45
|
-
"Content-Type": "application/json"
|
|
46
|
-
};
|
|
47
|
-
const queryParams = new URLSearchParams();
|
|
48
|
-
if (options.query) {
|
|
49
|
-
for (const [key, value] of Object.entries(options.query)) {
|
|
50
|
-
if (value === false) continue;
|
|
51
|
-
if (value === true) {
|
|
52
|
-
queryParams.set(key, "true");
|
|
53
|
-
} else {
|
|
54
|
-
queryParams.set(key, value.toString());
|
|
7
|
+
}
|
|
8
|
+
export class AssistantCloudAPI {
|
|
9
|
+
_auth;
|
|
10
|
+
_baseUrl;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
if ("authToken" in config) {
|
|
13
|
+
this._baseUrl = config.baseUrl;
|
|
14
|
+
this._auth = new AssistantCloudJWTAuthStrategy(config.authToken);
|
|
55
15
|
}
|
|
56
|
-
|
|
16
|
+
else if ("apiKey" in config) {
|
|
17
|
+
this._baseUrl = "https://backend.assistant-api.com";
|
|
18
|
+
this._auth = new AssistantCloudAPIKeyAuthStrategy(config.apiKey, config.userId, config.workspaceId);
|
|
19
|
+
}
|
|
20
|
+
else if ("anonymous" in config) {
|
|
21
|
+
this._baseUrl = config.baseUrl;
|
|
22
|
+
this._auth = new AssistantCloudAnonymousAuthStrategy(config.baseUrl);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
throw new Error("Invalid configuration: Must provide authToken, apiKey, or anonymous configuration");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async initializeAuth() {
|
|
29
|
+
return !!this._auth.getAuthHeaders();
|
|
30
|
+
}
|
|
31
|
+
async makeRawRequest(endpoint, options = {}) {
|
|
32
|
+
const authHeaders = await this._auth.getAuthHeaders();
|
|
33
|
+
if (!authHeaders)
|
|
34
|
+
throw new Error("Authorization failed");
|
|
35
|
+
const headers = {
|
|
36
|
+
...authHeaders,
|
|
37
|
+
...options.headers,
|
|
38
|
+
"Content-Type": "application/json",
|
|
39
|
+
};
|
|
40
|
+
const queryParams = new URLSearchParams();
|
|
41
|
+
if (options.query) {
|
|
42
|
+
for (const [key, value] of Object.entries(options.query)) {
|
|
43
|
+
if (value === false)
|
|
44
|
+
continue;
|
|
45
|
+
if (value === true) {
|
|
46
|
+
queryParams.set(key, "true");
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
queryParams.set(key, value.toString());
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const url = new URL(`${this._baseUrl}/v1${endpoint}`);
|
|
54
|
+
url.search = queryParams.toString();
|
|
55
|
+
const response = await fetch(url, {
|
|
56
|
+
method: options.method ?? "GET",
|
|
57
|
+
headers,
|
|
58
|
+
body: options.body ? JSON.stringify(options.body) : null,
|
|
59
|
+
});
|
|
60
|
+
this._auth.readAuthHeaders(response.headers);
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
const text = await response.text();
|
|
63
|
+
try {
|
|
64
|
+
const body = JSON.parse(text);
|
|
65
|
+
throw new CloudAPIError(body.message);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new Error(`Request failed with status ${response.status}, ${text}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return response;
|
|
57
72
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
method: options.method ?? "GET",
|
|
62
|
-
headers,
|
|
63
|
-
body: options.body ? JSON.stringify(options.body) : null
|
|
64
|
-
});
|
|
65
|
-
this._auth.readAuthHeaders(response.headers);
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
const text = await response.text();
|
|
68
|
-
try {
|
|
69
|
-
const body = JSON.parse(text);
|
|
70
|
-
throw new CloudAPIError(body.message);
|
|
71
|
-
} catch {
|
|
72
|
-
throw new Error(
|
|
73
|
-
`Request failed with status ${response.status}, ${text}`
|
|
74
|
-
);
|
|
75
|
-
}
|
|
73
|
+
async makeRequest(endpoint, options = {}) {
|
|
74
|
+
const response = await this.makeRawRequest(endpoint, options);
|
|
75
|
+
return response.json();
|
|
76
76
|
}
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
async makeRequest(endpoint, options = {}) {
|
|
80
|
-
const response = await this.makeRawRequest(endpoint, options);
|
|
81
|
-
return response.json();
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
export {
|
|
85
|
-
AssistantCloudAPI
|
|
86
|
-
};
|
|
77
|
+
}
|
|
87
78
|
//# sourceMappingURL=AssistantCloudAPI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"AssistantCloudAPI.js","sourceRoot":"","sources":["../src/AssistantCloudAPI.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
const getJwtExpiry = (jwt) => {
|
|
2
|
+
try {
|
|
3
|
+
const parts = jwt.split(".");
|
|
4
|
+
const bodyPart = parts[1];
|
|
5
|
+
if (!bodyPart) {
|
|
6
|
+
throw new Error("Invalid JWT format");
|
|
7
|
+
}
|
|
8
|
+
// Convert from Base64Url to Base64 and add padding if necessary
|
|
9
|
+
let base64 = bodyPart.replace(/-/g, "+").replace(/_/g, "/");
|
|
10
|
+
while (base64.length % 4 !== 0) {
|
|
11
|
+
base64 += "=";
|
|
12
|
+
}
|
|
13
|
+
// Decode the Base64 string and parse the payload
|
|
14
|
+
const payload = atob(base64);
|
|
15
|
+
const payloadObj = JSON.parse(payload);
|
|
16
|
+
const exp = payloadObj.exp;
|
|
17
|
+
if (!exp || typeof exp !== "number") {
|
|
18
|
+
throw new Error('JWT does not contain a valid "exp" field');
|
|
19
|
+
}
|
|
20
|
+
// Convert expiration time to milliseconds
|
|
21
|
+
return exp * 1000;
|
|
12
22
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const exp = payloadObj.exp;
|
|
16
|
-
if (!exp || typeof exp !== "number") {
|
|
17
|
-
throw new Error('JWT does not contain a valid "exp" field');
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new Error(`Unable to determine the token expiry: ${error}`);
|
|
18
25
|
}
|
|
19
|
-
return exp * 1e3;
|
|
20
|
-
} catch (error) {
|
|
21
|
-
throw new Error(`Unable to determine the token expiry: ${error}`);
|
|
22
|
-
}
|
|
23
26
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
async getAuthHeaders() {
|
|
33
|
-
const currentTime = Date.now();
|
|
34
|
-
if (this.cachedToken && this.tokenExpiry && this.tokenExpiry - currentTime > 30 * 1e3) {
|
|
35
|
-
return { Authorization: `Bearer ${this.cachedToken}` };
|
|
27
|
+
export class AssistantCloudJWTAuthStrategy {
|
|
28
|
+
strategy = "jwt";
|
|
29
|
+
cachedToken = null;
|
|
30
|
+
tokenExpiry = null;
|
|
31
|
+
#authTokenCallback;
|
|
32
|
+
constructor(authTokenCallback) {
|
|
33
|
+
this.#authTokenCallback = authTokenCallback;
|
|
36
34
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
async getAuthHeaders() {
|
|
36
|
+
const currentTime = Date.now();
|
|
37
|
+
// Use cached token if it's valid for at least 30 more seconds
|
|
38
|
+
if (this.cachedToken &&
|
|
39
|
+
this.tokenExpiry &&
|
|
40
|
+
this.tokenExpiry - currentTime > 30 * 1000) {
|
|
41
|
+
return { Authorization: `Bearer ${this.cachedToken}` };
|
|
42
|
+
}
|
|
43
|
+
// Fetch a new token via the callback
|
|
44
|
+
const newToken = await this.#authTokenCallback();
|
|
45
|
+
if (!newToken)
|
|
46
|
+
return false;
|
|
47
|
+
this.cachedToken = newToken;
|
|
48
|
+
this.tokenExpiry = getJwtExpiry(newToken);
|
|
49
|
+
return { Authorization: `Bearer ${newToken}` };
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
#userId;
|
|
58
|
-
#workspaceId;
|
|
59
|
-
constructor(apiKey, userId, workspaceId) {
|
|
60
|
-
this.#apiKey = apiKey;
|
|
61
|
-
this.#userId = userId;
|
|
62
|
-
this.#workspaceId = workspaceId;
|
|
63
|
-
}
|
|
64
|
-
async getAuthHeaders() {
|
|
65
|
-
return {
|
|
66
|
-
Authorization: `Bearer ${this.#apiKey}`,
|
|
67
|
-
"Aui-User-Id": this.#userId,
|
|
68
|
-
"Aui-Workspace-Id": this.#workspaceId
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
readAuthHeaders() {
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
var AUI_REFRESH_TOKEN_NAME = "aui:refresh_token";
|
|
75
|
-
var AssistantCloudAnonymousAuthStrategy = class {
|
|
76
|
-
strategy = "anon";
|
|
77
|
-
baseUrl;
|
|
78
|
-
jwtStrategy;
|
|
79
|
-
constructor(baseUrl) {
|
|
80
|
-
this.baseUrl = baseUrl;
|
|
81
|
-
this.jwtStrategy = new AssistantCloudJWTAuthStrategy(async () => {
|
|
82
|
-
const currentTime = Date.now();
|
|
83
|
-
const storedRefreshTokenJson = localStorage.getItem(
|
|
84
|
-
AUI_REFRESH_TOKEN_NAME
|
|
85
|
-
);
|
|
86
|
-
const storedRefreshToken = storedRefreshTokenJson ? JSON.parse(storedRefreshTokenJson) : void 0;
|
|
87
|
-
if (storedRefreshToken) {
|
|
88
|
-
const refreshExpiry = new Date(storedRefreshToken.expires_at).getTime();
|
|
89
|
-
if (refreshExpiry - currentTime > 30 * 1e3) {
|
|
90
|
-
const response2 = await fetch(
|
|
91
|
-
`${this.baseUrl}/v1/auth/tokens/refresh`,
|
|
92
|
-
{
|
|
93
|
-
method: "POST",
|
|
94
|
-
headers: { "Content-Type": "application/json" },
|
|
95
|
-
body: JSON.stringify({ refresh_token: storedRefreshToken.token })
|
|
96
|
-
}
|
|
97
|
-
);
|
|
98
|
-
if (response2.ok) {
|
|
99
|
-
const data2 = await response2.json();
|
|
100
|
-
const { access_token: access_token2, refresh_token: refresh_token2 } = data2;
|
|
101
|
-
if (refresh_token2) {
|
|
102
|
-
localStorage.setItem(
|
|
103
|
-
AUI_REFRESH_TOKEN_NAME,
|
|
104
|
-
JSON.stringify(refresh_token2)
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
return access_token2;
|
|
108
|
-
}
|
|
109
|
-
} else {
|
|
110
|
-
localStorage.removeItem(AUI_REFRESH_TOKEN_NAME);
|
|
51
|
+
readAuthHeaders(headers) {
|
|
52
|
+
const authHeader = headers.get("Authorization");
|
|
53
|
+
if (!authHeader)
|
|
54
|
+
return;
|
|
55
|
+
const [scheme, token] = authHeader.split(" ");
|
|
56
|
+
if (scheme !== "Bearer" || !token) {
|
|
57
|
+
throw new Error("Invalid auth header received");
|
|
111
58
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
59
|
+
this.cachedToken = token;
|
|
60
|
+
this.tokenExpiry = getJwtExpiry(token);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class AssistantCloudAPIKeyAuthStrategy {
|
|
64
|
+
strategy = "api-key";
|
|
65
|
+
#apiKey;
|
|
66
|
+
#userId;
|
|
67
|
+
#workspaceId;
|
|
68
|
+
constructor(apiKey, userId, workspaceId) {
|
|
69
|
+
this.#apiKey = apiKey;
|
|
70
|
+
this.#userId = userId;
|
|
71
|
+
this.#workspaceId = workspaceId;
|
|
72
|
+
}
|
|
73
|
+
async getAuthHeaders() {
|
|
74
|
+
return {
|
|
75
|
+
Authorization: `Bearer ${this.#apiKey}`,
|
|
76
|
+
"Aui-User-Id": this.#userId,
|
|
77
|
+
"Aui-Workspace-Id": this.#workspaceId,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
readAuthHeaders() {
|
|
81
|
+
// No operation needed for API key auth
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const AUI_REFRESH_TOKEN_NAME = "aui:refresh_token";
|
|
85
|
+
export class AssistantCloudAnonymousAuthStrategy {
|
|
86
|
+
strategy = "anon";
|
|
87
|
+
baseUrl;
|
|
88
|
+
jwtStrategy;
|
|
89
|
+
constructor(baseUrl) {
|
|
90
|
+
this.baseUrl = baseUrl;
|
|
91
|
+
this.jwtStrategy = new AssistantCloudJWTAuthStrategy(async () => {
|
|
92
|
+
const currentTime = Date.now();
|
|
93
|
+
const storedRefreshTokenJson = localStorage.getItem(AUI_REFRESH_TOKEN_NAME);
|
|
94
|
+
const storedRefreshToken = storedRefreshTokenJson
|
|
95
|
+
? JSON.parse(storedRefreshTokenJson)
|
|
96
|
+
: undefined;
|
|
97
|
+
if (storedRefreshToken) {
|
|
98
|
+
const refreshExpiry = new Date(storedRefreshToken.expires_at).getTime();
|
|
99
|
+
if (refreshExpiry - currentTime > 30 * 1000) {
|
|
100
|
+
const response = await fetch(`${this.baseUrl}/v1/auth/tokens/refresh`, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: { "Content-Type": "application/json" },
|
|
103
|
+
body: JSON.stringify({ refresh_token: storedRefreshToken.token }),
|
|
104
|
+
});
|
|
105
|
+
if (response.ok) {
|
|
106
|
+
const data = await response.json();
|
|
107
|
+
const { access_token, refresh_token } = data;
|
|
108
|
+
if (refresh_token) {
|
|
109
|
+
localStorage.setItem(AUI_REFRESH_TOKEN_NAME, JSON.stringify(refresh_token));
|
|
110
|
+
}
|
|
111
|
+
return access_token;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
localStorage.removeItem(AUI_REFRESH_TOKEN_NAME);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// No valid refresh token; request a new anonymous token
|
|
119
|
+
const response = await fetch(`${this.baseUrl}/v1/auth/tokens/anonymous`, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
});
|
|
122
|
+
if (!response.ok)
|
|
123
|
+
return null;
|
|
124
|
+
const data = await response.json();
|
|
125
|
+
const { access_token, refresh_token } = data;
|
|
126
|
+
if (!access_token || !refresh_token)
|
|
127
|
+
return null;
|
|
128
|
+
localStorage.setItem(AUI_REFRESH_TOKEN_NAME, JSON.stringify(refresh_token));
|
|
129
|
+
return access_token;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async getAuthHeaders() {
|
|
133
|
+
return this.jwtStrategy.getAuthHeaders();
|
|
134
|
+
}
|
|
135
|
+
readAuthHeaders(headers) {
|
|
136
|
+
this.jwtStrategy.readAuthHeaders(headers);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
139
|
//# sourceMappingURL=AssistantCloudAuthStrategy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"AssistantCloudAuthStrategy.js","sourceRoot":"","sources":["../src/AssistantCloudAuthStrategy.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudAuthTokens.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAuthTokens.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE
|
|
1
|
+
{"version":3,"file":"AssistantCloudAuthTokens.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAuthTokens.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAExD,KAAK,sCAAsC,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,wBAAwB;IACvB,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAE/B,MAAM,IAAI,OAAO,CAAC,sCAAsC,CAAC;CAGvE"}
|