@casfa/client 0.2.0 → 0.3.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 +201 -0
- package/README.zh-CN.md +201 -0
- package/dist/api/claim.d.ts +21 -0
- package/dist/api/claim.d.ts.map +1 -0
- package/dist/api/delegates.d.ts +39 -0
- package/dist/api/delegates.d.ts.map +1 -0
- package/dist/api/depots.d.ts +68 -0
- package/dist/api/depots.d.ts.map +1 -0
- package/dist/api/filesystem.d.ts +55 -0
- package/dist/api/filesystem.d.ts.map +1 -0
- package/dist/api/index.d.ts +13 -3
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +355 -207
- package/dist/api/index.js.map +19 -1
- package/dist/api/info.d.ts +16 -0
- package/dist/api/info.d.ts.map +1 -0
- package/dist/api/nodes.d.ts +42 -0
- package/dist/api/nodes.d.ts.map +1 -0
- package/dist/api/oauth.d.ts +54 -0
- package/dist/api/oauth.d.ts.map +1 -0
- package/dist/api/requests.d.ts +33 -0
- package/dist/api/requests.d.ts.map +1 -0
- package/dist/api/tokens.d.ts +19 -0
- package/dist/api/tokens.d.ts.map +1 -0
- package/dist/client/delegates.d.ts +26 -0
- package/dist/client/delegates.d.ts.map +1 -0
- package/dist/client/depots.d.ts +28 -0
- package/dist/client/depots.d.ts.map +1 -0
- package/dist/client/filesystem.d.ts +39 -0
- package/dist/client/filesystem.d.ts.map +1 -0
- package/dist/client/helpers.d.ts +27 -0
- package/dist/client/helpers.d.ts.map +1 -0
- package/dist/client/index.d.ts +49 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/nodes.d.ts +30 -0
- package/dist/client/nodes.d.ts.map +1 -0
- package/dist/client/oauth.d.ts +24 -0
- package/dist/client/oauth.d.ts.map +1 -0
- package/dist/client/tokens.d.ts +23 -0
- package/dist/client/tokens.d.ts.map +1 -0
- package/dist/index.d.ts +14 -294
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +414 -515
- package/dist/index.js.map +32 -1
- package/dist/store/index.d.ts +8 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/jwt-refresh.d.ts +31 -0
- package/dist/store/jwt-refresh.d.ts.map +1 -0
- package/dist/store/token-checks.d.ts +33 -0
- package/dist/store/token-checks.d.ts.map +1 -0
- package/dist/store/token-selector.d.ts +29 -0
- package/dist/store/token-selector.d.ts.map +1 -0
- package/dist/store/token-store.d.ts +30 -0
- package/dist/store/token-store.d.ts.map +1 -0
- package/dist/types/client.d.ts +64 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -142
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -3
- package/dist/types/index.js.map +10 -1
- package/dist/types/tokens.d.ts +86 -0
- package/dist/types/tokens.d.ts.map +1 -0
- package/dist/utils/http.d.ts +32 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/package.json +7 -3
- package/dist/index-cPO-6GxE.d.ts +0 -338
package/dist/index.js
CHANGED
|
@@ -1,44 +1,57 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __export = (target, all) => {
|
|
3
3
|
for (var name in all)
|
|
4
|
-
__defProp(target, name, {
|
|
4
|
+
__defProp(target, name, {
|
|
5
|
+
get: all[name],
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
set: (newValue) => all[name] = () => newValue
|
|
9
|
+
});
|
|
5
10
|
};
|
|
6
11
|
|
|
7
12
|
// src/api/index.ts
|
|
8
|
-
var
|
|
9
|
-
__export(
|
|
10
|
-
|
|
11
|
-
commitDepot: () => commitDepot,
|
|
12
|
-
createAuthRequest: () => createAuthRequest,
|
|
13
|
-
createDepot: () => createDepot,
|
|
14
|
-
createTicket: () => createTicket,
|
|
15
|
-
createToken: () => createToken,
|
|
16
|
-
delegateToken: () => delegateToken,
|
|
17
|
-
deleteDepot: () => deleteDepot,
|
|
18
|
-
exchangeCode: () => exchangeCode,
|
|
19
|
-
fetchServiceInfo: () => fetchServiceInfo,
|
|
20
|
-
getAuthRequest: () => getAuthRequest,
|
|
21
|
-
getDepot: () => getDepot,
|
|
22
|
-
getMe: () => getMe,
|
|
23
|
-
getNode: () => getNode,
|
|
24
|
-
getNodeMetadata: () => getNodeMetadata,
|
|
25
|
-
getOAuthConfig: () => getOAuthConfig,
|
|
26
|
-
getTicket: () => getTicket,
|
|
27
|
-
getToken: () => getToken,
|
|
28
|
-
healthCheck: () => healthCheck,
|
|
29
|
-
listDepots: () => listDepots,
|
|
30
|
-
listTickets: () => listTickets,
|
|
31
|
-
listTokens: () => listTokens,
|
|
32
|
-
login: () => login,
|
|
33
|
-
pollAuthRequest: () => pollAuthRequest,
|
|
34
|
-
prepareNodes: () => prepareNodes,
|
|
35
|
-
putNode: () => putNode,
|
|
36
|
-
refresh: () => refresh,
|
|
37
|
-
rejectAuthRequest: () => rejectAuthRequest,
|
|
38
|
-
revokeToken: () => revokeToken,
|
|
39
|
-
submitTicket: () => submitTicket,
|
|
13
|
+
var exports_api = {};
|
|
14
|
+
__export(exports_api, {
|
|
15
|
+
updateDepot: () => updateDepot,
|
|
40
16
|
tokenResponseToStoredUserToken: () => tokenResponseToStoredUserToken,
|
|
41
|
-
|
|
17
|
+
revokeDelegate: () => revokeDelegate,
|
|
18
|
+
rejectAuthRequest: () => rejectAuthRequest,
|
|
19
|
+
refreshToken: () => refreshToken,
|
|
20
|
+
refresh: () => refresh,
|
|
21
|
+
putNode: () => putNode,
|
|
22
|
+
pollAuthRequest: () => pollAuthRequest,
|
|
23
|
+
login: () => login,
|
|
24
|
+
listDepots: () => listDepots,
|
|
25
|
+
listDelegates: () => listDelegates,
|
|
26
|
+
healthCheck: () => healthCheck,
|
|
27
|
+
getOAuthConfig: () => getOAuthConfig,
|
|
28
|
+
getNodeNavigated: () => getNodeNavigated,
|
|
29
|
+
getNodeMetadata: () => getNodeMetadata,
|
|
30
|
+
getNode: () => getNode,
|
|
31
|
+
getMe: () => getMe,
|
|
32
|
+
getDepot: () => getDepot,
|
|
33
|
+
getDelegate: () => getDelegate,
|
|
34
|
+
getAuthRequest: () => getAuthRequest,
|
|
35
|
+
fsWrite: () => fsWrite,
|
|
36
|
+
fsStat: () => fsStat,
|
|
37
|
+
fsRm: () => fsRm,
|
|
38
|
+
fsRewrite: () => fsRewrite,
|
|
39
|
+
fsRead: () => fsRead,
|
|
40
|
+
fsMv: () => fsMv,
|
|
41
|
+
fsMkdir: () => fsMkdir,
|
|
42
|
+
fsLs: () => fsLs,
|
|
43
|
+
fsCp: () => fsCp,
|
|
44
|
+
fetchServiceInfo: () => fetchServiceInfo,
|
|
45
|
+
exchangeCode: () => exchangeCode,
|
|
46
|
+
deleteDepot: () => deleteDepot,
|
|
47
|
+
createDepot: () => createDepot,
|
|
48
|
+
createDelegate: () => createDelegate,
|
|
49
|
+
createAuthRequest: () => createAuthRequest,
|
|
50
|
+
commitDepot: () => commitDepot,
|
|
51
|
+
claimNode: () => claimNode,
|
|
52
|
+
checkNodes: () => checkNodes,
|
|
53
|
+
batchClaimNodes: () => batchClaimNodes,
|
|
54
|
+
approveAuthRequest: () => approveAuthRequest
|
|
42
55
|
});
|
|
43
56
|
|
|
44
57
|
// src/utils/http.ts
|
|
@@ -64,18 +77,22 @@ var statusToErrorCode = (status) => {
|
|
|
64
77
|
var createErrorFromResponse = async (response) => {
|
|
65
78
|
const code = statusToErrorCode(response.status);
|
|
66
79
|
let message = response.statusText;
|
|
67
|
-
let details;
|
|
80
|
+
let details = null;
|
|
68
81
|
try {
|
|
69
82
|
const body = await response.json();
|
|
70
83
|
if (typeof body.message === "string") {
|
|
71
84
|
message = body.message;
|
|
72
|
-
}
|
|
73
|
-
if (typeof body.error === "string") {
|
|
85
|
+
} else if (typeof body.error === "string") {
|
|
74
86
|
message = body.error;
|
|
75
87
|
}
|
|
88
|
+
if (body.error && typeof body.error === "object" && "issues" in body.error) {
|
|
89
|
+
const issues = body.error.issues;
|
|
90
|
+
if (Array.isArray(issues) && issues.length > 0) {
|
|
91
|
+
message = issues.map((i) => i.path?.length ? `${i.path.join(".")}: ${i.message}` : i.message).join("; ");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
76
94
|
details = body;
|
|
77
|
-
} catch {
|
|
78
|
-
}
|
|
95
|
+
} catch {}
|
|
79
96
|
return { code, message, status: response.status, details };
|
|
80
97
|
};
|
|
81
98
|
var createNetworkError = (err) => ({
|
|
@@ -86,14 +103,14 @@ var createNetworkError = (err) => ({
|
|
|
86
103
|
var fetchApi = async (url, options = {}) => {
|
|
87
104
|
const { method = "GET", headers = {}, body, responseType = "json" } = options;
|
|
88
105
|
const requestHeaders = { ...headers };
|
|
89
|
-
if (body !==
|
|
106
|
+
if (body !== undefined && !requestHeaders["Content-Type"]) {
|
|
90
107
|
requestHeaders["Content-Type"] = "application/json";
|
|
91
108
|
}
|
|
92
109
|
try {
|
|
93
110
|
const response = await fetch(url, {
|
|
94
111
|
method,
|
|
95
112
|
headers: requestHeaders,
|
|
96
|
-
body: body !==
|
|
113
|
+
body: body !== undefined ? JSON.stringify(body) : undefined
|
|
97
114
|
});
|
|
98
115
|
if (!response.ok) {
|
|
99
116
|
const error = await createErrorFromResponse(response);
|
|
@@ -111,7 +128,7 @@ var fetchApi = async (url, options = {}) => {
|
|
|
111
128
|
data = await response.text();
|
|
112
129
|
break;
|
|
113
130
|
case "none":
|
|
114
|
-
data =
|
|
131
|
+
data = undefined;
|
|
115
132
|
break;
|
|
116
133
|
}
|
|
117
134
|
return { ok: true, data, status: response.status };
|
|
@@ -127,62 +144,212 @@ var fetchWithAuth = async (url, authHeader, options = {}) => {
|
|
|
127
144
|
return fetchApi(url, { ...options, headers });
|
|
128
145
|
};
|
|
129
146
|
|
|
147
|
+
// src/api/claim.ts
|
|
148
|
+
var claimNode = async (baseUrl, realm, accessTokenBase64, nodeKey, params) => {
|
|
149
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/${encodeURIComponent(nodeKey)}/claim`, `Bearer ${accessTokenBase64}`, {
|
|
150
|
+
method: "POST",
|
|
151
|
+
body: params
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
var batchClaimNodes = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
155
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/claim`, `Bearer ${accessTokenBase64}`, {
|
|
156
|
+
method: "POST",
|
|
157
|
+
body: params
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
// src/api/delegates.ts
|
|
161
|
+
var createDelegate = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
162
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/delegates`, `Bearer ${accessTokenBase64}`, {
|
|
163
|
+
method: "POST",
|
|
164
|
+
body: params
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
var listDelegates = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
168
|
+
const query = new URLSearchParams;
|
|
169
|
+
if (params?.limit)
|
|
170
|
+
query.set("limit", String(params.limit));
|
|
171
|
+
if (params?.cursor)
|
|
172
|
+
query.set("cursor", params.cursor);
|
|
173
|
+
if (params?.includeRevoked)
|
|
174
|
+
query.set("includeRevoked", "true");
|
|
175
|
+
const queryString = query.toString();
|
|
176
|
+
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/delegates${queryString ? `?${queryString}` : ""}`;
|
|
177
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`);
|
|
178
|
+
};
|
|
179
|
+
var getDelegate = async (baseUrl, realm, accessTokenBase64, delegateId) => {
|
|
180
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/delegates/${encodeURIComponent(delegateId)}`, `Bearer ${accessTokenBase64}`);
|
|
181
|
+
};
|
|
182
|
+
var revokeDelegate = async (baseUrl, realm, accessTokenBase64, delegateId) => {
|
|
183
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/delegates/${encodeURIComponent(delegateId)}/revoke`, `Bearer ${accessTokenBase64}`, {
|
|
184
|
+
method: "POST"
|
|
185
|
+
});
|
|
186
|
+
};
|
|
130
187
|
// src/api/depots.ts
|
|
131
188
|
var createDepot = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
132
|
-
return fetchWithAuth(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
method: "POST",
|
|
137
|
-
body: params
|
|
138
|
-
}
|
|
139
|
-
);
|
|
189
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots`, `Bearer ${accessTokenBase64}`, {
|
|
190
|
+
method: "POST",
|
|
191
|
+
body: params
|
|
192
|
+
});
|
|
140
193
|
};
|
|
141
194
|
var listDepots = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
142
|
-
const query = new URLSearchParams
|
|
143
|
-
if (params?.limit)
|
|
144
|
-
|
|
195
|
+
const query = new URLSearchParams;
|
|
196
|
+
if (params?.limit)
|
|
197
|
+
query.set("limit", String(params.limit));
|
|
198
|
+
if (params?.cursor)
|
|
199
|
+
query.set("cursor", params.cursor);
|
|
145
200
|
const queryString = query.toString();
|
|
146
201
|
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots${queryString ? `?${queryString}` : ""}`;
|
|
147
202
|
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`);
|
|
148
203
|
};
|
|
149
204
|
var getDepot = async (baseUrl, realm, accessTokenBase64, depotId) => {
|
|
150
|
-
return fetchWithAuth(
|
|
151
|
-
`${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}`,
|
|
152
|
-
`Bearer ${accessTokenBase64}`
|
|
153
|
-
);
|
|
205
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}`, `Bearer ${accessTokenBase64}`);
|
|
154
206
|
};
|
|
155
207
|
var updateDepot = async (baseUrl, realm, accessTokenBase64, depotId, params) => {
|
|
156
|
-
return fetchWithAuth(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
method: "PATCH",
|
|
161
|
-
body: params
|
|
162
|
-
}
|
|
163
|
-
);
|
|
208
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}`, `Bearer ${accessTokenBase64}`, {
|
|
209
|
+
method: "PATCH",
|
|
210
|
+
body: params
|
|
211
|
+
});
|
|
164
212
|
};
|
|
165
213
|
var deleteDepot = async (baseUrl, realm, accessTokenBase64, depotId) => {
|
|
166
|
-
return fetchWithAuth(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
method: "DELETE",
|
|
171
|
-
responseType: "none"
|
|
172
|
-
}
|
|
173
|
-
);
|
|
214
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}`, `Bearer ${accessTokenBase64}`, {
|
|
215
|
+
method: "DELETE",
|
|
216
|
+
responseType: "none"
|
|
217
|
+
});
|
|
174
218
|
};
|
|
175
219
|
var commitDepot = async (baseUrl, realm, accessTokenBase64, depotId, params) => {
|
|
176
|
-
return fetchWithAuth(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
220
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}/commit`, `Bearer ${accessTokenBase64}`, {
|
|
221
|
+
method: "POST",
|
|
222
|
+
body: params
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
// src/api/filesystem.ts
|
|
226
|
+
function buildFsUrl(baseUrl, realm, rootKey, op) {
|
|
227
|
+
return `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/fs/${encodeURIComponent(rootKey)}/${op}`;
|
|
228
|
+
}
|
|
229
|
+
var fsStat = async (baseUrl, realm, accessTokenBase64, rootKey, path) => {
|
|
230
|
+
const params = new URLSearchParams;
|
|
231
|
+
if (path)
|
|
232
|
+
params.set("path", path);
|
|
233
|
+
const qs = params.toString();
|
|
234
|
+
const url = `${buildFsUrl(baseUrl, realm, rootKey, "stat")}${qs ? `?${qs}` : ""}`;
|
|
235
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`);
|
|
236
|
+
};
|
|
237
|
+
var fsLs = async (baseUrl, realm, accessTokenBase64, rootKey, path, opts) => {
|
|
238
|
+
const params = new URLSearchParams;
|
|
239
|
+
if (path)
|
|
240
|
+
params.set("path", path);
|
|
241
|
+
if (opts?.limit)
|
|
242
|
+
params.set("limit", String(opts.limit));
|
|
243
|
+
if (opts?.cursor)
|
|
244
|
+
params.set("cursor", opts.cursor);
|
|
245
|
+
const qs = params.toString();
|
|
246
|
+
const url = `${buildFsUrl(baseUrl, realm, rootKey, "ls")}${qs ? `?${qs}` : ""}`;
|
|
247
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`);
|
|
248
|
+
};
|
|
249
|
+
var fsRead = async (baseUrl, realm, accessTokenBase64, rootKey, path) => {
|
|
250
|
+
const params = new URLSearchParams({ path });
|
|
251
|
+
const url = `${buildFsUrl(baseUrl, realm, rootKey, "read")}?${params}`;
|
|
252
|
+
try {
|
|
253
|
+
const response = await fetch(url, {
|
|
254
|
+
headers: { Authorization: `Bearer ${accessTokenBase64}` }
|
|
255
|
+
});
|
|
256
|
+
if (!response.ok) {
|
|
257
|
+
let message = response.statusText;
|
|
258
|
+
try {
|
|
259
|
+
const body = await response.json();
|
|
260
|
+
if (typeof body.message === "string")
|
|
261
|
+
message = body.message;
|
|
262
|
+
} catch {}
|
|
263
|
+
return {
|
|
264
|
+
ok: false,
|
|
265
|
+
error: { code: String(response.status), message, status: response.status }
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const blob = await response.blob();
|
|
269
|
+
return { ok: true, data: blob, status: response.status };
|
|
270
|
+
} catch (err) {
|
|
271
|
+
return {
|
|
272
|
+
ok: false,
|
|
273
|
+
error: {
|
|
274
|
+
code: "NETWORK_ERROR",
|
|
275
|
+
message: err instanceof Error ? err.message : "Network error"
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
var fsWrite = async (baseUrl, realm, accessTokenBase64, rootKey, path, data, contentType = "application/octet-stream") => {
|
|
281
|
+
const params = new URLSearchParams({ path });
|
|
282
|
+
const url = `${buildFsUrl(baseUrl, realm, rootKey, "write")}?${params}`;
|
|
283
|
+
const body = data instanceof Blob ? data : new Blob([data], { type: contentType });
|
|
284
|
+
try {
|
|
285
|
+
const response = await fetch(url, {
|
|
180
286
|
method: "POST",
|
|
181
|
-
|
|
287
|
+
headers: {
|
|
288
|
+
Authorization: `Bearer ${accessTokenBase64}`,
|
|
289
|
+
"Content-Type": contentType,
|
|
290
|
+
"Content-Length": String(body.size)
|
|
291
|
+
},
|
|
292
|
+
body
|
|
293
|
+
});
|
|
294
|
+
if (!response.ok) {
|
|
295
|
+
let message = response.statusText;
|
|
296
|
+
try {
|
|
297
|
+
const body2 = await response.json();
|
|
298
|
+
if (typeof body2.message === "string")
|
|
299
|
+
message = body2.message;
|
|
300
|
+
} catch {}
|
|
301
|
+
return {
|
|
302
|
+
ok: false,
|
|
303
|
+
error: { code: String(response.status), message, status: response.status }
|
|
304
|
+
};
|
|
182
305
|
}
|
|
183
|
-
|
|
306
|
+
const result = await response.json();
|
|
307
|
+
return { ok: true, data: result, status: response.status };
|
|
308
|
+
} catch (err) {
|
|
309
|
+
return {
|
|
310
|
+
ok: false,
|
|
311
|
+
error: {
|
|
312
|
+
code: "NETWORK_ERROR",
|
|
313
|
+
message: err instanceof Error ? err.message : "Network error"
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
var fsMkdir = async (baseUrl, realm, accessTokenBase64, rootKey, path) => {
|
|
319
|
+
const url = buildFsUrl(baseUrl, realm, rootKey, "mkdir");
|
|
320
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`, {
|
|
321
|
+
method: "POST",
|
|
322
|
+
body: { path }
|
|
323
|
+
});
|
|
324
|
+
};
|
|
325
|
+
var fsRm = async (baseUrl, realm, accessTokenBase64, rootKey, path) => {
|
|
326
|
+
const url = buildFsUrl(baseUrl, realm, rootKey, "rm");
|
|
327
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`, {
|
|
328
|
+
method: "POST",
|
|
329
|
+
body: { path }
|
|
330
|
+
});
|
|
331
|
+
};
|
|
332
|
+
var fsMv = async (baseUrl, realm, accessTokenBase64, rootKey, from, to) => {
|
|
333
|
+
const url = buildFsUrl(baseUrl, realm, rootKey, "mv");
|
|
334
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`, {
|
|
335
|
+
method: "POST",
|
|
336
|
+
body: { from, to }
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
var fsCp = async (baseUrl, realm, accessTokenBase64, rootKey, from, to) => {
|
|
340
|
+
const url = buildFsUrl(baseUrl, realm, rootKey, "cp");
|
|
341
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`, {
|
|
342
|
+
method: "POST",
|
|
343
|
+
body: { from, to }
|
|
344
|
+
});
|
|
345
|
+
};
|
|
346
|
+
var fsRewrite = async (baseUrl, realm, accessTokenBase64, rootKey, entries, deletes) => {
|
|
347
|
+
const url = buildFsUrl(baseUrl, realm, rootKey, "rewrite");
|
|
348
|
+
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`, {
|
|
349
|
+
method: "POST",
|
|
350
|
+
body: { entries, deletes }
|
|
351
|
+
});
|
|
184
352
|
};
|
|
185
|
-
|
|
186
353
|
// src/api/info.ts
|
|
187
354
|
var fetchServiceInfo = async (baseUrl) => {
|
|
188
355
|
return fetchApi(`${baseUrl}/api/info`);
|
|
@@ -190,17 +357,14 @@ var fetchServiceInfo = async (baseUrl) => {
|
|
|
190
357
|
var healthCheck = async (baseUrl) => {
|
|
191
358
|
return fetchApi(`${baseUrl}/api/health`);
|
|
192
359
|
};
|
|
193
|
-
|
|
194
360
|
// src/api/nodes.ts
|
|
195
|
-
var getNode = async (baseUrl, realm, accessTokenBase64, nodeKey
|
|
196
|
-
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/${encodeURIComponent(nodeKey)}`;
|
|
361
|
+
var getNode = async (baseUrl, realm, accessTokenBase64, nodeKey) => {
|
|
362
|
+
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/raw/${encodeURIComponent(nodeKey)}`;
|
|
197
363
|
try {
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
});
|
|
364
|
+
const headers = {
|
|
365
|
+
Authorization: `Bearer ${accessTokenBase64}`
|
|
366
|
+
};
|
|
367
|
+
const response = await fetch(url, { headers });
|
|
204
368
|
if (!response.ok) {
|
|
205
369
|
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
206
370
|
return {
|
|
@@ -224,29 +388,47 @@ var getNode = async (baseUrl, realm, accessTokenBase64, nodeKey, indexPath) => {
|
|
|
224
388
|
};
|
|
225
389
|
}
|
|
226
390
|
};
|
|
227
|
-
var
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
391
|
+
var getNodeNavigated = async (baseUrl, realm, accessTokenBase64, nodeKey, indexPath) => {
|
|
392
|
+
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/raw/${encodeURIComponent(nodeKey)}/${indexPath}`;
|
|
393
|
+
try {
|
|
394
|
+
const headers = {
|
|
395
|
+
Authorization: `Bearer ${accessTokenBase64}`
|
|
396
|
+
};
|
|
397
|
+
const response = await fetch(url, { headers });
|
|
398
|
+
if (!response.ok) {
|
|
399
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
400
|
+
return {
|
|
401
|
+
ok: false,
|
|
402
|
+
error: {
|
|
403
|
+
code: String(response.status),
|
|
404
|
+
message: error.message ?? response.statusText,
|
|
405
|
+
status: response.status
|
|
406
|
+
}
|
|
407
|
+
};
|
|
235
408
|
}
|
|
236
|
-
|
|
409
|
+
const data = new Uint8Array(await response.arrayBuffer());
|
|
410
|
+
return { ok: true, data, status: response.status };
|
|
411
|
+
} catch (err) {
|
|
412
|
+
return {
|
|
413
|
+
ok: false,
|
|
414
|
+
error: {
|
|
415
|
+
code: "NETWORK_ERROR",
|
|
416
|
+
message: err instanceof Error ? err.message : "Network error"
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
}
|
|
237
420
|
};
|
|
238
|
-
var
|
|
239
|
-
return fetchWithAuth(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
);
|
|
421
|
+
var getNodeMetadata = async (baseUrl, realm, accessTokenBase64, nodeKey) => {
|
|
422
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/metadata/${encodeURIComponent(nodeKey)}`, `Bearer ${accessTokenBase64}`);
|
|
423
|
+
};
|
|
424
|
+
var checkNodes = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
425
|
+
return fetchWithAuth(`${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/check`, `Bearer ${accessTokenBase64}`, {
|
|
426
|
+
method: "POST",
|
|
427
|
+
body: params
|
|
428
|
+
});
|
|
247
429
|
};
|
|
248
430
|
var putNode = async (baseUrl, realm, accessTokenBase64, nodeKey, content) => {
|
|
249
|
-
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/${encodeURIComponent(nodeKey)}`;
|
|
431
|
+
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/raw/${encodeURIComponent(nodeKey)}`;
|
|
250
432
|
try {
|
|
251
433
|
const response = await fetch(url, {
|
|
252
434
|
method: "PUT",
|
|
@@ -279,7 +461,6 @@ var putNode = async (baseUrl, realm, accessTokenBase64, nodeKey, content) => {
|
|
|
279
461
|
};
|
|
280
462
|
}
|
|
281
463
|
};
|
|
282
|
-
|
|
283
464
|
// src/api/oauth.ts
|
|
284
465
|
var getOAuthConfig = async (baseUrl) => {
|
|
285
466
|
return fetchApi(`${baseUrl}/api/oauth/config`);
|
|
@@ -306,12 +487,11 @@ var getMe = async (baseUrl, userAccessToken) => {
|
|
|
306
487
|
return fetchWithAuth(`${baseUrl}/api/oauth/me`, `Bearer ${userAccessToken}`);
|
|
307
488
|
};
|
|
308
489
|
var tokenResponseToStoredUserToken = (response, userId) => ({
|
|
309
|
-
accessToken: response.accessToken,
|
|
490
|
+
accessToken: response.idToken ?? response.accessToken,
|
|
310
491
|
refreshToken: response.refreshToken,
|
|
311
492
|
userId,
|
|
312
|
-
expiresAt: Date.now() + response.expiresIn *
|
|
493
|
+
expiresAt: Date.now() + response.expiresIn * 1000
|
|
313
494
|
});
|
|
314
|
-
|
|
315
495
|
// src/api/requests.ts
|
|
316
496
|
var createAuthRequest = async (baseUrl, params) => {
|
|
317
497
|
return fetchApi(`${baseUrl}/api/tokens/requests`, {
|
|
@@ -320,190 +500,55 @@ var createAuthRequest = async (baseUrl, params) => {
|
|
|
320
500
|
});
|
|
321
501
|
};
|
|
322
502
|
var pollAuthRequest = async (baseUrl, requestId) => {
|
|
323
|
-
return fetchApi(
|
|
324
|
-
`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}/poll`
|
|
325
|
-
);
|
|
503
|
+
return fetchApi(`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}/poll`);
|
|
326
504
|
};
|
|
327
505
|
var getAuthRequest = async (baseUrl, userAccessToken, requestId) => {
|
|
328
|
-
return fetchWithAuth(
|
|
329
|
-
`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}`,
|
|
330
|
-
`Bearer ${userAccessToken}`
|
|
331
|
-
);
|
|
506
|
+
return fetchWithAuth(`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}`, `Bearer ${userAccessToken}`);
|
|
332
507
|
};
|
|
333
508
|
var approveAuthRequest = async (baseUrl, userAccessToken, requestId, params) => {
|
|
334
|
-
return fetchWithAuth(
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
method: "POST",
|
|
339
|
-
body: params ?? {}
|
|
340
|
-
}
|
|
341
|
-
);
|
|
509
|
+
return fetchWithAuth(`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}/approve`, `Bearer ${userAccessToken}`, {
|
|
510
|
+
method: "POST",
|
|
511
|
+
body: params ?? {}
|
|
512
|
+
});
|
|
342
513
|
};
|
|
343
514
|
var rejectAuthRequest = async (baseUrl, userAccessToken, requestId, params) => {
|
|
344
|
-
return fetchWithAuth(
|
|
345
|
-
`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}/reject`,
|
|
346
|
-
`Bearer ${userAccessToken}`,
|
|
347
|
-
{
|
|
348
|
-
method: "POST",
|
|
349
|
-
body: params ?? {}
|
|
350
|
-
}
|
|
351
|
-
);
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
// src/api/tickets.ts
|
|
355
|
-
var createTicket = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
356
|
-
return fetchWithAuth(
|
|
357
|
-
`${baseUrl}/api/realm/${encodeURIComponent(realm)}/tickets`,
|
|
358
|
-
`Bearer ${accessTokenBase64}`,
|
|
359
|
-
{
|
|
360
|
-
method: "POST",
|
|
361
|
-
body: params
|
|
362
|
-
}
|
|
363
|
-
);
|
|
364
|
-
};
|
|
365
|
-
var listTickets = async (baseUrl, realm, accessTokenBase64, params) => {
|
|
366
|
-
const query = new URLSearchParams();
|
|
367
|
-
if (params?.limit) query.set("limit", String(params.limit));
|
|
368
|
-
if (params?.cursor) query.set("cursor", params.cursor);
|
|
369
|
-
if (params?.status) query.set("status", params.status);
|
|
370
|
-
const queryString = query.toString();
|
|
371
|
-
const url = `${baseUrl}/api/realm/${encodeURIComponent(realm)}/tickets${queryString ? `?${queryString}` : ""}`;
|
|
372
|
-
return fetchWithAuth(url, `Bearer ${accessTokenBase64}`);
|
|
373
|
-
};
|
|
374
|
-
var getTicket = async (baseUrl, realm, accessTokenBase64, ticketId) => {
|
|
375
|
-
return fetchWithAuth(
|
|
376
|
-
`${baseUrl}/api/realm/${encodeURIComponent(realm)}/tickets/${encodeURIComponent(ticketId)}`,
|
|
377
|
-
`Bearer ${accessTokenBase64}`
|
|
378
|
-
);
|
|
379
|
-
};
|
|
380
|
-
var submitTicket = async (baseUrl, realm, accessTokenBase64, ticketId, params) => {
|
|
381
|
-
return fetchWithAuth(
|
|
382
|
-
`${baseUrl}/api/realm/${encodeURIComponent(realm)}/tickets/${encodeURIComponent(ticketId)}/submit`,
|
|
383
|
-
`Bearer ${accessTokenBase64}`,
|
|
384
|
-
{
|
|
385
|
-
method: "POST",
|
|
386
|
-
body: params
|
|
387
|
-
}
|
|
388
|
-
);
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
// src/api/tokens.ts
|
|
392
|
-
var createToken = async (baseUrl, userAccessToken, params) => {
|
|
393
|
-
return fetchWithAuth(`${baseUrl}/api/tokens`, `Bearer ${userAccessToken}`, {
|
|
515
|
+
return fetchWithAuth(`${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}/reject`, `Bearer ${userAccessToken}`, {
|
|
394
516
|
method: "POST",
|
|
395
|
-
body: params
|
|
517
|
+
body: params ?? {}
|
|
396
518
|
});
|
|
397
519
|
};
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
const queryString = query.toString();
|
|
404
|
-
const url = `${baseUrl}/api/tokens${queryString ? `?${queryString}` : ""}`;
|
|
405
|
-
return fetchWithAuth(url, `Bearer ${userAccessToken}`);
|
|
406
|
-
};
|
|
407
|
-
var getToken = async (baseUrl, userAccessToken, tokenId) => {
|
|
408
|
-
return fetchWithAuth(
|
|
409
|
-
`${baseUrl}/api/tokens/${encodeURIComponent(tokenId)}`,
|
|
410
|
-
`Bearer ${userAccessToken}`
|
|
411
|
-
);
|
|
412
|
-
};
|
|
413
|
-
var revokeToken = async (baseUrl, userAccessToken, tokenId) => {
|
|
414
|
-
return fetchWithAuth(
|
|
415
|
-
`${baseUrl}/api/tokens/${encodeURIComponent(tokenId)}/revoke`,
|
|
416
|
-
`Bearer ${userAccessToken}`,
|
|
417
|
-
{ method: "POST" }
|
|
418
|
-
);
|
|
419
|
-
};
|
|
420
|
-
var delegateToken = async (baseUrl, delegateTokenBase64, params) => {
|
|
421
|
-
return fetchWithAuth(
|
|
422
|
-
`${baseUrl}/api/tokens/delegate`,
|
|
423
|
-
`Bearer ${delegateTokenBase64}`,
|
|
424
|
-
{
|
|
425
|
-
method: "POST",
|
|
426
|
-
body: params
|
|
427
|
-
}
|
|
428
|
-
);
|
|
520
|
+
// src/api/tokens.ts
|
|
521
|
+
var refreshToken = async (baseUrl, refreshTokenBase64) => {
|
|
522
|
+
return fetchWithAuth(`${baseUrl}/api/auth/refresh`, `Bearer ${refreshTokenBase64}`, {
|
|
523
|
+
method: "POST"
|
|
524
|
+
});
|
|
429
525
|
};
|
|
430
|
-
|
|
431
526
|
// src/store/token-checks.ts
|
|
432
|
-
var DEFAULT_EXPIRY_BUFFER_MS =
|
|
527
|
+
var DEFAULT_EXPIRY_BUFFER_MS = 60000;
|
|
433
528
|
var isTokenValid = (token, bufferMs = DEFAULT_EXPIRY_BUFFER_MS) => {
|
|
434
|
-
if (!token)
|
|
529
|
+
if (!token)
|
|
530
|
+
return false;
|
|
435
531
|
return Date.now() + bufferMs < token.expiresAt;
|
|
436
532
|
};
|
|
437
|
-
var isTokenExpiringSoon = (token, windowMs = 5 *
|
|
438
|
-
if (!token)
|
|
533
|
+
var isTokenExpiringSoon = (token, windowMs = 5 * 60000) => {
|
|
534
|
+
if (!token)
|
|
535
|
+
return false;
|
|
439
536
|
return Date.now() + windowMs >= token.expiresAt;
|
|
440
537
|
};
|
|
441
538
|
var isUserTokenValid = (userToken, bufferMs) => {
|
|
442
539
|
return isTokenValid(userToken, bufferMs);
|
|
443
540
|
};
|
|
444
|
-
var
|
|
445
|
-
return isTokenValid(delegateToken3, bufferMs);
|
|
446
|
-
};
|
|
447
|
-
var isAccessTokenValid = (accessToken, bufferMs) => {
|
|
541
|
+
var isStoredAccessTokenValid = (accessToken, bufferMs) => {
|
|
448
542
|
return isTokenValid(accessToken, bufferMs);
|
|
449
543
|
};
|
|
450
|
-
var getMaxIssuerId = (state) => {
|
|
451
|
-
if (state.user && isUserTokenValid(state.user)) {
|
|
452
|
-
return state.user.userId;
|
|
453
|
-
}
|
|
454
|
-
if (state.delegate && isDelegateTokenValid(state.delegate)) {
|
|
455
|
-
return state.delegate.tokenId;
|
|
456
|
-
}
|
|
457
|
-
return null;
|
|
458
|
-
};
|
|
459
|
-
var isAccessTokenFromMaxIssuer = (state) => {
|
|
460
|
-
const accessToken = state.access;
|
|
461
|
-
if (!accessToken || !isAccessTokenValid(accessToken)) {
|
|
462
|
-
return false;
|
|
463
|
-
}
|
|
464
|
-
const maxIssuerId = getMaxIssuerId(state);
|
|
465
|
-
if (!maxIssuerId) {
|
|
466
|
-
return true;
|
|
467
|
-
}
|
|
468
|
-
return accessToken.issuerId === maxIssuerId;
|
|
469
|
-
};
|
|
470
|
-
var isDelegateTokenFromCurrentUser = (state) => {
|
|
471
|
-
const delegateToken3 = state.delegate;
|
|
472
|
-
const userToken = state.user;
|
|
473
|
-
if (!delegateToken3 || !isDelegateTokenValid(delegateToken3)) {
|
|
474
|
-
return false;
|
|
475
|
-
}
|
|
476
|
-
if (!userToken || !isUserTokenValid(userToken)) {
|
|
477
|
-
return true;
|
|
478
|
-
}
|
|
479
|
-
return delegateToken3.issuerId === userToken.userId;
|
|
480
|
-
};
|
|
481
|
-
var shouldReissueAccessToken = (state) => {
|
|
482
|
-
if (!isAccessTokenValid(state.access)) {
|
|
483
|
-
return true;
|
|
484
|
-
}
|
|
485
|
-
if (!isAccessTokenFromMaxIssuer(state)) {
|
|
486
|
-
return true;
|
|
487
|
-
}
|
|
488
|
-
return false;
|
|
489
|
-
};
|
|
490
|
-
var shouldReissueDelegateToken = (state) => {
|
|
491
|
-
if (!isDelegateTokenValid(state.delegate)) {
|
|
492
|
-
return true;
|
|
493
|
-
}
|
|
494
|
-
if (state.user && !isDelegateTokenFromCurrentUser(state)) {
|
|
495
|
-
return true;
|
|
496
|
-
}
|
|
497
|
-
return false;
|
|
498
|
-
};
|
|
499
544
|
|
|
500
545
|
// src/store/jwt-refresh.ts
|
|
501
|
-
var callRefreshApi = async (baseUrl,
|
|
546
|
+
var callRefreshApi = async (baseUrl, refreshToken2) => {
|
|
502
547
|
try {
|
|
503
548
|
const response = await fetch(`${baseUrl}/api/oauth/refresh`, {
|
|
504
549
|
method: "POST",
|
|
505
550
|
headers: { "Content-Type": "application/json" },
|
|
506
|
-
body: JSON.stringify({ refreshToken })
|
|
551
|
+
body: JSON.stringify({ refreshToken: refreshToken2 })
|
|
507
552
|
});
|
|
508
553
|
if (!response.ok) {
|
|
509
554
|
return null;
|
|
@@ -531,10 +576,10 @@ var createRefreshManager = (config) => {
|
|
|
531
576
|
return null;
|
|
532
577
|
}
|
|
533
578
|
const newUserToken = {
|
|
534
|
-
accessToken: result.accessToken,
|
|
579
|
+
accessToken: result.idToken ?? result.accessToken,
|
|
535
580
|
refreshToken: result.refreshToken ?? userToken.refreshToken,
|
|
536
581
|
userId: userToken.userId,
|
|
537
|
-
expiresAt: Date.now() + result.expiresIn *
|
|
582
|
+
expiresAt: Date.now() + result.expiresIn * 1000
|
|
538
583
|
};
|
|
539
584
|
store.setUser(newUserToken);
|
|
540
585
|
return newUserToken;
|
|
@@ -559,8 +604,9 @@ var createRefreshManager = (config) => {
|
|
|
559
604
|
cancelScheduledRefresh();
|
|
560
605
|
const state = store.getState();
|
|
561
606
|
const userToken = state.user;
|
|
562
|
-
if (!userToken)
|
|
563
|
-
|
|
607
|
+
if (!userToken)
|
|
608
|
+
return;
|
|
609
|
+
const refreshTime = userToken.expiresAt - Date.now() - 5 * 60000;
|
|
564
610
|
if (refreshTime <= 0) {
|
|
565
611
|
ensureValidUserToken();
|
|
566
612
|
return;
|
|
@@ -587,157 +633,31 @@ var createRefreshManager = (config) => {
|
|
|
587
633
|
};
|
|
588
634
|
|
|
589
635
|
// src/store/token-selector.ts
|
|
590
|
-
var issueTokenWithUserJwt = async (baseUrl, userAccessToken, request) => {
|
|
591
|
-
try {
|
|
592
|
-
const response = await fetch(`${baseUrl}/api/tokens`, {
|
|
593
|
-
method: "POST",
|
|
594
|
-
headers: {
|
|
595
|
-
"Content-Type": "application/json",
|
|
596
|
-
Authorization: `Bearer ${userAccessToken}`
|
|
597
|
-
},
|
|
598
|
-
body: JSON.stringify(request)
|
|
599
|
-
});
|
|
600
|
-
if (!response.ok) {
|
|
601
|
-
console.error("[TokenSelector] Failed to issue token with User JWT:", response.status);
|
|
602
|
-
return null;
|
|
603
|
-
}
|
|
604
|
-
return await response.json();
|
|
605
|
-
} catch (err) {
|
|
606
|
-
console.error("[TokenSelector] Error issuing token with User JWT:", err);
|
|
607
|
-
return null;
|
|
608
|
-
}
|
|
609
|
-
};
|
|
610
|
-
var delegateToken2 = async (baseUrl, delegateTokenBase64, request) => {
|
|
611
|
-
try {
|
|
612
|
-
const response = await fetch(`${baseUrl}/api/tokens/delegate`, {
|
|
613
|
-
method: "POST",
|
|
614
|
-
headers: {
|
|
615
|
-
"Content-Type": "application/json",
|
|
616
|
-
Authorization: `Bearer ${delegateTokenBase64}`
|
|
617
|
-
},
|
|
618
|
-
body: JSON.stringify(request)
|
|
619
|
-
});
|
|
620
|
-
if (!response.ok) {
|
|
621
|
-
console.error("[TokenSelector] Failed to delegate token:", response.status);
|
|
622
|
-
return null;
|
|
623
|
-
}
|
|
624
|
-
return await response.json();
|
|
625
|
-
} catch (err) {
|
|
626
|
-
console.error("[TokenSelector] Error delegating token:", err);
|
|
627
|
-
return null;
|
|
628
|
-
}
|
|
629
|
-
};
|
|
630
636
|
var createTokenSelector = (config) => {
|
|
631
|
-
const { store
|
|
632
|
-
const getTokenTtl = (type) => {
|
|
633
|
-
if (defaultTokenTtl) return defaultTokenTtl;
|
|
634
|
-
if (serverInfo?.limits) {
|
|
635
|
-
if (type === "delegate" && serverInfo.limits.maxDelegateTokenTtl) {
|
|
636
|
-
return serverInfo.limits.maxDelegateTokenTtl;
|
|
637
|
-
}
|
|
638
|
-
if (type === "access" && serverInfo.limits.maxAccessTokenTtl) {
|
|
639
|
-
return serverInfo.limits.maxAccessTokenTtl;
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
return type === "access" ? 3600 : 30 * 24 * 3600;
|
|
643
|
-
};
|
|
637
|
+
const { store } = config;
|
|
644
638
|
const ensureAccessToken = async () => {
|
|
645
639
|
const state = store.getState();
|
|
646
|
-
if (!shouldReissueAccessToken(state)) {
|
|
647
|
-
return state.access;
|
|
648
|
-
}
|
|
649
|
-
const userToken = state.user;
|
|
650
|
-
const delegateToken_ = state.delegate;
|
|
651
|
-
if (isUserTokenValid(userToken)) {
|
|
652
|
-
const result = await issueTokenWithUserJwt(baseUrl, userToken.accessToken, {
|
|
653
|
-
realm,
|
|
654
|
-
name: "auto-issued-access",
|
|
655
|
-
type: "access",
|
|
656
|
-
expiresIn: getTokenTtl("access"),
|
|
657
|
-
canUpload: true,
|
|
658
|
-
canManageDepot: true
|
|
659
|
-
});
|
|
660
|
-
if (result) {
|
|
661
|
-
const newToken = {
|
|
662
|
-
tokenId: result.tokenId,
|
|
663
|
-
tokenBase64: result.tokenBase64,
|
|
664
|
-
type: "access",
|
|
665
|
-
issuerId: result.issuerId,
|
|
666
|
-
expiresAt: result.expiresAt,
|
|
667
|
-
canUpload: result.canUpload,
|
|
668
|
-
canManageDepot: result.canManageDepot
|
|
669
|
-
};
|
|
670
|
-
store.setAccess(newToken);
|
|
671
|
-
return newToken;
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
if (isDelegateTokenValid(delegateToken_)) {
|
|
675
|
-
const result = await delegateToken2(baseUrl, delegateToken_.tokenBase64, {
|
|
676
|
-
name: "auto-issued-access",
|
|
677
|
-
type: "access",
|
|
678
|
-
expiresIn: getTokenTtl("access"),
|
|
679
|
-
canUpload: delegateToken_.canUpload,
|
|
680
|
-
canManageDepot: delegateToken_.canManageDepot
|
|
681
|
-
});
|
|
682
|
-
if (result) {
|
|
683
|
-
const newToken = {
|
|
684
|
-
tokenId: result.tokenId,
|
|
685
|
-
tokenBase64: result.tokenBase64,
|
|
686
|
-
type: "access",
|
|
687
|
-
issuerId: result.issuerId,
|
|
688
|
-
expiresAt: result.expiresAt,
|
|
689
|
-
canUpload: result.canUpload,
|
|
690
|
-
canManageDepot: result.canManageDepot
|
|
691
|
-
};
|
|
692
|
-
store.setAccess(newToken);
|
|
693
|
-
return newToken;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
return null;
|
|
697
|
-
};
|
|
698
|
-
const ensureDelegateToken = async () => {
|
|
699
|
-
const state = store.getState();
|
|
700
|
-
if (isDelegateTokenValid(state.delegate)) {
|
|
701
|
-
return state.delegate;
|
|
702
|
-
}
|
|
703
640
|
const userToken = state.user;
|
|
704
641
|
if (!isUserTokenValid(userToken)) {
|
|
705
642
|
return null;
|
|
706
643
|
}
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
expiresIn: getTokenTtl("delegate"),
|
|
644
|
+
return {
|
|
645
|
+
tokenBase64: userToken.accessToken,
|
|
646
|
+
tokenBytes: new Uint8Array(0),
|
|
647
|
+
expiresAt: userToken.expiresAt,
|
|
712
648
|
canUpload: true,
|
|
713
649
|
canManageDepot: true
|
|
714
|
-
}
|
|
715
|
-
if (result) {
|
|
716
|
-
const newToken = {
|
|
717
|
-
tokenId: result.tokenId,
|
|
718
|
-
tokenBase64: result.tokenBase64,
|
|
719
|
-
type: "delegate",
|
|
720
|
-
issuerId: result.issuerId,
|
|
721
|
-
expiresAt: result.expiresAt,
|
|
722
|
-
canUpload: result.canUpload,
|
|
723
|
-
canManageDepot: result.canManageDepot
|
|
724
|
-
};
|
|
725
|
-
store.setDelegate(newToken);
|
|
726
|
-
return newToken;
|
|
727
|
-
}
|
|
728
|
-
return null;
|
|
650
|
+
};
|
|
729
651
|
};
|
|
730
652
|
return {
|
|
731
|
-
ensureAccessToken
|
|
732
|
-
ensureDelegateToken
|
|
653
|
+
ensureAccessToken
|
|
733
654
|
};
|
|
734
655
|
};
|
|
735
656
|
|
|
736
657
|
// src/types/tokens.ts
|
|
737
658
|
var emptyTokenState = () => ({
|
|
738
659
|
user: null,
|
|
739
|
-
|
|
740
|
-
access: null
|
|
660
|
+
rootDelegate: null
|
|
741
661
|
});
|
|
742
662
|
|
|
743
663
|
// src/store/token-store.ts
|
|
@@ -756,12 +676,8 @@ var createTokenStore = (config = {}) => {
|
|
|
756
676
|
state = { ...state, user: token };
|
|
757
677
|
notifyAndPersist();
|
|
758
678
|
},
|
|
759
|
-
|
|
760
|
-
state = { ...state,
|
|
761
|
-
notifyAndPersist();
|
|
762
|
-
},
|
|
763
|
-
setAccess: (token) => {
|
|
764
|
-
state = { ...state, access: token };
|
|
679
|
+
setRootDelegate: (delegate) => {
|
|
680
|
+
state = { ...state, rootDelegate: delegate };
|
|
765
681
|
notifyAndPersist();
|
|
766
682
|
},
|
|
767
683
|
clear: () => {
|
|
@@ -772,7 +688,8 @@ var createTokenStore = (config = {}) => {
|
|
|
772
688
|
});
|
|
773
689
|
},
|
|
774
690
|
initialize: async () => {
|
|
775
|
-
if (!storage)
|
|
691
|
+
if (!storage)
|
|
692
|
+
return;
|
|
776
693
|
try {
|
|
777
694
|
const loaded = await storage.load();
|
|
778
695
|
if (loaded) {
|
|
@@ -788,17 +705,28 @@ var createTokenStore = (config = {}) => {
|
|
|
788
705
|
// src/client/helpers.ts
|
|
789
706
|
var ERRORS = {
|
|
790
707
|
USER_REQUIRED: { code: "UNAUTHORIZED", message: "User login required" },
|
|
791
|
-
DELEGATE_REQUIRED: { code: "FORBIDDEN", message: "Delegate token required" },
|
|
792
708
|
ACCESS_REQUIRED: { code: "FORBIDDEN", message: "Access token required" }
|
|
793
709
|
};
|
|
794
|
-
var withToken = (
|
|
795
|
-
return (fn) =>
|
|
796
|
-
|
|
797
|
-
|
|
710
|
+
var withToken = (getToken, error) => {
|
|
711
|
+
return (fn) => getToken().then((token) => token ? fn(token) : Promise.resolve({ ok: false, error }));
|
|
712
|
+
};
|
|
713
|
+
var withAccessToken = (getToken) => withToken(getToken, ERRORS.ACCESS_REQUIRED);
|
|
714
|
+
|
|
715
|
+
// src/client/delegates.ts
|
|
716
|
+
var createDelegateMethods = ({
|
|
717
|
+
baseUrl,
|
|
718
|
+
realm,
|
|
719
|
+
tokenSelector
|
|
720
|
+
}) => {
|
|
721
|
+
const requireAccess = withAccessToken(() => tokenSelector.ensureAccessToken());
|
|
722
|
+
return {
|
|
723
|
+
create: (params) => requireAccess((t) => createDelegate(baseUrl, realm, t.tokenBase64, params)),
|
|
724
|
+
list: (params) => requireAccess((t) => listDelegates(baseUrl, realm, t.tokenBase64, params)),
|
|
725
|
+
get: (delegateId) => requireAccess((t) => getDelegate(baseUrl, realm, t.tokenBase64, delegateId)),
|
|
726
|
+
revoke: (delegateId) => requireAccess((t) => revokeDelegate(baseUrl, realm, t.tokenBase64, delegateId)),
|
|
727
|
+
claimNode: (nodeKey, pop) => requireAccess((t) => claimNode(baseUrl, realm, t.tokenBase64, nodeKey, { pop }))
|
|
728
|
+
};
|
|
798
729
|
};
|
|
799
|
-
var withUserToken = (getToken2) => withToken(getToken2, ERRORS.USER_REQUIRED);
|
|
800
|
-
var withDelegateToken = (getToken2) => withToken(getToken2, ERRORS.DELEGATE_REQUIRED);
|
|
801
|
-
var withAccessToken = (getToken2) => withToken(getToken2, ERRORS.ACCESS_REQUIRED);
|
|
802
730
|
|
|
803
731
|
// src/client/depots.ts
|
|
804
732
|
var createDepotMethods = ({ baseUrl, realm, tokenSelector }) => {
|
|
@@ -813,14 +741,33 @@ var createDepotMethods = ({ baseUrl, realm, tokenSelector }) => {
|
|
|
813
741
|
};
|
|
814
742
|
};
|
|
815
743
|
|
|
744
|
+
// src/client/filesystem.ts
|
|
745
|
+
var createFsMethods = ({ baseUrl, realm, tokenSelector }) => {
|
|
746
|
+
const requireAccess = withAccessToken(() => tokenSelector.ensureAccessToken());
|
|
747
|
+
return {
|
|
748
|
+
stat: (rootKey, path) => requireAccess((t) => fsStat(baseUrl, realm, t.tokenBase64, rootKey, path)),
|
|
749
|
+
ls: (rootKey, path, opts) => requireAccess((t) => fsLs(baseUrl, realm, t.tokenBase64, rootKey, path, opts)),
|
|
750
|
+
read: (rootKey, path) => requireAccess((t) => fsRead(baseUrl, realm, t.tokenBase64, rootKey, path)),
|
|
751
|
+
write: (rootKey, path, data, contentType) => requireAccess((t) => fsWrite(baseUrl, realm, t.tokenBase64, rootKey, path, data, contentType)),
|
|
752
|
+
mkdir: (rootKey, path) => requireAccess((t) => fsMkdir(baseUrl, realm, t.tokenBase64, rootKey, path)),
|
|
753
|
+
rm: (rootKey, path) => requireAccess((t) => fsRm(baseUrl, realm, t.tokenBase64, rootKey, path)),
|
|
754
|
+
mv: (rootKey, from, to) => requireAccess((t) => fsMv(baseUrl, realm, t.tokenBase64, rootKey, from, to)),
|
|
755
|
+
cp: (rootKey, from, to) => requireAccess((t) => fsCp(baseUrl, realm, t.tokenBase64, rootKey, from, to)),
|
|
756
|
+
rewrite: (rootKey, entries, deletes) => requireAccess((t) => fsRewrite(baseUrl, realm, t.tokenBase64, rootKey, entries, deletes))
|
|
757
|
+
};
|
|
758
|
+
};
|
|
759
|
+
|
|
816
760
|
// src/client/nodes.ts
|
|
817
761
|
var createNodeMethods = ({ baseUrl, realm, tokenSelector }) => {
|
|
818
762
|
const requireAccess = withAccessToken(() => tokenSelector.ensureAccessToken());
|
|
819
763
|
return {
|
|
820
|
-
get: (nodeKey
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
764
|
+
get: (nodeKey) => requireAccess((t) => getNode(baseUrl, realm, t.tokenBase64, nodeKey)),
|
|
765
|
+
getNavigated: (nodeKey, indexPath) => requireAccess((t) => getNodeNavigated(baseUrl, realm, t.tokenBase64, nodeKey, indexPath)),
|
|
766
|
+
getMetadata: (nodeKey) => requireAccess((t) => getNodeMetadata(baseUrl, realm, t.tokenBase64, nodeKey)),
|
|
767
|
+
check: (params) => requireAccess((t) => checkNodes(baseUrl, realm, t.tokenBase64, params)),
|
|
768
|
+
put: (nodeKey, content) => requireAccess((t) => putNode(baseUrl, realm, t.tokenBase64, nodeKey, content)),
|
|
769
|
+
claim: (nodeKey, pop) => requireAccess((t) => claimNode(baseUrl, realm, t.tokenBase64, nodeKey, { pop })),
|
|
770
|
+
batchClaim: (params) => requireAccess((t) => batchClaimNodes(baseUrl, realm, t.tokenBase64, params))
|
|
824
771
|
};
|
|
825
772
|
};
|
|
826
773
|
|
|
@@ -833,9 +780,11 @@ var createOAuthMethods = ({
|
|
|
833
780
|
getConfig: () => getOAuthConfig(baseUrl),
|
|
834
781
|
login: async (email, password) => {
|
|
835
782
|
const result = await login(baseUrl, { email, password });
|
|
836
|
-
if (!result.ok)
|
|
783
|
+
if (!result.ok)
|
|
784
|
+
return result;
|
|
837
785
|
const meResult = await getMe(baseUrl, result.data.accessToken);
|
|
838
|
-
if (!meResult.ok)
|
|
786
|
+
if (!meResult.ok)
|
|
787
|
+
return meResult;
|
|
839
788
|
store.setUser(tokenResponseToStoredUserToken(result.data, meResult.data.userId));
|
|
840
789
|
refreshManager.scheduleProactiveRefresh();
|
|
841
790
|
return meResult;
|
|
@@ -846,9 +795,11 @@ var createOAuthMethods = ({
|
|
|
846
795
|
redirect_uri: redirectUri,
|
|
847
796
|
code_verifier: codeVerifier
|
|
848
797
|
});
|
|
849
|
-
if (!result.ok)
|
|
798
|
+
if (!result.ok)
|
|
799
|
+
return result;
|
|
850
800
|
const meResult = await getMe(baseUrl, result.data.accessToken);
|
|
851
|
-
if (!meResult.ok)
|
|
801
|
+
if (!meResult.ok)
|
|
802
|
+
return meResult;
|
|
852
803
|
store.setUser(tokenResponseToStoredUserToken(result.data, meResult.data.userId));
|
|
853
804
|
refreshManager.scheduleProactiveRefresh();
|
|
854
805
|
return meResult;
|
|
@@ -862,76 +813,30 @@ var createOAuthMethods = ({
|
|
|
862
813
|
}
|
|
863
814
|
});
|
|
864
815
|
|
|
865
|
-
// src/client/tickets.ts
|
|
866
|
-
var createTicketMethods = ({
|
|
867
|
-
baseUrl,
|
|
868
|
-
realm,
|
|
869
|
-
tokenSelector
|
|
870
|
-
}) => {
|
|
871
|
-
const requireAccess = withAccessToken(() => tokenSelector.ensureAccessToken());
|
|
872
|
-
return {
|
|
873
|
-
create: (params) => requireAccess((access) => createTicket(baseUrl, realm, access.tokenBase64, params)),
|
|
874
|
-
list: (params) => requireAccess((access) => listTickets(baseUrl, realm, access.tokenBase64, params)),
|
|
875
|
-
get: (ticketId) => requireAccess((access) => getTicket(baseUrl, realm, access.tokenBase64, ticketId)),
|
|
876
|
-
submit: (ticketId, params) => requireAccess(
|
|
877
|
-
(access) => submitTicket(baseUrl, realm, access.tokenBase64, ticketId, params)
|
|
878
|
-
)
|
|
879
|
-
};
|
|
880
|
-
};
|
|
881
|
-
|
|
882
816
|
// src/client/tokens.ts
|
|
883
|
-
var createTokenMethods = ({
|
|
884
|
-
baseUrl,
|
|
885
|
-
realm,
|
|
886
|
-
store,
|
|
887
|
-
refreshManager,
|
|
888
|
-
tokenSelector
|
|
889
|
-
}) => {
|
|
890
|
-
const requireUser = withUserToken(() => refreshManager.ensureValidUserToken());
|
|
891
|
-
const requireDelegate = withDelegateToken(() => tokenSelector.ensureDelegateToken());
|
|
817
|
+
var createTokenMethods = ({ refreshManager }) => {
|
|
892
818
|
return {
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
819
|
+
refresh: async () => {
|
|
820
|
+
try {
|
|
821
|
+
await refreshManager.ensureValidUserToken();
|
|
822
|
+
return { ok: true, data: undefined, status: 200 };
|
|
823
|
+
} catch (err) {
|
|
824
|
+
return {
|
|
825
|
+
ok: false,
|
|
826
|
+
error: {
|
|
827
|
+
message: err.message,
|
|
828
|
+
code: "REFRESH_FAILED"
|
|
829
|
+
},
|
|
830
|
+
status: 0
|
|
831
|
+
};
|
|
903
832
|
}
|
|
904
|
-
|
|
905
|
-
}),
|
|
906
|
-
list: (params) => requireUser((user) => listTokens(baseUrl, user.accessToken, params)),
|
|
907
|
-
revoke: (tokenId) => requireUser(async (user) => {
|
|
908
|
-
const result = await revokeToken(baseUrl, user.accessToken, tokenId);
|
|
909
|
-
if (!result.ok) return { ok: false, error: result.error };
|
|
910
|
-
const state = store.getState();
|
|
911
|
-
if (state.delegate?.tokenId === tokenId) store.setDelegate(null);
|
|
912
|
-
if (state.access?.tokenId === tokenId) store.setAccess(null);
|
|
913
|
-
return { ok: true, data: void 0, status: result.status };
|
|
914
|
-
}),
|
|
915
|
-
delegate: (params) => requireDelegate(async (delegate) => {
|
|
916
|
-
const result = await delegateToken(baseUrl, delegate.tokenBase64, params);
|
|
917
|
-
if (!result.ok) return result;
|
|
918
|
-
return { ok: true, data: toStoredToken(result.data), status: result.status };
|
|
919
|
-
})
|
|
833
|
+
}
|
|
920
834
|
};
|
|
921
835
|
};
|
|
922
|
-
var toStoredToken = (response) => ({
|
|
923
|
-
tokenId: response.tokenId,
|
|
924
|
-
tokenBase64: response.tokenBase64,
|
|
925
|
-
type: response.type ?? "delegate",
|
|
926
|
-
issuerId: response.issuerId ?? "",
|
|
927
|
-
expiresAt: response.expiresAt,
|
|
928
|
-
canUpload: response.canUpload ?? false,
|
|
929
|
-
canManageDepot: response.canManageDepot ?? false
|
|
930
|
-
});
|
|
931
836
|
|
|
932
837
|
// src/client/index.ts
|
|
933
838
|
var createClient = async (config) => {
|
|
934
|
-
const { baseUrl, realm, tokenStorage, onTokenChange, onAuthRequired
|
|
839
|
+
const { baseUrl, realm, tokenStorage, onTokenChange, onAuthRequired } = config;
|
|
935
840
|
const store = createTokenStore({
|
|
936
841
|
storage: tokenStorage,
|
|
937
842
|
onTokenChange,
|
|
@@ -951,44 +856,38 @@ var createClient = async (config) => {
|
|
|
951
856
|
const tokenSelector = createTokenSelector({
|
|
952
857
|
store,
|
|
953
858
|
baseUrl,
|
|
954
|
-
realm
|
|
955
|
-
serverInfo,
|
|
956
|
-
defaultTokenTtl
|
|
859
|
+
realm
|
|
957
860
|
});
|
|
958
861
|
const deps = { baseUrl, realm, store, refreshManager, tokenSelector };
|
|
959
862
|
return {
|
|
960
863
|
getState: () => store.getState(),
|
|
961
864
|
getServerInfo: () => serverInfo,
|
|
962
|
-
|
|
963
|
-
|
|
865
|
+
setRootDelegate: (delegate) => store.setRootDelegate(delegate),
|
|
866
|
+
getAccessToken: () => tokenSelector.ensureAccessToken(),
|
|
964
867
|
logout: () => {
|
|
965
868
|
refreshManager.cancelScheduledRefresh();
|
|
966
869
|
store.clear();
|
|
967
870
|
},
|
|
968
871
|
oauth: createOAuthMethods(deps),
|
|
969
872
|
tokens: createTokenMethods(deps),
|
|
970
|
-
|
|
873
|
+
delegates: createDelegateMethods(deps),
|
|
971
874
|
depots: createDepotMethods(deps),
|
|
875
|
+
fs: createFsMethods(deps),
|
|
972
876
|
nodes: createNodeMethods(deps)
|
|
973
877
|
};
|
|
974
878
|
};
|
|
975
879
|
export {
|
|
976
|
-
DEFAULT_EXPIRY_BUFFER_MS,
|
|
977
|
-
api_exports as api,
|
|
978
|
-
createClient,
|
|
979
|
-
createRefreshManager,
|
|
980
|
-
createTokenSelector,
|
|
981
|
-
createTokenStore,
|
|
982
|
-
emptyTokenState,
|
|
983
|
-
getMaxIssuerId,
|
|
984
|
-
isAccessTokenFromMaxIssuer,
|
|
985
|
-
isAccessTokenValid,
|
|
986
|
-
isDelegateTokenFromCurrentUser,
|
|
987
|
-
isDelegateTokenValid,
|
|
988
|
-
isTokenExpiringSoon,
|
|
989
|
-
isTokenValid,
|
|
990
880
|
isUserTokenValid,
|
|
991
|
-
|
|
992
|
-
|
|
881
|
+
isTokenValid,
|
|
882
|
+
isTokenExpiringSoon,
|
|
883
|
+
isStoredAccessTokenValid,
|
|
884
|
+
emptyTokenState,
|
|
885
|
+
createTokenStore,
|
|
886
|
+
createTokenSelector,
|
|
887
|
+
createRefreshManager,
|
|
888
|
+
createClient,
|
|
889
|
+
exports_api as api,
|
|
890
|
+
DEFAULT_EXPIRY_BUFFER_MS
|
|
993
891
|
};
|
|
994
|
-
|
|
892
|
+
|
|
893
|
+
//# debugId=5038FC2C1365EC6364756E2164756E21
|