@clickup/rest-client 2.10.296 → 2.11.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.

Potentially problematic release.


This version of @clickup/rest-client might be problematic. Click here for more details.

Files changed (111) hide show
  1. package/.eslintrc.base.js +10 -1
  2. package/.eslintrc.js +4 -4
  3. package/.github/workflows/ci.yml +26 -0
  4. package/.github/workflows/semgrep.yml +36 -0
  5. package/.prettierrc +8 -0
  6. package/.vscode/extensions.json +8 -0
  7. package/.vscode/tasks.json +20 -0
  8. package/babel.config.js +5 -0
  9. package/dist/.eslintcache +1 -1
  10. package/dist/RestClient.d.ts +1 -3
  11. package/dist/RestClient.d.ts.map +1 -1
  12. package/dist/RestClient.js +3 -4
  13. package/dist/RestClient.js.map +1 -1
  14. package/dist/RestOptions.d.ts +2 -2
  15. package/dist/RestOptions.d.ts.map +1 -1
  16. package/dist/RestOptions.js +1 -0
  17. package/dist/RestOptions.js.map +1 -1
  18. package/dist/RestRequest.d.ts +0 -2
  19. package/dist/RestRequest.d.ts.map +1 -1
  20. package/dist/RestRequest.js +12 -5
  21. package/dist/RestRequest.js.map +1 -1
  22. package/dist/RestResponse.d.ts +0 -1
  23. package/dist/RestResponse.d.ts.map +1 -1
  24. package/dist/helpers/depaginate.js +1 -1
  25. package/dist/helpers/depaginate.js.map +1 -1
  26. package/dist/index.d.ts +2 -5
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -5
  29. package/dist/index.js.map +1 -1
  30. package/dist/internal/RestFetchReader.d.ts +3 -3
  31. package/dist/internal/RestFetchReader.d.ts.map +1 -1
  32. package/dist/internal/RestFetchReader.js +21 -11
  33. package/dist/internal/RestFetchReader.js.map +1 -1
  34. package/dist/internal/RestRangeUploader.d.ts +0 -1
  35. package/dist/internal/RestRangeUploader.d.ts.map +1 -1
  36. package/dist/internal/calcRetryDelay.js +1 -1
  37. package/dist/internal/calcRetryDelay.js.map +1 -1
  38. package/dist/internal/ellipsis.d.ts +6 -0
  39. package/dist/internal/ellipsis.d.ts.map +1 -0
  40. package/dist/internal/ellipsis.js +17 -0
  41. package/dist/internal/ellipsis.js.map +1 -0
  42. package/dist/internal/inferResBodyEncoding.d.ts +0 -1
  43. package/dist/internal/inferResBodyEncoding.d.ts.map +1 -1
  44. package/dist/internal/inferResBodyEncoding.js +1 -1
  45. package/dist/internal/inferResBodyEncoding.js.map +1 -1
  46. package/dist/internal/inspectPossibleJSON.d.ts +0 -2
  47. package/dist/internal/inspectPossibleJSON.d.ts.map +1 -1
  48. package/dist/internal/inspectPossibleJSON.js +6 -9
  49. package/dist/internal/inspectPossibleJSON.js.map +1 -1
  50. package/dist/internal/prependNewlineIfMultiline.js +1 -1
  51. package/dist/internal/prependNewlineIfMultiline.js.map +1 -1
  52. package/dist/internal/substituteParams.js +1 -1
  53. package/dist/internal/substituteParams.js.map +1 -1
  54. package/dist/internal/throwIfErrorResponse.js +2 -2
  55. package/dist/internal/throwIfErrorResponse.js.map +1 -1
  56. package/dist/internal/toFloatMs.js +1 -1
  57. package/dist/internal/toFloatMs.js.map +1 -1
  58. package/dist/middlewares/paceRequests.d.ts +21 -2
  59. package/dist/middlewares/paceRequests.d.ts.map +1 -1
  60. package/dist/middlewares/paceRequests.js +4 -3
  61. package/dist/middlewares/paceRequests.js.map +1 -1
  62. package/docs/interfaces/Pacer.md +7 -12
  63. package/docs/interfaces/PacerOutcome.md +25 -0
  64. package/docs/interfaces/RestOptions.md +22 -47
  65. package/docs/modules.md +4 -7
  66. package/internal/clean.sh +4 -0
  67. package/internal/deploy.sh +7 -0
  68. package/internal/docs.sh +6 -0
  69. package/internal/lint.sh +4 -0
  70. package/jest.config.base.js +18 -0
  71. package/jest.config.js +1 -10
  72. package/package.json +15 -10
  73. package/src/RestClient.ts +2 -2
  74. package/src/RestOptions.ts +3 -0
  75. package/src/RestRequest.ts +32 -5
  76. package/src/__tests__/RestClient.test.ts +53 -0
  77. package/src/__tests__/RestFetchReader.test.ts +154 -0
  78. package/src/__tests__/RestRequest.test.ts +262 -0
  79. package/src/__tests__/RestRequestCacheableLookup.test.ts +88 -0
  80. package/src/__tests__/RestStream.test.ts +67 -0
  81. package/src/__tests__/helpers.ts +173 -0
  82. package/src/index.ts +2 -7
  83. package/src/internal/RestFetchReader.ts +4 -1
  84. package/src/internal/ellipsis.ts +16 -0
  85. package/src/internal/inspectPossibleJSON.ts +1 -5
  86. package/src/internal/throwIfErrorResponse.ts +1 -1
  87. package/src/middlewares/paceRequests.ts +27 -2
  88. package/tsconfig.base.json +31 -0
  89. package/tsconfig.json +1 -31
  90. package/typedoc.config.js +20 -0
  91. package/dist/pacers/Pacer.d.ts +0 -21
  92. package/dist/pacers/Pacer.d.ts.map +0 -1
  93. package/dist/pacers/Pacer.js +0 -3
  94. package/dist/pacers/Pacer.js.map +0 -1
  95. package/dist/pacers/PacerComposite.d.ts +0 -14
  96. package/dist/pacers/PacerComposite.d.ts.map +0 -1
  97. package/dist/pacers/PacerComposite.js +0 -32
  98. package/dist/pacers/PacerComposite.js.map +0 -1
  99. package/dist/pacers/PacerQPS.d.ts +0 -53
  100. package/dist/pacers/PacerQPS.d.ts.map +0 -1
  101. package/dist/pacers/PacerQPS.js +0 -105
  102. package/dist/pacers/PacerQPS.js.map +0 -1
  103. package/docs/classes/PacerComposite.md +0 -66
  104. package/docs/classes/PacerQPS.md +0 -79
  105. package/docs/interfaces/PacerDelay.md +0 -25
  106. package/docs/interfaces/PacerQPSBackend.md +0 -44
  107. package/docs/interfaces/PacerQPSOptions.md +0 -40
  108. package/src/pacers/Pacer.ts +0 -22
  109. package/src/pacers/PacerComposite.ts +0 -29
  110. package/src/pacers/PacerQPS.ts +0 -147
  111. package/typedoc.json +0 -22
@@ -1,22 +0,0 @@
1
- /**
2
- * A result of some Pacer work.
3
- */
4
- export interface PacerDelay {
5
- delayMs: number;
6
- reason: string;
7
- }
8
-
9
- /**
10
- * Pacer is a class which allows to pace requests on some resource identified by
11
- * the instance of this class.
12
- */
13
- export default interface Pacer {
14
- /** Human readable name of the pacer, used when composing multiple pacers. */
15
- readonly name: string;
16
-
17
- /**
18
- * Signals that we're about to send a request. Returns the delay we need to
19
- * wait for before actually sending.
20
- */
21
- touch(): Promise<PacerDelay>;
22
- }
@@ -1,29 +0,0 @@
1
- import maxBy from "lodash/maxBy";
2
- import type Pacer from "./Pacer";
3
-
4
- /**
5
- * A Pacer which runs all sub-pacers and chooses the largest delay.
6
- */
7
- export default class PacerComposite implements Pacer {
8
- readonly name = "";
9
-
10
- constructor(private _pacers: Pacer[]) {}
11
-
12
- async touch() {
13
- const delays = await Promise["all"](
14
- this._pacers.map(async (pacer) => ({
15
- pacer,
16
- delay: await pacer.touch(),
17
- })),
18
- );
19
- const pair = maxBy(delays, ({ delay }) => delay.delayMs);
20
- return pair
21
- ? {
22
- ...pair.delay,
23
- reason: pair.pacer.name
24
- ? `${pair.pacer.constructor.name} ${pair.pacer.name}\n${pair.delay.reason}`
25
- : pair.delay.reason,
26
- }
27
- : { delayMs: 0, reason: "no pacers" };
28
- }
29
- }
@@ -1,147 +0,0 @@
1
- import random from "lodash/random";
2
- import type { PacerDelay } from "./Pacer";
3
- import type Pacer from "./Pacer";
4
-
5
- /** Start decreasing the delay (and thus speeding up requests) only when we have
6
- * less requests in the moving window than allowed by the desired QPS multiplied
7
- * by this factor. I.e. we don't speed up immediately when we're slow; we wait
8
- * until we're SLIGHTLY below the limits. */
9
- const DEFAULT_DECREASE_THRESHOLD = 0.75;
10
-
11
- /** Default moving window length. */
12
- const DEFAULT_WINDOW_SEC = 30;
13
-
14
- /** Below how many samples do we stop relying on samples to recalculate the
15
- * current fleet's average delay and instead keep using the previously
16
- * calculated (and saved) value for the delay. E.g. it doesn't make much sense
17
- * to rely on an average of 3-4 samples to calculate the average delay, it makes
18
- * sense to wait for more samples to come. */
19
- const MIN_COUNT_FOR_CENTRAL_TENDENCY = 10;
20
-
21
- /** The value here is multiplied by the fleet average to get the delay
22
- * increment/decrement step. It basically determines, in how many increments
23
- * would a "cold started" worker reach the current fleet's average delay. Or, in
24
- * how many steps would it reach delay=0 situation from the current fleet's
25
- * average if needed. */
26
- const DELAY_AVG_TO_STEP_FACTOR = 0.02;
27
-
28
- /** Delay increments are jittered by +/- this proportion. */
29
- const DELAY_STEP_JITTER = 0.1;
30
-
31
- export interface PacerQPSBackend {
32
- /** Resource key which this backend is operating on. */
33
- readonly key: string;
34
-
35
- /**
36
- * Maintains the array of numbers somewhere in memory (time-value pairs),
37
- * inserts a new time-value pair to the end of this list, and removes all the
38
- * entries which are earlier than `minTime`. Returns the size of the resulting
39
- * array and some central tendency statistics about its values.
40
- */
41
- push(props: {
42
- time: number;
43
- minTime: number;
44
- value: number;
45
- minCountForCentralTendency: number;
46
- }): Promise<{ count: number; sum: number; avg: number; median: number }>;
47
- }
48
-
49
- export interface PacerQPSOptions {
50
- /** The maximum QPS allowed within the rolling window. */
51
- qps: number;
52
- /** The length of the rolling windows in milliseconds. */
53
- windowSec?: number;
54
- /** Decrease the delay if the number of requests in the window has dropped
55
- * below `decreaseThreshold` portion of the limit. */
56
- decreaseThreshold?: number;
57
- }
58
-
59
- /**
60
- * Implements a very simple heuristic:
61
- * - increase the delay if we're above the QPS within the rolling window;
62
- * - decrease the delay if we're below the desired QPS.
63
- *
64
- * Each worker keeps (and grows/shrinks) its delay individually; this way, we
65
- * don't need to elect, who's the "source of truth" for the delay.
66
- *
67
- * Backend is a concrete (and minimal) implementation of the storage logic for
68
- * the pacing algorithm.
69
- */
70
- export default class PacerQPS implements Pacer {
71
- private _isFirstTouch = true;
72
- private _delay = 0;
73
-
74
- constructor(
75
- private _options: PacerQPSOptions,
76
- private _backend: PacerQPSBackend,
77
- ) {}
78
-
79
- get name() {
80
- return this._backend.key;
81
- }
82
-
83
- async touch(): Promise<PacerDelay> {
84
- const windowSec = this._options.windowSec ?? DEFAULT_WINDOW_SEC;
85
- const limit = Math.round(windowSec * this._options.qps);
86
- const decreaseThreshold =
87
- this._options.decreaseThreshold ?? DEFAULT_DECREASE_THRESHOLD;
88
-
89
- const time = Date.now();
90
- const delayPushed = this._delay;
91
- const { count, sum, avg, median } = await this._backend.push({
92
- time,
93
- minTime: time - windowSec * 1000,
94
- value: this._delay,
95
- minCountForCentralTendency: MIN_COUNT_FOR_CENTRAL_TENDENCY,
96
- });
97
- const sumDivCount = count ? sum / count : 0;
98
-
99
- // "Cold start": start with the fleet average delay.
100
- if (this._isFirstTouch && this._delay === 0) {
101
- this._delay = Math.round(avg);
102
- this._isFirstTouch = false;
103
- }
104
-
105
- // If we imagine there is only 1 worker in the fleet, what would be its
106
- // delay increment/decrement step. We use this number in a fallback
107
- // situation, when we don't know much about the entire fleet average delay
108
- // yet, or when this delay is too small to count on.
109
- const singleWorkerDelayStepMs = Math.round(
110
- ((windowSec * 1000) / limit) * DELAY_AVG_TO_STEP_FACTOR,
111
- );
112
-
113
- // Considering that there are multiple workers running, and that the current
114
- // average fleet's delay is representative, what would be a delay increment
115
- // to reach from delay=0 to that fleet's average delay.
116
- const multiWorkerDelayStepMs = Math.round(
117
- avg *
118
- DELAY_AVG_TO_STEP_FACTOR *
119
- random(1 - DELAY_STEP_JITTER, 1 + DELAY_STEP_JITTER, true),
120
- );
121
-
122
- // If average fleet delay is not representative yet, we fallback to a
123
- // single-worker delay increment.
124
- const delayStepMs = multiWorkerDelayStepMs || singleWorkerDelayStepMs || 1;
125
-
126
- if (count > limit) {
127
- // Increase the delay if the limit is reached. There is no "max delay":
128
- // imagine we have 10 QPS limit and 10000 users; it's obvious that in this
129
- // case, the delay between requests per a single user will be gigantic.
130
- this._delay += delayStepMs;
131
- } else if (count < limit * decreaseThreshold) {
132
- // Decrease the delay if we're significantly under the limit.
133
- this._delay = Math.max(0, this._delay - delayStepMs);
134
- }
135
-
136
- return {
137
- delayMs: this._delay,
138
- reason: [
139
- `count=${count} per ${windowSec}s (limit=${limit})`,
140
- `delay=${this._delay} step=${delayStepMs} delayPushed=${delayPushed}`,
141
- `median=${Math.round(median)}`,
142
- `sum/count=${Math.round(sumDivCount)}`,
143
- `avg=${Math.round(avg)}`,
144
- ].join("\n"),
145
- };
146
- }
147
- }
package/typedoc.json DELETED
@@ -1,22 +0,0 @@
1
- {
2
- "entryPoints": ["src"],
3
- "exclude": [
4
- "**/internal/**",
5
- "**/__tests__/**",
6
- "**/node_modules/**",
7
- "**/node-fetch/**"
8
- ],
9
- "entryPointStrategy": "expand",
10
- "mergeModulesMergeMode": "project",
11
- "sort": ["source-order"],
12
- "out": "docs",
13
- "logLevel": "Warn",
14
- "hideGenerator": true,
15
- "excludeInternal": true,
16
- "excludePrivate": true,
17
- "categorizeByGroup": true,
18
- "hideInPageTOC": true,
19
- "gitRevision": "master",
20
- "sourceLinkTemplate": "https://github.com/clickup/rest-client/blob/master/{path}#L{line}",
21
- "basePath": "."
22
- }