@37signals/basecamp 0.12.0 → 0.14.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 +114 -17
- package/dist/.build-complete +0 -0
- package/dist/client.d.ts +53 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +132 -150
- package/dist/client.js.map +1 -1
- package/dist/download.d.ts +7 -0
- package/dist/download.d.ts.map +1 -1
- package/dist/download.js +82 -22
- package/dist/download.js.map +1 -1
- package/dist/errors.d.ts +19 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +138 -14
- package/dist/errors.js.map +1 -1
- package/dist/generated/metadata.d.ts.map +1 -1
- package/dist/generated/metadata.js +291 -141
- package/dist/generated/metadata.js.map +1 -1
- package/dist/generated/metadata.ts +291 -141
- package/dist/generated/openapi-stripped.json +5954 -3523
- package/dist/generated/path-mapping.d.ts.map +1 -1
- package/dist/generated/path-mapping.js +28 -16
- package/dist/generated/path-mapping.js.map +1 -1
- package/dist/generated/path-mapping.ts +28 -16
- package/dist/generated/schema.d.ts +4390 -2357
- package/dist/generated/services/bookmarks.d.ts +1 -1
- package/dist/generated/services/bookmarks.d.ts.map +1 -1
- package/dist/generated/services/bookmarks.ts +1 -1
- package/dist/generated/services/boosts.d.ts +10 -0
- package/dist/generated/services/boosts.d.ts.map +1 -1
- package/dist/generated/services/boosts.js +8 -0
- package/dist/generated/services/boosts.js.map +1 -1
- package/dist/generated/services/boosts.ts +12 -0
- package/dist/generated/services/campfires.d.ts +54 -40
- package/dist/generated/services/campfires.d.ts.map +1 -1
- package/dist/generated/services/campfires.js +82 -65
- package/dist/generated/services/campfires.js.map +1 -1
- package/dist/generated/services/campfires.ts +107 -85
- package/dist/generated/services/cards.d.ts +5 -0
- package/dist/generated/services/cards.d.ts.map +1 -1
- package/dist/generated/services/cards.js +4 -0
- package/dist/generated/services/cards.js.map +1 -1
- package/dist/generated/services/cards.ts +6 -0
- package/dist/generated/services/checkins.d.ts +14 -0
- package/dist/generated/services/checkins.d.ts.map +1 -1
- package/dist/generated/services/checkins.js +14 -1
- package/dist/generated/services/checkins.js.map +1 -1
- package/dist/generated/services/checkins.ts +20 -0
- package/dist/generated/services/client-approvals.d.ts +6 -3
- package/dist/generated/services/client-approvals.d.ts.map +1 -1
- package/dist/generated/services/client-approvals.js +8 -5
- package/dist/generated/services/client-approvals.js.map +1 -1
- package/dist/generated/services/client-approvals.ts +10 -5
- package/dist/generated/services/client-correspondences.d.ts +6 -3
- package/dist/generated/services/client-correspondences.d.ts.map +1 -1
- package/dist/generated/services/client-correspondences.js +8 -5
- package/dist/generated/services/client-correspondences.js.map +1 -1
- package/dist/generated/services/client-correspondences.ts +10 -5
- package/dist/generated/services/client-replies.d.ts +11 -4
- package/dist/generated/services/client-replies.d.ts.map +1 -1
- package/dist/generated/services/client-replies.js +16 -8
- package/dist/generated/services/client-replies.js.map +1 -1
- package/dist/generated/services/client-replies.ts +18 -8
- package/dist/generated/services/cloud-files.d.ts +92 -0
- package/dist/generated/services/cloud-files.d.ts.map +1 -0
- package/dist/generated/services/cloud-files.js +121 -0
- package/dist/generated/services/cloud-files.js.map +1 -0
- package/dist/generated/services/cloud-files.ts +188 -0
- package/dist/generated/services/comments.d.ts +5 -0
- package/dist/generated/services/comments.d.ts.map +1 -1
- package/dist/generated/services/comments.js +4 -0
- package/dist/generated/services/comments.js.map +1 -1
- package/dist/generated/services/comments.ts +6 -0
- package/dist/generated/services/documents.d.ts +12 -7
- package/dist/generated/services/documents.d.ts.map +1 -1
- package/dist/generated/services/documents.js +10 -6
- package/dist/generated/services/documents.js.map +1 -1
- package/dist/generated/services/documents.ts +14 -8
- package/dist/generated/services/drafts.d.ts +1 -1
- package/dist/generated/services/drafts.d.ts.map +1 -1
- package/dist/generated/services/drafts.ts +1 -1
- package/dist/generated/services/events.d.ts +5 -0
- package/dist/generated/services/events.d.ts.map +1 -1
- package/dist/generated/services/events.js +4 -0
- package/dist/generated/services/events.js.map +1 -1
- package/dist/generated/services/events.ts +6 -0
- package/dist/generated/services/everything.d.ts +14 -14
- package/dist/generated/services/everything.d.ts.map +1 -1
- package/dist/generated/services/everything.ts +14 -14
- package/dist/generated/services/folders.d.ts +96 -0
- package/dist/generated/services/folders.d.ts.map +1 -0
- package/dist/generated/services/folders.js +140 -0
- package/dist/generated/services/folders.js.map +1 -0
- package/dist/generated/services/folders.ts +201 -0
- package/dist/generated/services/forwards.d.ts +7 -20
- package/dist/generated/services/forwards.d.ts.map +1 -1
- package/dist/generated/services/forwards.js +6 -35
- package/dist/generated/services/forwards.js.map +1 -1
- package/dist/generated/services/forwards.ts +10 -48
- package/dist/generated/services/gauges.d.ts +7 -0
- package/dist/generated/services/gauges.d.ts.map +1 -1
- package/dist/generated/services/gauges.js +5 -1
- package/dist/generated/services/gauges.js.map +1 -1
- package/dist/generated/services/gauges.ts +9 -1
- package/dist/generated/services/google-documents.d.ts +98 -0
- package/dist/generated/services/google-documents.d.ts.map +1 -0
- package/dist/generated/services/google-documents.js +123 -0
- package/dist/generated/services/google-documents.js.map +1 -0
- package/dist/generated/services/google-documents.ts +196 -0
- package/dist/generated/services/index.d.ts +7 -4
- package/dist/generated/services/index.d.ts.map +1 -1
- package/dist/generated/services/index.js +7 -4
- package/dist/generated/services/index.js.map +1 -1
- package/dist/generated/services/index.ts +7 -4
- package/dist/generated/services/messages.d.ts +2 -0
- package/dist/generated/services/messages.d.ts.map +1 -1
- package/dist/generated/services/messages.js +1 -1
- package/dist/generated/services/messages.js.map +1 -1
- package/dist/generated/services/messages.ts +3 -1
- package/dist/generated/services/my-notes.d.ts +1 -1
- package/dist/generated/services/my-notes.js +1 -1
- package/dist/generated/services/my-notes.ts +1 -1
- package/dist/generated/services/my-notifications.d.ts +4 -2
- package/dist/generated/services/my-notifications.d.ts.map +1 -1
- package/dist/generated/services/my-notifications.js.map +1 -1
- package/dist/generated/services/my-notifications.ts +4 -2
- package/dist/generated/services/people.d.ts +11 -1
- package/dist/generated/services/people.d.ts.map +1 -1
- package/dist/generated/services/people.js +13 -2
- package/dist/generated/services/people.js.map +1 -1
- package/dist/generated/services/people.ts +15 -1
- package/dist/generated/services/projects.d.ts +26 -0
- package/dist/generated/services/projects.d.ts.map +1 -1
- package/dist/generated/services/projects.js +49 -1
- package/dist/generated/services/projects.js.map +1 -1
- package/dist/generated/services/projects.ts +61 -1
- package/dist/generated/services/recordings.d.ts +2 -12
- package/dist/generated/services/recordings.d.ts.map +1 -1
- package/dist/generated/services/recordings.js +1 -26
- package/dist/generated/services/recordings.js.map +1 -1
- package/dist/generated/services/recordings.ts +3 -31
- package/dist/generated/services/reports.d.ts +8 -12
- package/dist/generated/services/reports.d.ts.map +1 -1
- package/dist/generated/services/reports.js +11 -5
- package/dist/generated/services/reports.js.map +1 -1
- package/dist/generated/services/reports.ts +13 -14
- package/dist/generated/services/schedules.d.ts +94 -15
- package/dist/generated/services/schedules.d.ts.map +1 -1
- package/dist/generated/services/schedules.js +19 -8
- package/dist/generated/services/schedules.js.map +1 -1
- package/dist/generated/services/schedules.ts +107 -17
- package/dist/generated/services/search.d.ts +2 -0
- package/dist/generated/services/search.d.ts.map +1 -1
- package/dist/generated/services/search.js +1 -1
- package/dist/generated/services/search.js.map +1 -1
- package/dist/generated/services/search.ts +3 -1
- package/dist/generated/services/templates.d.ts +2 -0
- package/dist/generated/services/templates.d.ts.map +1 -1
- package/dist/generated/services/templates.js +1 -1
- package/dist/generated/services/templates.js.map +1 -1
- package/dist/generated/services/templates.ts +3 -1
- package/dist/generated/services/timeline.d.ts +2 -0
- package/dist/generated/services/timeline.d.ts.map +1 -1
- package/dist/generated/services/timeline.js +1 -0
- package/dist/generated/services/timeline.js.map +1 -1
- package/dist/generated/services/timeline.ts +3 -0
- package/dist/generated/services/timesheets.d.ts +16 -0
- package/dist/generated/services/timesheets.d.ts.map +1 -1
- package/dist/generated/services/timesheets.js +26 -2
- package/dist/generated/services/timesheets.js.map +1 -1
- package/dist/generated/services/timesheets.ts +35 -2
- package/dist/generated/services/todolist-groups.d.ts +11 -6
- package/dist/generated/services/todolist-groups.d.ts.map +1 -1
- package/dist/generated/services/todolist-groups.js +7 -3
- package/dist/generated/services/todolist-groups.js.map +1 -1
- package/dist/generated/services/todolist-groups.ts +13 -7
- package/dist/generated/services/todolists.d.ts +15 -13
- package/dist/generated/services/todolists.d.ts.map +1 -1
- package/dist/generated/services/todolists.js +11 -8
- package/dist/generated/services/todolists.js.map +1 -1
- package/dist/generated/services/todolists.ts +19 -14
- package/dist/generated/services/todos.d.ts +2 -12
- package/dist/generated/services/todos.d.ts.map +1 -1
- package/dist/generated/services/todos.js +1 -25
- package/dist/generated/services/todos.js.map +1 -1
- package/dist/generated/services/todos.ts +3 -30
- package/dist/generated/services/uploads.d.ts +41 -2
- package/dist/generated/services/uploads.d.ts.map +1 -1
- package/dist/generated/services/uploads.js +41 -1
- package/dist/generated/services/uploads.js.map +1 -1
- package/dist/generated/services/uploads.ts +71 -2
- package/dist/generated/services/vaults.d.ts +5 -0
- package/dist/generated/services/vaults.d.ts.map +1 -1
- package/dist/generated/services/vaults.js +4 -0
- package/dist/generated/services/vaults.js.map +1 -1
- package/dist/generated/services/vaults.ts +6 -0
- package/dist/index.d.ts +16 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -8
- package/dist/index.js.map +1 -1
- package/dist/oauth/authorization-document.d.ts +201 -0
- package/dist/oauth/authorization-document.d.ts.map +1 -0
- package/dist/oauth/authorization-document.js +130 -0
- package/dist/oauth/authorization-document.js.map +1 -0
- package/dist/oauth/identity.d.ts +7 -1
- package/dist/oauth/identity.d.ts.map +1 -1
- package/dist/oauth/identity.js +8 -19
- package/dist/oauth/identity.js.map +1 -1
- package/dist/oauth/index.d.ts +1 -0
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +2 -0
- package/dist/oauth/index.js.map +1 -1
- package/dist/pagination-utils.d.ts +46 -0
- package/dist/pagination-utils.d.ts.map +1 -1
- package/dist/pagination-utils.js +85 -2
- package/dist/pagination-utils.js.map +1 -1
- package/dist/pagination.d.ts +11 -0
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js.map +1 -1
- package/dist/retry.d.ts +110 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +253 -0
- package/dist/retry.js.map +1 -0
- package/dist/services/authorization.d.ts +22 -52
- package/dist/services/authorization.d.ts.map +1 -1
- package/dist/services/authorization.js +14 -32
- package/dist/services/authorization.js.map +1 -1
- package/dist/services/base.d.ts.map +1 -1
- package/dist/services/base.js +59 -5
- package/dist/services/base.js.map +1 -1
- package/dist/services/cards-extensions.d.ts +26 -21
- package/dist/services/cards-extensions.d.ts.map +1 -1
- package/dist/services/cards-extensions.js +28 -31
- package/dist/services/cards-extensions.js.map +1 -1
- package/dist/services/documents-extensions.d.ts +122 -0
- package/dist/services/documents-extensions.d.ts.map +1 -0
- package/dist/services/documents-extensions.js +125 -0
- package/dist/services/documents-extensions.js.map +1 -0
- package/dist/services/merge-safe.d.ts +167 -0
- package/dist/services/merge-safe.d.ts.map +1 -0
- package/dist/services/merge-safe.js +217 -0
- package/dist/services/merge-safe.js.map +1 -0
- package/dist/services/schedules-extensions.d.ts +266 -0
- package/dist/services/schedules-extensions.d.ts.map +1 -0
- package/dist/services/schedules-extensions.js +268 -0
- package/dist/services/schedules-extensions.js.map +1 -0
- package/dist/services/todolists-extensions.d.ts +110 -0
- package/dist/services/todolists-extensions.d.ts.map +1 -0
- package/dist/services/todolists-extensions.js +262 -0
- package/dist/services/todolists-extensions.js.map +1 -0
- package/dist/services/todos-extensions.d.ts +12 -1
- package/dist/services/todos-extensions.d.ts.map +1 -1
- package/dist/services/todos-extensions.js +27 -8
- package/dist/services/todos-extensions.js.map +1 -1
- package/package.json +6 -5
- package/src/generated/metadata.ts +291 -141
- package/src/generated/openapi-stripped.json +5954 -3523
- package/src/generated/path-mapping.ts +28 -16
- package/src/generated/schema.d.ts +4390 -2357
- package/src/generated/services/bookmarks.ts +1 -1
- package/src/generated/services/boosts.ts +12 -0
- package/src/generated/services/campfires.ts +107 -85
- package/src/generated/services/cards.ts +6 -0
- package/src/generated/services/checkins.ts +20 -0
- package/src/generated/services/client-approvals.ts +10 -5
- package/src/generated/services/client-correspondences.ts +10 -5
- package/src/generated/services/client-replies.ts +18 -8
- package/src/generated/services/cloud-files.ts +188 -0
- package/src/generated/services/comments.ts +6 -0
- package/src/generated/services/documents.ts +14 -8
- package/src/generated/services/drafts.ts +1 -1
- package/src/generated/services/events.ts +6 -0
- package/src/generated/services/everything.ts +14 -14
- package/src/generated/services/folders.ts +201 -0
- package/src/generated/services/forwards.ts +10 -48
- package/src/generated/services/gauges.ts +9 -1
- package/src/generated/services/google-documents.ts +196 -0
- package/src/generated/services/index.ts +7 -4
- package/src/generated/services/messages.ts +3 -1
- package/src/generated/services/my-notes.ts +1 -1
- package/src/generated/services/my-notifications.ts +4 -2
- package/src/generated/services/people.ts +15 -1
- package/src/generated/services/projects.ts +61 -1
- package/src/generated/services/recordings.ts +3 -31
- package/src/generated/services/reports.ts +13 -14
- package/src/generated/services/schedules.ts +107 -17
- package/src/generated/services/search.ts +3 -1
- package/src/generated/services/templates.ts +3 -1
- package/src/generated/services/timeline.ts +3 -0
- package/src/generated/services/timesheets.ts +35 -2
- package/src/generated/services/todolist-groups.ts +13 -7
- package/src/generated/services/todolists.ts +19 -14
- package/src/generated/services/todos.ts +3 -30
- package/src/generated/services/uploads.ts +71 -2
- package/src/generated/services/vaults.ts +6 -0
package/dist/download.js
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { BasecampError, Errors, errorFromResponse } from "./errors.js";
|
|
2
2
|
import { safeInvoke } from "./hooks.js";
|
|
3
|
+
import { TerminalRetryError, executeWithRetry, } from "./retry.js";
|
|
4
|
+
/**
|
|
5
|
+
* The fixed hop-1 retry policy (SPEC §14): three total attempts when retry is
|
|
6
|
+
* enabled, retrying network errors plus {429, 502, 503, 504} — never 500 —
|
|
7
|
+
* with exponential backoff, honoring Retry-After on 429. DownloadURL is
|
|
8
|
+
* deliberately absent from behavior-model.json, so the policy is passed to
|
|
9
|
+
* the retry primitive directly rather than looked up by operation. There is
|
|
10
|
+
* no public knob for the attempt count.
|
|
11
|
+
*/
|
|
12
|
+
const DOWNLOAD_MAX_ATTEMPTS = 3;
|
|
13
|
+
const DOWNLOAD_RETRY_ON = [429, 502, 503, 504];
|
|
14
|
+
const DOWNLOAD_RETRY_BASE_DELAY_MS = 1000;
|
|
3
15
|
/**
|
|
4
16
|
* Extracts a filename from the last path segment of a URL.
|
|
5
17
|
* Falls back to "download" if the URL is unparseable or has no path segments.
|
|
@@ -42,7 +54,7 @@ function parseContentLength(headers) {
|
|
|
42
54
|
* other signed-download URL that routes through the API.
|
|
43
55
|
*/
|
|
44
56
|
export function createDownloadURL(deps) {
|
|
45
|
-
const { authStrategy, userAgent, baseUrl, hooks, requestTimeoutMs } = deps;
|
|
57
|
+
const { authStrategy, userAgent, baseUrl, hooks, requestTimeoutMs, enableRetry, retryBaseDelayMs } = deps;
|
|
46
58
|
return async (rawURL) => {
|
|
47
59
|
// Validation
|
|
48
60
|
if (!rawURL) {
|
|
@@ -72,24 +84,69 @@ export function createDownloadURL(deps) {
|
|
|
72
84
|
// URL rewriting: replace origin with baseUrl origin, preserve path+query
|
|
73
85
|
const base = new URL(baseUrl);
|
|
74
86
|
const rewrittenURL = `${base.origin}${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
75
|
-
// Hop 1: Authenticated API request (capture redirect)
|
|
87
|
+
// Hop 1: Authenticated API request (capture redirect), under the fixed
|
|
88
|
+
// hop-1 retry policy. Attempt 1's auth runs here, outside the loop, so
|
|
89
|
+
// a failing strategy surfaces raw without request hooks — matching the
|
|
90
|
+
// client path, where the middleware authenticates before the loop.
|
|
76
91
|
const headers = new Headers({
|
|
77
92
|
"User-Agent": userAgent,
|
|
78
93
|
});
|
|
79
94
|
await authStrategy.authenticate(headers);
|
|
80
|
-
const
|
|
95
|
+
const downloadRetryConfig = {
|
|
96
|
+
maxAttempts: enableRetry ? DOWNLOAD_MAX_ATTEMPTS : 1,
|
|
97
|
+
baseDelayMs: retryBaseDelayMs ?? DOWNLOAD_RETRY_BASE_DELAY_MS,
|
|
98
|
+
backoff: "exponential",
|
|
99
|
+
retryOn: DOWNLOAD_RETRY_ON,
|
|
100
|
+
};
|
|
101
|
+
const requestInfoFor = (attempt) => ({
|
|
81
102
|
method: "GET",
|
|
82
103
|
url: rewrittenURL,
|
|
83
|
-
attempt
|
|
104
|
+
attempt,
|
|
105
|
+
});
|
|
106
|
+
// The download path has no lifecycle middleware, so the emit seams fire
|
|
107
|
+
// the hooks directly. executeWithRetry finalizes only the attempts it
|
|
108
|
+
// abandons; the terminal outcome is finalized after the loop below.
|
|
109
|
+
let currentAttempt = 1;
|
|
110
|
+
let attemptStart = performance.now();
|
|
111
|
+
const emit = {
|
|
112
|
+
begin: (attempt) => {
|
|
113
|
+
currentAttempt = attempt;
|
|
114
|
+
attemptStart = performance.now();
|
|
115
|
+
safeInvoke(hooks, "onRequestStart", requestInfoFor(attempt));
|
|
116
|
+
},
|
|
117
|
+
finalize: (outcome) => {
|
|
118
|
+
const durationMs = Math.round(performance.now() - attemptStart);
|
|
119
|
+
safeInvoke(hooks, "onRequestEnd", requestInfoFor(currentAttempt), {
|
|
120
|
+
statusCode: outcome.statusCode,
|
|
121
|
+
durationMs,
|
|
122
|
+
fromCache: false,
|
|
123
|
+
...(outcome.error ? { error: outcome.error } : {}),
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
retrying: (failedAttempt, error, delayMs) => {
|
|
127
|
+
safeInvoke(hooks, "onRetry", requestInfoFor(failedAttempt), failedAttempt + 1, error, delayMs);
|
|
128
|
+
},
|
|
84
129
|
};
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
130
|
+
const makeAttempt = async (attempt) => {
|
|
131
|
+
if (attempt > 1) {
|
|
132
|
+
// Refresh auth (the token may have rotated since the last attempt),
|
|
133
|
+
// so EVERY hop-1 attempt goes out authenticated. A throwing refresh
|
|
134
|
+
// is terminal: the marker carries it raw past retry classification.
|
|
135
|
+
try {
|
|
136
|
+
await authStrategy.authenticate(headers);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw new TerminalRetryError(error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Per-attempt timeout: the controller aborts only its own fetch, and
|
|
143
|
+
// an abort-shaped rejection is terminal in the loop — a request that
|
|
144
|
+
// consumed its whole time budget is a slowness shape a retry tends to
|
|
145
|
+
// repeat, not a transient blip.
|
|
89
146
|
const controller = new AbortController();
|
|
90
147
|
const timeoutId = setTimeout(() => controller.abort(), requestTimeoutMs);
|
|
91
148
|
try {
|
|
92
|
-
|
|
149
|
+
return await fetch(rewrittenURL, {
|
|
93
150
|
method: "GET",
|
|
94
151
|
headers,
|
|
95
152
|
redirect: "manual",
|
|
@@ -99,24 +156,27 @@ export function createDownloadURL(deps) {
|
|
|
99
156
|
finally {
|
|
100
157
|
clearTimeout(timeoutId);
|
|
101
158
|
}
|
|
159
|
+
};
|
|
160
|
+
let response;
|
|
161
|
+
try {
|
|
162
|
+
response = await executeWithRetry(makeAttempt, downloadRetryConfig, emit);
|
|
102
163
|
}
|
|
103
164
|
catch (err) {
|
|
104
|
-
|
|
165
|
+
if (err instanceof TerminalRetryError) {
|
|
166
|
+
// A retry's auth refresh failed: finalize the live attempt, then
|
|
167
|
+
// surface the strategy's own error raw — auth faults are neither
|
|
168
|
+
// transport failures nor API errors.
|
|
169
|
+
const reason = err.reason;
|
|
170
|
+
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
171
|
+
emit.finalize({ statusCode: 0, error });
|
|
172
|
+
throw reason;
|
|
173
|
+
}
|
|
105
174
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
106
|
-
|
|
107
|
-
statusCode: 0,
|
|
108
|
-
durationMs,
|
|
109
|
-
fromCache: false,
|
|
110
|
-
error,
|
|
111
|
-
});
|
|
175
|
+
emit.finalize({ statusCode: 0, error });
|
|
112
176
|
throw Errors.network(error.message, error);
|
|
113
177
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
statusCode: response.status,
|
|
117
|
-
durationMs,
|
|
118
|
-
fromCache: false,
|
|
119
|
-
});
|
|
178
|
+
// Terminal attempt's end — the loop deliberately leaves it to us.
|
|
179
|
+
emit.finalize({ statusCode: response.status });
|
|
120
180
|
// Dispatch on response status
|
|
121
181
|
const isRedirect = [301, 302, 303, 307, 308].includes(response.status);
|
|
122
182
|
if (isRedirect) {
|
package/dist/download.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export declare function truncateErrorMessage(s: string, maxLen?: number): string
|
|
|
32
32
|
/**
|
|
33
33
|
* Error codes for categorizing Basecamp API errors.
|
|
34
34
|
*/
|
|
35
|
-
export type ErrorCode = "auth_required" | "forbidden" | "not_found" | "rate_limit" | "validation" | "ambiguous" | "network" | "api_error" | "usage";
|
|
35
|
+
export type ErrorCode = "auth_required" | "forbidden" | "not_found" | "rate_limit" | "validation" | "ambiguous" | "network" | "api_error" | "usage" | "limit_exceeded";
|
|
36
36
|
/**
|
|
37
37
|
* Options for creating a BasecampError.
|
|
38
38
|
*/
|
|
@@ -49,6 +49,8 @@ export interface BasecampErrorOptions {
|
|
|
49
49
|
retryAfter?: number;
|
|
50
50
|
/** Request ID from the server for debugging */
|
|
51
51
|
requestId?: string;
|
|
52
|
+
/** Field-keyed validation messages from a 400/422 body, wrapped ({"errors": {field: [messages]}}) or bare ({field: [messages]}) */
|
|
53
|
+
fieldErrors?: Record<string, string[]>;
|
|
52
54
|
}
|
|
53
55
|
/**
|
|
54
56
|
* Structured error class for Basecamp API errors.
|
|
@@ -69,6 +71,15 @@ export declare class BasecampError extends Error {
|
|
|
69
71
|
readonly retryAfter?: number;
|
|
70
72
|
/** Request ID from the server for debugging */
|
|
71
73
|
readonly requestId?: string;
|
|
74
|
+
/**
|
|
75
|
+
* Field-keyed validation messages from a 422 body of the form
|
|
76
|
+
* `{"errors": {"field": ["msg", ...]}}` — the Rails RecordInvalid rendering —
|
|
77
|
+
* or the same map with no wrapper at all (`{"field": ["msg", ...]}`), which
|
|
78
|
+
* some controllers emit. Undefined for every other error shape. The flattened
|
|
79
|
+
* form is also folded into `message`; this slot preserves the raw, untruncated
|
|
80
|
+
* per-field messages.
|
|
81
|
+
*/
|
|
82
|
+
readonly fieldErrors?: Record<string, string[]>;
|
|
72
83
|
/** Original error that caused this error (ES2022+) */
|
|
73
84
|
readonly cause?: Error;
|
|
74
85
|
constructor(code: ErrorCode, message: string, options?: BasecampErrorOptions);
|
|
@@ -140,6 +151,13 @@ export declare const Errors: {
|
|
|
140
151
|
* Useful for mapping API responses to typed errors.
|
|
141
152
|
*/
|
|
142
153
|
export declare function errorFromResponse(response: Response, requestId?: string): Promise<BasecampError>;
|
|
154
|
+
/**
|
|
155
|
+
* Creates a BasecampError from an HTTP response whose body has already been
|
|
156
|
+
* read and parsed (e.g. by openapi-fetch, which consumes the error body before
|
|
157
|
+
* the service layer sees the response — re-reading it would throw and lose the
|
|
158
|
+
* server's message).
|
|
159
|
+
*/
|
|
160
|
+
export declare function errorFromParsedBody(response: Response, body: unknown, requestId?: string): BasecampError;
|
|
143
161
|
/**
|
|
144
162
|
* Type guard to check if an error is a BasecampError.
|
|
145
163
|
*/
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAOH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiC,GAAG,MAAM,CAGjG;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,WAAW,GACX,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,SAAS,GACT,WAAW,GACX,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
CHANGED
|
@@ -51,6 +51,7 @@ const EXIT_CODES = {
|
|
|
51
51
|
api_error: 7, // API error
|
|
52
52
|
ambiguous: 8, // Multiple matches found
|
|
53
53
|
validation: 9, // Validation error (HTTP 400/422)
|
|
54
|
+
limit_exceeded: 10, // Account limit reached (HTTP 507)
|
|
54
55
|
};
|
|
55
56
|
/**
|
|
56
57
|
* Structured error class for Basecamp API errors.
|
|
@@ -71,6 +72,15 @@ export class BasecampError extends Error {
|
|
|
71
72
|
retryAfter;
|
|
72
73
|
/** Request ID from the server for debugging */
|
|
73
74
|
requestId;
|
|
75
|
+
/**
|
|
76
|
+
* Field-keyed validation messages from a 422 body of the form
|
|
77
|
+
* `{"errors": {"field": ["msg", ...]}}` — the Rails RecordInvalid rendering —
|
|
78
|
+
* or the same map with no wrapper at all (`{"field": ["msg", ...]}`), which
|
|
79
|
+
* some controllers emit. Undefined for every other error shape. The flattened
|
|
80
|
+
* form is also folded into `message`; this slot preserves the raw, untruncated
|
|
81
|
+
* per-field messages.
|
|
82
|
+
*/
|
|
83
|
+
fieldErrors;
|
|
74
84
|
constructor(code, message, options) {
|
|
75
85
|
super(message);
|
|
76
86
|
this.name = "BasecampError";
|
|
@@ -80,6 +90,7 @@ export class BasecampError extends Error {
|
|
|
80
90
|
this.retryable = options?.retryable ?? false;
|
|
81
91
|
this.retryAfter = options?.retryAfter;
|
|
82
92
|
this.requestId = options?.requestId;
|
|
93
|
+
this.fieldErrors = options?.fieldErrors;
|
|
83
94
|
// Set cause if provided (ES2022+)
|
|
84
95
|
if (options?.cause) {
|
|
85
96
|
this.cause = options.cause;
|
|
@@ -109,6 +120,7 @@ export class BasecampError extends Error {
|
|
|
109
120
|
retryable: this.retryable,
|
|
110
121
|
retryAfter: this.retryAfter,
|
|
111
122
|
requestId: this.requestId,
|
|
123
|
+
fieldErrors: this.fieldErrors,
|
|
112
124
|
};
|
|
113
125
|
}
|
|
114
126
|
}
|
|
@@ -199,26 +211,55 @@ export const Errors = {
|
|
|
199
211
|
* Useful for mapping API responses to typed errors.
|
|
200
212
|
*/
|
|
201
213
|
export async function errorFromResponse(response, requestId) {
|
|
214
|
+
let body;
|
|
215
|
+
try {
|
|
216
|
+
body = await response.json();
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Body is not JSON or empty, use status text
|
|
220
|
+
body = undefined;
|
|
221
|
+
}
|
|
222
|
+
return errorFromParsedBody(response, body, requestId);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Creates a BasecampError from an HTTP response whose body has already been
|
|
226
|
+
* read and parsed (e.g. by openapi-fetch, which consumes the error body before
|
|
227
|
+
* the service layer sees the response — re-reading it would throw and lose the
|
|
228
|
+
* server's message).
|
|
229
|
+
*/
|
|
230
|
+
export function errorFromParsedBody(response, body, requestId) {
|
|
202
231
|
const httpStatus = response.status;
|
|
203
232
|
const retryAfter = parseRetryAfter(response.headers.get("Retry-After"));
|
|
204
|
-
// Try to extract error message from
|
|
233
|
+
// Try to extract error message from the parsed body
|
|
205
234
|
let message = response.statusText || "Request failed";
|
|
235
|
+
let serverMessage;
|
|
206
236
|
let hint;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (typeof body === "
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
237
|
+
let fieldErrors;
|
|
238
|
+
if (typeof body === "object" && body !== null) {
|
|
239
|
+
if ("error" in body && typeof body.error === "string") {
|
|
240
|
+
// Truncate error messages to prevent information leakage and unbounded memory growth
|
|
241
|
+
serverMessage = truncateErrorMessage(body.error);
|
|
242
|
+
message = serverMessage;
|
|
243
|
+
}
|
|
244
|
+
else if ("message" in body && typeof body.message === "string") {
|
|
245
|
+
// SPEC §6 step 4: "message" is the fallback for APIs that use it
|
|
246
|
+
// instead of "error".
|
|
247
|
+
serverMessage = truncateErrorMessage(body.message);
|
|
248
|
+
message = serverMessage;
|
|
249
|
+
}
|
|
250
|
+
if ("error_description" in body && typeof body.error_description === "string") {
|
|
251
|
+
hint = truncateErrorMessage(body.error_description);
|
|
252
|
+
}
|
|
253
|
+
if (httpStatus === 400 || httpStatus === 422) {
|
|
254
|
+
fieldErrors = parseFieldErrors(body);
|
|
255
|
+
if (fieldErrors) {
|
|
256
|
+
const flat = flattenFieldErrors(fieldErrors);
|
|
257
|
+
// Appended in parentheses after a top-level message, standing alone
|
|
258
|
+
// otherwise; truncated after flattening so the tail is capped too.
|
|
259
|
+
message = truncateErrorMessage(serverMessage ? `${serverMessage} (${flat})` : flat);
|
|
216
260
|
}
|
|
217
261
|
}
|
|
218
262
|
}
|
|
219
|
-
catch {
|
|
220
|
-
// Body is not JSON or empty, use status text
|
|
221
|
-
}
|
|
222
263
|
switch (httpStatus) {
|
|
223
264
|
case 401:
|
|
224
265
|
return new BasecampError("auth_required", message, { httpStatus, hint, requestId });
|
|
@@ -236,7 +277,17 @@ export async function errorFromResponse(response, requestId) {
|
|
|
236
277
|
});
|
|
237
278
|
case 400:
|
|
238
279
|
case 422:
|
|
239
|
-
return new BasecampError("validation", message, { httpStatus, hint, requestId });
|
|
280
|
+
return new BasecampError("validation", message, { httpStatus, hint, requestId, fieldErrors });
|
|
281
|
+
case 507:
|
|
282
|
+
// A 5xx status carrying a client fact: the account is out of storage, or
|
|
283
|
+
// at its webhook ceiling. Retrying cannot satisfy it, so this must be
|
|
284
|
+
// decided before the 5xx catch-all below.
|
|
285
|
+
return new BasecampError("limit_exceeded", message, {
|
|
286
|
+
httpStatus,
|
|
287
|
+
retryable: false,
|
|
288
|
+
hint,
|
|
289
|
+
requestId,
|
|
290
|
+
});
|
|
240
291
|
default:
|
|
241
292
|
// 5xx errors are retryable
|
|
242
293
|
const retryable = httpStatus >= 500 && httpStatus < 600;
|
|
@@ -248,6 +299,79 @@ export async function errorFromResponse(response, requestId) {
|
|
|
248
299
|
});
|
|
249
300
|
}
|
|
250
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* Extracts the field-keyed validation errors map from a parsed error body —
|
|
304
|
+
* the Rails RecordInvalid rendering `{"errors": {"field": ["msg", ...]}}`.
|
|
305
|
+
* Entries whose value is not an array are skipped, non-string elements are
|
|
306
|
+
* dropped, and a map with no usable entries is treated as absent (undefined).
|
|
307
|
+
*
|
|
308
|
+
* A body with no `errors` key falls through to `parseBareFieldErrors` for the
|
|
309
|
+
* unwrapped rendering.
|
|
310
|
+
*/
|
|
311
|
+
function parseFieldErrors(body) {
|
|
312
|
+
const errors = body.errors;
|
|
313
|
+
if (typeof errors !== "object" || errors === null || Array.isArray(errors)) {
|
|
314
|
+
return parseBareFieldErrors(body);
|
|
315
|
+
}
|
|
316
|
+
// Null prototype so an untrusted field name like "__proto__" becomes an
|
|
317
|
+
// ordinary own property instead of invoking the legacy prototype setter
|
|
318
|
+
// (which would both drop the entry and mutate the map's prototype).
|
|
319
|
+
const fieldErrors = Object.create(null);
|
|
320
|
+
let found = false;
|
|
321
|
+
for (const [field, value] of Object.entries(errors)) {
|
|
322
|
+
if (!Array.isArray(value))
|
|
323
|
+
continue;
|
|
324
|
+
const messages = value.filter((m) => typeof m === "string");
|
|
325
|
+
if (messages.length === 0)
|
|
326
|
+
continue;
|
|
327
|
+
fieldErrors[field] = messages;
|
|
328
|
+
found = true;
|
|
329
|
+
}
|
|
330
|
+
return found ? fieldErrors : undefined;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Extracts an unwrapped field map — the `render json: @webhook.errors`
|
|
334
|
+
* rendering, where the whole body is `{"field": ["msg", ...]}`. The gate is
|
|
335
|
+
* all-or-nothing by design (SPEC §6 step 2): with no `errors` key to declare
|
|
336
|
+
* intent, only shape distinguishes a field map from any other JSON object, so
|
|
337
|
+
* a single non-conforming member means this is not one. Returns undefined
|
|
338
|
+
* unless every member is a non-empty array of non-empty strings.
|
|
339
|
+
*/
|
|
340
|
+
function parseBareFieldErrors(body) {
|
|
341
|
+
if (Array.isArray(body))
|
|
342
|
+
return undefined;
|
|
343
|
+
// Only "errors" is structurally reserved (it belongs to step 1). "error" and
|
|
344
|
+
// "message" are not excluded by name: a flat body carries them as strings,
|
|
345
|
+
// which the shape gate below already rejects.
|
|
346
|
+
if ("errors" in body)
|
|
347
|
+
return undefined;
|
|
348
|
+
const entries = Object.entries(body);
|
|
349
|
+
if (entries.length === 0)
|
|
350
|
+
return undefined;
|
|
351
|
+
// Null prototype, for the same reason as the wrapped map: field names are
|
|
352
|
+
// data, and "__proto__" must land as an ordinary own property.
|
|
353
|
+
const fieldErrors = Object.create(null);
|
|
354
|
+
for (const [field, value] of entries) {
|
|
355
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
356
|
+
return undefined;
|
|
357
|
+
if (!value.every((m) => typeof m === "string" && m.length > 0))
|
|
358
|
+
return undefined;
|
|
359
|
+
fieldErrors[field] = value;
|
|
360
|
+
}
|
|
361
|
+
return fieldErrors;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Flattens a field-keyed errors map as "field: msg1; msg2, other: msg" —
|
|
365
|
+
* fields sorted lexicographically, a field's messages joined with "; ",
|
|
366
|
+
* fields joined with ", ". This shape is shared by all six SDKs; change it
|
|
367
|
+
* everywhere or nowhere.
|
|
368
|
+
*/
|
|
369
|
+
function flattenFieldErrors(fieldErrors) {
|
|
370
|
+
return Object.entries(fieldErrors)
|
|
371
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
372
|
+
.map(([field, messages]) => `${field}: ${messages.join("; ")}`)
|
|
373
|
+
.join(", ");
|
|
374
|
+
}
|
|
251
375
|
/**
|
|
252
376
|
* Parses the Retry-After header value.
|
|
253
377
|
* Supports both seconds (integer) and HTTP-date formats.
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;GAEG;AACH,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAS,EAAE,SAAiB,wBAAwB;IACvF,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACxC,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/generated/metadata.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC/C;AAED,QAAA,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/generated/metadata.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC/C;AAED,QAAA,MAAM,QAAQ,EAAE,cA4uGf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|