@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.
Files changed (66) hide show
  1. package/README.md +201 -0
  2. package/README.zh-CN.md +201 -0
  3. package/dist/api/claim.d.ts +21 -0
  4. package/dist/api/claim.d.ts.map +1 -0
  5. package/dist/api/delegates.d.ts +39 -0
  6. package/dist/api/delegates.d.ts.map +1 -0
  7. package/dist/api/depots.d.ts +68 -0
  8. package/dist/api/depots.d.ts.map +1 -0
  9. package/dist/api/filesystem.d.ts +55 -0
  10. package/dist/api/filesystem.d.ts.map +1 -0
  11. package/dist/api/index.d.ts +13 -3
  12. package/dist/api/index.d.ts.map +1 -0
  13. package/dist/api/index.js +355 -207
  14. package/dist/api/index.js.map +19 -1
  15. package/dist/api/info.d.ts +16 -0
  16. package/dist/api/info.d.ts.map +1 -0
  17. package/dist/api/nodes.d.ts +42 -0
  18. package/dist/api/nodes.d.ts.map +1 -0
  19. package/dist/api/oauth.d.ts +54 -0
  20. package/dist/api/oauth.d.ts.map +1 -0
  21. package/dist/api/requests.d.ts +33 -0
  22. package/dist/api/requests.d.ts.map +1 -0
  23. package/dist/api/tokens.d.ts +19 -0
  24. package/dist/api/tokens.d.ts.map +1 -0
  25. package/dist/client/delegates.d.ts +26 -0
  26. package/dist/client/delegates.d.ts.map +1 -0
  27. package/dist/client/depots.d.ts +28 -0
  28. package/dist/client/depots.d.ts.map +1 -0
  29. package/dist/client/filesystem.d.ts +39 -0
  30. package/dist/client/filesystem.d.ts.map +1 -0
  31. package/dist/client/helpers.d.ts +27 -0
  32. package/dist/client/helpers.d.ts.map +1 -0
  33. package/dist/client/index.d.ts +49 -0
  34. package/dist/client/index.d.ts.map +1 -0
  35. package/dist/client/nodes.d.ts +30 -0
  36. package/dist/client/nodes.d.ts.map +1 -0
  37. package/dist/client/oauth.d.ts +24 -0
  38. package/dist/client/oauth.d.ts.map +1 -0
  39. package/dist/client/tokens.d.ts +23 -0
  40. package/dist/client/tokens.d.ts.map +1 -0
  41. package/dist/index.d.ts +14 -294
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +414 -515
  44. package/dist/index.js.map +32 -1
  45. package/dist/store/index.d.ts +8 -0
  46. package/dist/store/index.d.ts.map +1 -0
  47. package/dist/store/jwt-refresh.d.ts +31 -0
  48. package/dist/store/jwt-refresh.d.ts.map +1 -0
  49. package/dist/store/token-checks.d.ts +33 -0
  50. package/dist/store/token-checks.d.ts.map +1 -0
  51. package/dist/store/token-selector.d.ts +29 -0
  52. package/dist/store/token-selector.d.ts.map +1 -0
  53. package/dist/store/token-store.d.ts +30 -0
  54. package/dist/store/token-store.d.ts.map +1 -0
  55. package/dist/types/client.d.ts +64 -0
  56. package/dist/types/client.d.ts.map +1 -0
  57. package/dist/types/index.d.ts +5 -142
  58. package/dist/types/index.d.ts.map +1 -0
  59. package/dist/types/index.js +14 -3
  60. package/dist/types/index.js.map +10 -1
  61. package/dist/types/tokens.d.ts +86 -0
  62. package/dist/types/tokens.d.ts.map +1 -0
  63. package/dist/utils/http.d.ts +32 -0
  64. package/dist/utils/http.d.ts.map +1 -0
  65. package/package.json +7 -3
  66. 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, { get: all[name], enumerable: true });
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 api_exports = {};
9
- __export(api_exports, {
10
- approveAuthRequest: () => approveAuthRequest,
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
- updateDepot: () => updateDepot
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 !== void 0 && !requestHeaders["Content-Type"]) {
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 !== void 0 ? JSON.stringify(body) : void 0
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 = void 0;
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
- `${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots`,
134
- `Bearer ${accessTokenBase64}`,
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) query.set("limit", String(params.limit));
144
- if (params?.cursor) query.set("cursor", params.cursor);
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
- `${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}`,
158
- `Bearer ${accessTokenBase64}`,
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
- `${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}`,
168
- `Bearer ${accessTokenBase64}`,
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
- `${baseUrl}/api/realm/${encodeURIComponent(realm)}/depots/${encodeURIComponent(depotId)}/commit`,
178
- `Bearer ${accessTokenBase64}`,
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
- body: params
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, indexPath) => {
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 response = await fetch(url, {
199
- headers: {
200
- Authorization: `Bearer ${accessTokenBase64}`,
201
- "X-CAS-Index-Path": indexPath
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 getNodeMetadata = async (baseUrl, realm, accessTokenBase64, nodeKey, indexPath) => {
228
- return fetchWithAuth(
229
- `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/${encodeURIComponent(nodeKey)}/metadata`,
230
- `Bearer ${accessTokenBase64}`,
231
- {
232
- headers: {
233
- "X-CAS-Index-Path": indexPath
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 prepareNodes = async (baseUrl, realm, accessTokenBase64, params) => {
239
- return fetchWithAuth(
240
- `${baseUrl}/api/realm/${encodeURIComponent(realm)}/nodes/prepare`,
241
- `Bearer ${accessTokenBase64}`,
242
- {
243
- method: "POST",
244
- body: params
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 * 1e3
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
- `${baseUrl}/api/tokens/requests/${encodeURIComponent(requestId)}/approve`,
336
- `Bearer ${userAccessToken}`,
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
- var listTokens = async (baseUrl, userAccessToken, params) => {
399
- const query = new URLSearchParams();
400
- if (params?.limit) query.set("limit", String(params.limit));
401
- if (params?.cursor) query.set("cursor", params.cursor);
402
- if (params?.type) query.set("type", params.type);
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 = 6e4;
527
+ var DEFAULT_EXPIRY_BUFFER_MS = 60000;
433
528
  var isTokenValid = (token, bufferMs = DEFAULT_EXPIRY_BUFFER_MS) => {
434
- if (!token) return false;
529
+ if (!token)
530
+ return false;
435
531
  return Date.now() + bufferMs < token.expiresAt;
436
532
  };
437
- var isTokenExpiringSoon = (token, windowMs = 5 * 6e4) => {
438
- if (!token) return false;
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 isDelegateTokenValid = (delegateToken3, bufferMs) => {
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, refreshToken) => {
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 * 1e3
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) return;
563
- const refreshTime = userToken.expiresAt - Date.now() - 5 * 6e4;
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, baseUrl, realm, serverInfo, defaultTokenTtl } = config;
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
- const result = await issueTokenWithUserJwt(baseUrl, userToken.accessToken, {
708
- realm,
709
- name: "auto-issued-delegate",
710
- type: "delegate",
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
- delegate: null,
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
- setDelegate: (token) => {
760
- state = { ...state, delegate: token };
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) return;
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 = (getToken2, error) => {
795
- return (fn) => getToken2().then(
796
- (token) => token ? fn(token) : Promise.resolve({ ok: false, error })
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, indexPath) => requireAccess((t) => getNode(baseUrl, realm, t.tokenBase64, nodeKey, indexPath)),
821
- getMetadata: (nodeKey, indexPath) => requireAccess((t) => getNodeMetadata(baseUrl, realm, t.tokenBase64, nodeKey, indexPath)),
822
- prepare: (params) => requireAccess((t) => prepareNodes(baseUrl, realm, t.tokenBase64, params)),
823
- put: (nodeKey, content) => requireAccess((t) => putNode(baseUrl, realm, t.tokenBase64, nodeKey, content))
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) return result;
783
+ if (!result.ok)
784
+ return result;
837
785
  const meResult = await getMe(baseUrl, result.data.accessToken);
838
- if (!meResult.ok) return meResult;
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) return result;
798
+ if (!result.ok)
799
+ return result;
850
800
  const meResult = await getMe(baseUrl, result.data.accessToken);
851
- if (!meResult.ok) return meResult;
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
- create: (params) => requireUser(async (user) => {
894
- const result = await createToken(baseUrl, user.accessToken, params);
895
- if (!result.ok) return result;
896
- const newToken = toStoredToken(result.data);
897
- if (params.realm === realm) {
898
- if (params.type === "delegate") {
899
- store.setDelegate(newToken);
900
- } else {
901
- store.setAccess(newToken);
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
- return { ok: true, data: newToken, status: result.status };
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, defaultTokenTtl } = config;
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
- setDelegateToken: (token) => store.setDelegate(token),
963
- setAccessToken: (token) => store.setAccess(token),
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
- tickets: createTicketMethods(deps),
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
- shouldReissueAccessToken,
992
- shouldReissueDelegateToken
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
- //# sourceMappingURL=index.js.map
892
+
893
+ //# debugId=5038FC2C1365EC6364756E2164756E21