@pear-protocol/core-sdk 1.19.3 → 1.20.1

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.
@@ -105,6 +105,45 @@ class Core {
105
105
  });
106
106
  }, "revoke")
107
107
  };
108
+ baskets = {
109
+ saved: {
110
+ list: /* @__PURE__ */ __name(async (headers) => {
111
+ return await this.client.fetch(`/baskets/saved`, {
112
+ method: "GET",
113
+ headers
114
+ });
115
+ }, "list"),
116
+ create: /* @__PURE__ */ __name(async (body, headers) => {
117
+ return await this.client.fetch(`/baskets/saved`, {
118
+ method: "POST",
119
+ headers,
120
+ body
121
+ });
122
+ }, "create"),
123
+ update: /* @__PURE__ */ __name(async (id, body, headers) => {
124
+ return await this.client.fetch(`/baskets/saved/${id}`, {
125
+ method: "PATCH",
126
+ headers,
127
+ body
128
+ });
129
+ }, "update"),
130
+ delete: /* @__PURE__ */ __name(async (id, headers) => {
131
+ return await this.client.fetch(`/baskets/saved/${id}`, {
132
+ method: "DELETE",
133
+ headers
134
+ });
135
+ }, "delete")
136
+ },
137
+ recommended: {
138
+ /** Publicly list every admin-curated recommended basket; no auth required. */
139
+ list: /* @__PURE__ */ __name(async (headers) => {
140
+ return await this.client.fetch(`/baskets/recommended`, {
141
+ method: "GET",
142
+ headers
143
+ });
144
+ }, "list")
145
+ }
146
+ };
108
147
  executions = {
109
148
  list: /* @__PURE__ */ __name(async (query, headers) => {
110
149
  return await this.client.fetch(`/executions`, {
@@ -393,34 +432,6 @@ class Core {
393
432
  });
394
433
  }, "referees")
395
434
  };
396
- savedBaskets = {
397
- list: /* @__PURE__ */ __name(async (headers) => {
398
- return await this.client.fetch(`/saved-baskets`, {
399
- method: "GET",
400
- headers
401
- });
402
- }, "list"),
403
- create: /* @__PURE__ */ __name(async (body, headers) => {
404
- return await this.client.fetch(`/saved-baskets`, {
405
- method: "POST",
406
- headers,
407
- body
408
- });
409
- }, "create"),
410
- update: /* @__PURE__ */ __name(async (id, body, headers) => {
411
- return await this.client.fetch(`/saved-baskets/${id}`, {
412
- method: "PATCH",
413
- headers,
414
- body
415
- });
416
- }, "update"),
417
- delete: /* @__PURE__ */ __name(async (id, headers) => {
418
- return await this.client.fetch(`/saved-baskets/${id}`, {
419
- method: "DELETE",
420
- headers
421
- });
422
- }, "delete")
423
- };
424
435
  schedules = {
425
436
  list: /* @__PURE__ */ __name(async (query, headers) => {
426
437
  return await this.client.fetch(`/schedules`, {
package/dist/http.js CHANGED
@@ -57,7 +57,7 @@ class HttpClient {
57
57
  return middleware(request, next);
58
58
  }
59
59
  }
60
- return await fetch(request);
60
+ return await fetch(request.clone());
61
61
  }, "next");
62
62
  return next();
63
63
  }, "executeRequest");
package/dist/index.js CHANGED
@@ -33,6 +33,7 @@ class PearSDK {
33
33
  this.external = new External();
34
34
  if (authMode === "session") {
35
35
  let refreshInFlight = null;
36
+ const retried = /* @__PURE__ */ new WeakSet();
36
37
  const refreshSession = /* @__PURE__ */ __name(async () => {
37
38
  if (!refreshInFlight) {
38
39
  logger.info("[session-refresh] Refreshing session...");
@@ -56,10 +57,20 @@ class PearSDK {
56
57
  }, "refreshSession");
57
58
  const sessionRefreshMiddleware = /* @__PURE__ */ __name(async (response, retry, request) => {
58
59
  if (response.status !== 401) return response;
60
+ if (isSessionRefreshRequest(request.url)) {
61
+ logger.warn("[session-refresh] Refresh endpoint returned 401; session cannot be renewed");
62
+ return response;
63
+ }
59
64
  logger.warn(`[session-refresh] 401 received for ${request.method} ${request.url}`);
65
+ if (retried.has(request)) {
66
+ logger.error("[session-refresh] Retry after refresh returned 401 again, giving up");
67
+ config.onSessionExpired?.();
68
+ return response;
69
+ }
60
70
  try {
61
71
  await refreshSession();
62
72
  logger.info(`[session-refresh] Retrying ${request.method} ${request.url}`);
73
+ retried.add(request);
63
74
  return retry();
64
75
  } catch {
65
76
  logger.error("[session-refresh] Session expired, cannot recover");
@@ -121,5 +132,15 @@ class PearSDK {
121
132
  }
122
133
  }
123
134
  }
135
+ function isSessionRefreshRequest(url) {
136
+ let pathname;
137
+ try {
138
+ pathname = new URL(url).pathname;
139
+ } catch {
140
+ return false;
141
+ }
142
+ return pathname.endsWith("/auth/session/refresh") || pathname.endsWith("/auth/session/refresh/token");
143
+ }
144
+ __name(isSessionRefreshRequest, "isSessionRefreshRequest");
124
145
 
125
146
  export { PearSDK as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pear-protocol/core-sdk",
3
- "version": "1.19.3",
3
+ "version": "1.20.1",
4
4
  "description": "Pear Protocol Core SDK",
5
5
  "private": false,
6
6
  "type": "module",
@@ -26,8 +26,8 @@
26
26
  "typecheck": "tsc --noEmit"
27
27
  },
28
28
  "dependencies": {
29
- "@pear-protocol/types": "^1.31.0",
30
- "@pear-protocol/utils": "^0.8.0",
29
+ "@pear-protocol/types": "^1.33.0",
30
+ "@pear-protocol/utils": "^0.8.1",
31
31
  "qs": "^6.14.0"
32
32
  },
33
33
  "devDependencies": {