@s2-dev/streamstore 0.17.5 → 0.18.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 (160) hide show
  1. package/README.md +69 -1
  2. package/dist/cjs/accessTokens.d.ts +3 -2
  3. package/dist/cjs/accessTokens.d.ts.map +1 -1
  4. package/dist/cjs/accessTokens.js +22 -37
  5. package/dist/cjs/accessTokens.js.map +1 -1
  6. package/dist/cjs/basin.d.ts +4 -3
  7. package/dist/cjs/basin.d.ts.map +1 -1
  8. package/dist/cjs/basin.js +7 -5
  9. package/dist/cjs/basin.js.map +1 -1
  10. package/dist/cjs/basins.d.ts +10 -10
  11. package/dist/cjs/basins.d.ts.map +1 -1
  12. package/dist/cjs/basins.js +36 -64
  13. package/dist/cjs/basins.js.map +1 -1
  14. package/dist/cjs/batch-transform.d.ts +1 -1
  15. package/dist/cjs/batch-transform.d.ts.map +1 -1
  16. package/dist/cjs/batch-transform.js +36 -5
  17. package/dist/cjs/batch-transform.js.map +1 -1
  18. package/dist/cjs/common.d.ts +42 -0
  19. package/dist/cjs/common.d.ts.map +1 -1
  20. package/dist/cjs/error.d.ts +40 -2
  21. package/dist/cjs/error.d.ts.map +1 -1
  22. package/dist/cjs/error.js +268 -2
  23. package/dist/cjs/error.js.map +1 -1
  24. package/dist/cjs/generated/client/types.gen.d.ts +7 -0
  25. package/dist/cjs/generated/client/types.gen.d.ts.map +1 -1
  26. package/dist/cjs/generated/client/utils.gen.d.ts +1 -0
  27. package/dist/cjs/generated/client/utils.gen.d.ts.map +1 -1
  28. package/dist/cjs/generated/client/utils.gen.js.map +1 -1
  29. package/dist/cjs/generated/core/types.gen.d.ts +2 -0
  30. package/dist/cjs/generated/core/types.gen.d.ts.map +1 -1
  31. package/dist/cjs/index.d.ts +46 -3
  32. package/dist/cjs/index.d.ts.map +1 -1
  33. package/dist/cjs/index.js +28 -2
  34. package/dist/cjs/index.js.map +1 -1
  35. package/dist/cjs/lib/result.d.ts +57 -0
  36. package/dist/cjs/lib/result.d.ts.map +1 -0
  37. package/dist/cjs/lib/result.js +43 -0
  38. package/dist/cjs/lib/result.js.map +1 -0
  39. package/dist/cjs/lib/retry.d.ts +151 -0
  40. package/dist/cjs/lib/retry.d.ts.map +1 -0
  41. package/dist/cjs/lib/retry.js +839 -0
  42. package/dist/cjs/lib/retry.js.map +1 -0
  43. package/dist/cjs/lib/stream/factory.d.ts +0 -1
  44. package/dist/cjs/lib/stream/factory.d.ts.map +1 -1
  45. package/dist/cjs/lib/stream/factory.js +0 -1
  46. package/dist/cjs/lib/stream/factory.js.map +1 -1
  47. package/dist/cjs/lib/stream/transport/fetch/index.d.ts +24 -32
  48. package/dist/cjs/lib/stream/transport/fetch/index.d.ts.map +1 -1
  49. package/dist/cjs/lib/stream/transport/fetch/index.js +247 -187
  50. package/dist/cjs/lib/stream/transport/fetch/index.js.map +1 -1
  51. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts +1 -2
  52. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts.map +1 -1
  53. package/dist/cjs/lib/stream/transport/fetch/shared.js +49 -72
  54. package/dist/cjs/lib/stream/transport/fetch/shared.js.map +1 -1
  55. package/dist/cjs/lib/stream/transport/s2s/index.d.ts +0 -1
  56. package/dist/cjs/lib/stream/transport/s2s/index.d.ts.map +1 -1
  57. package/dist/cjs/lib/stream/transport/s2s/index.js +309 -352
  58. package/dist/cjs/lib/stream/transport/s2s/index.js.map +1 -1
  59. package/dist/cjs/lib/stream/types.d.ts +102 -8
  60. package/dist/cjs/lib/stream/types.d.ts.map +1 -1
  61. package/dist/cjs/metrics.d.ts +3 -2
  62. package/dist/cjs/metrics.d.ts.map +1 -1
  63. package/dist/cjs/metrics.js +24 -39
  64. package/dist/cjs/metrics.js.map +1 -1
  65. package/dist/cjs/s2.d.ts +1 -0
  66. package/dist/cjs/s2.d.ts.map +1 -1
  67. package/dist/cjs/s2.js +14 -3
  68. package/dist/cjs/s2.js.map +1 -1
  69. package/dist/cjs/stream.d.ts +5 -3
  70. package/dist/cjs/stream.d.ts.map +1 -1
  71. package/dist/cjs/stream.js +29 -18
  72. package/dist/cjs/stream.js.map +1 -1
  73. package/dist/cjs/streams.d.ts +10 -10
  74. package/dist/cjs/streams.d.ts.map +1 -1
  75. package/dist/cjs/streams.js +36 -64
  76. package/dist/cjs/streams.js.map +1 -1
  77. package/dist/cjs/utils.d.ts +3 -3
  78. package/dist/cjs/utils.d.ts.map +1 -1
  79. package/dist/cjs/utils.js +3 -3
  80. package/dist/cjs/utils.js.map +1 -1
  81. package/dist/esm/accessTokens.d.ts +3 -2
  82. package/dist/esm/accessTokens.d.ts.map +1 -1
  83. package/dist/esm/accessTokens.js +23 -38
  84. package/dist/esm/accessTokens.js.map +1 -1
  85. package/dist/esm/basin.d.ts +4 -3
  86. package/dist/esm/basin.d.ts.map +1 -1
  87. package/dist/esm/basin.js +7 -5
  88. package/dist/esm/basin.js.map +1 -1
  89. package/dist/esm/basins.d.ts +10 -10
  90. package/dist/esm/basins.d.ts.map +1 -1
  91. package/dist/esm/basins.js +37 -65
  92. package/dist/esm/basins.js.map +1 -1
  93. package/dist/esm/batch-transform.d.ts +1 -1
  94. package/dist/esm/batch-transform.d.ts.map +1 -1
  95. package/dist/esm/batch-transform.js +37 -6
  96. package/dist/esm/batch-transform.js.map +1 -1
  97. package/dist/esm/common.d.ts +42 -0
  98. package/dist/esm/common.d.ts.map +1 -1
  99. package/dist/esm/error.d.ts +40 -2
  100. package/dist/esm/error.d.ts.map +1 -1
  101. package/dist/esm/error.js +260 -2
  102. package/dist/esm/error.js.map +1 -1
  103. package/dist/esm/generated/client/types.gen.d.ts +7 -0
  104. package/dist/esm/generated/client/types.gen.d.ts.map +1 -1
  105. package/dist/esm/generated/client/utils.gen.d.ts +1 -0
  106. package/dist/esm/generated/client/utils.gen.d.ts.map +1 -1
  107. package/dist/esm/generated/client/utils.gen.js.map +1 -1
  108. package/dist/esm/generated/core/types.gen.d.ts +2 -0
  109. package/dist/esm/generated/core/types.gen.d.ts.map +1 -1
  110. package/dist/esm/index.d.ts +46 -3
  111. package/dist/esm/index.d.ts.map +1 -1
  112. package/dist/esm/index.js +23 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/lib/result.d.ts +57 -0
  115. package/dist/esm/lib/result.d.ts.map +1 -0
  116. package/dist/esm/lib/result.js +37 -0
  117. package/dist/esm/lib/result.js.map +1 -0
  118. package/dist/esm/lib/retry.d.ts +151 -0
  119. package/dist/esm/lib/retry.d.ts.map +1 -0
  120. package/dist/esm/lib/retry.js +830 -0
  121. package/dist/esm/lib/retry.js.map +1 -0
  122. package/dist/esm/lib/stream/factory.d.ts +0 -1
  123. package/dist/esm/lib/stream/factory.d.ts.map +1 -1
  124. package/dist/esm/lib/stream/factory.js +0 -1
  125. package/dist/esm/lib/stream/factory.js.map +1 -1
  126. package/dist/esm/lib/stream/transport/fetch/index.d.ts +24 -32
  127. package/dist/esm/lib/stream/transport/fetch/index.d.ts.map +1 -1
  128. package/dist/esm/lib/stream/transport/fetch/index.js +247 -187
  129. package/dist/esm/lib/stream/transport/fetch/index.js.map +1 -1
  130. package/dist/esm/lib/stream/transport/fetch/shared.d.ts +1 -2
  131. package/dist/esm/lib/stream/transport/fetch/shared.d.ts.map +1 -1
  132. package/dist/esm/lib/stream/transport/fetch/shared.js +51 -74
  133. package/dist/esm/lib/stream/transport/fetch/shared.js.map +1 -1
  134. package/dist/esm/lib/stream/transport/s2s/index.d.ts +0 -1
  135. package/dist/esm/lib/stream/transport/s2s/index.d.ts.map +1 -1
  136. package/dist/esm/lib/stream/transport/s2s/index.js +310 -353
  137. package/dist/esm/lib/stream/transport/s2s/index.js.map +1 -1
  138. package/dist/esm/lib/stream/types.d.ts +102 -8
  139. package/dist/esm/lib/stream/types.d.ts.map +1 -1
  140. package/dist/esm/metrics.d.ts +3 -2
  141. package/dist/esm/metrics.d.ts.map +1 -1
  142. package/dist/esm/metrics.js +25 -40
  143. package/dist/esm/metrics.js.map +1 -1
  144. package/dist/esm/s2.d.ts +1 -0
  145. package/dist/esm/s2.d.ts.map +1 -1
  146. package/dist/esm/s2.js +14 -3
  147. package/dist/esm/s2.js.map +1 -1
  148. package/dist/esm/stream.d.ts +5 -3
  149. package/dist/esm/stream.d.ts.map +1 -1
  150. package/dist/esm/stream.js +30 -19
  151. package/dist/esm/stream.js.map +1 -1
  152. package/dist/esm/streams.d.ts +10 -10
  153. package/dist/esm/streams.d.ts.map +1 -1
  154. package/dist/esm/streams.js +37 -65
  155. package/dist/esm/streams.js.map +1 -1
  156. package/dist/esm/utils.d.ts +3 -3
  157. package/dist/esm/utils.d.ts.map +1 -1
  158. package/dist/esm/utils.js +2 -2
  159. package/dist/esm/utils.js.map +1 -1
  160. package/package.json +4 -5
package/README.md CHANGED
@@ -54,9 +54,77 @@ This TypeScript SDK is an ergonomic way to consume the [S2 REST API](https://s2.
54
54
  console.log("My basins:", basins.basins.map((basin) => basin.name));
55
55
  ```
56
56
 
57
+ ## Configuration and retries
58
+
59
+ The `S2` client and stream sessions support configurable retry behavior:
60
+
61
+ - Configure global retry behavior when constructing `S2`:
62
+
63
+ ```ts
64
+ import { S2 } from "@s2-dev/streamstore";
65
+
66
+ const s2 = new S2({
67
+ accessToken: process.env.S2_ACCESS_TOKEN!,
68
+ retry: {
69
+ // Total attempts including the first call (1 = no retries)
70
+ maxAttempts: 3,
71
+ // Base delay (ms) between attempts; jitter is applied
72
+ retryBackoffDurationMillis: 100,
73
+ // Retry policy for append operations (see API docs for details)
74
+ appendRetryPolicy: "noSideEffects",
75
+ // Maximum time (ms) to wait for an append ack before treating it as failed
76
+ requestTimeoutMillis: 5000,
77
+ },
78
+ });
79
+ ```
80
+
81
+ - Stream append/read sessions created from `S2.basin(...).stream(...)` inherit this retry configuration.
82
+ - The `appendRetryPolicy` dictates how failed appends should be retried. If you are not using a concurrency control like `match_seq_num`, then retrying a failed append could result in duplicate data, depending on the nature of the failure. This policy can be set to tolerate potential duplicates by retrying all failures (`"all"`) or only failures guaranteed not to have had a side effect (`"noSideEffects"`). In most cases, `"noSideEffects"` is the safer default unless you have explicit deduplication downstream.
83
+
84
+ See the generated API docs for the full description of `RetryConfig`, `AppendRetryPolicy` and `AppendSessionOptions`.
85
+
86
+ ## Append sessions
87
+
88
+ The `AppendSession` represents a session for appending batches of records to a stream. There are two ways of interacting with an append session:
89
+ - via `submit(...)`, which returns a `Promise<AppendAck>` that resolves when the batch is acknowledged by S2.
90
+ - via the session's `.readable` and `.writable` streams (`ReadableStream<AppendAck>` / `WritableStream<AppendArgs>`).
91
+
92
+ You obtain an append session from a stream via:
93
+
94
+ ```ts
95
+ const session = await stream.appendSession();
96
+ ```
97
+
98
+ All batches submitted to the same append session will be made durable in the same order as they are submitted, regardless of which method is used. Batches _can_ be duplicated, however, depending on the `appendRetryPolicy` used.
99
+
100
+ ### Transports
101
+
102
+ The append session supports two transports:
103
+ - One based on `fetch`
104
+ - Another which uses our custom [`s2s` protocol](https://s2.dev/docs/rest/records/overview#s2s-spec) over HTTP/2.
105
+
106
+ When possible, the `s2s` protocol is preferred as it allows for safe pipelining of concurrent appends over the same session, while still enforcing ordering across batches. This can't be guaranteed with the `fetch`-based transport, so it will not pipeline writes (effectively meaning there can only be one inflight, unacknowledged append at a time, thus limiting throughput).
107
+
108
+ This SDK will attempt to detect whether `s2s` can be used (if the runtime has `node:http2` support), and select a transport accordingly. The transport detection also be overridden via the `forceTransport` option when creating a stream client:
109
+
110
+ ```typescript
111
+ const stream = s2
112
+ .basin("my-basin")
113
+ .stream("my-stream", { forceTransport: "fetch" });
114
+ ```
115
+
116
+ ### Backpressure
117
+
118
+ Only writing via `WritableStream` reflects backpressure. A `write(...)` call will resolve as soon as the batch is enqueued for transmission, and will block until there is capacity.
119
+
120
+ Enqueuing a batch means that the session has accepted the batch, and that it is now inflight. It _doesn't_ mean that the batch has been acknowledged by S2. Because of this, if using `WritableStream`, you should also make sure to `close()` the session, as otherwise you may miss a failure. Only after closing the writer without error can the upstream contents be considered to have been safely appended to the stream.
121
+
122
+ The `AppendSession` controls how many batches can be inflight at a given time, which is the origin of backpressure. This can be configured by setting either `maxInflightBatches` or `maxInflightBytes` on `AppendSessionOptions`. Writes will block until there is capacity, thus exerting backpressure on upstream writers.
123
+
124
+
57
125
  ## Examples
58
126
 
59
- The [`examples`](./examples) directory in this repository contains a variety of
127
+ The [`examples`](https://github.com/s2-streamstore/s2-sdk-typescript/tree/main/examples) directory in this repository contains a variety of
60
128
  example use cases demonstrating how to use the SDK effectively.
61
129
 
62
130
  Run any example using the following command:
@@ -1,4 +1,4 @@
1
- import type { DataToObject, S2RequestOptions } from "./common.js";
1
+ import type { DataToObject, RetryConfig, S2RequestOptions } from "./common.js";
2
2
  import type { Client } from "./generated/client/types.gen.js";
3
3
  import { type IssueAccessTokenData, type ListAccessTokensData, type RevokeAccessTokenData } from "./generated/index.js";
4
4
  export interface ListAccessTokensArgs extends DataToObject<ListAccessTokensData> {
@@ -9,7 +9,8 @@ export interface RevokeAccessTokenArgs extends DataToObject<RevokeAccessTokenDat
9
9
  }
10
10
  export declare class S2AccessTokens {
11
11
  readonly client: Client;
12
- constructor(client: Client);
12
+ private readonly retryConfig?;
13
+ constructor(client: Client, retryConfig?: RetryConfig);
13
14
  /**
14
15
  * List access tokens.
15
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"accessTokens.d.ts","sourceRoot":"","sources":["../../src/accessTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EACN,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAEzB,KAAK,qBAAqB,EAE1B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,oBAChB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;CAAG;AAC9C,MAAM,WAAW,oBAChB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;CAAG;AAC9C,MAAM,WAAW,qBAChB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;CAAG;AAE/C,qBAAa,cAAc;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;IAI1B;;;;;;OAMG;IACU,IAAI,CAAC,IAAI,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAkBzE;;;;;;;OAOG;IACU,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAkBzE;;;;OAIG;IACU,MAAM,CAAC,IAAI,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAiB3E"}
1
+ {"version":3,"file":"accessTokens.d.ts","sourceRoot":"","sources":["../../src/accessTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EACN,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAEzB,KAAK,qBAAqB,EAE1B,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,oBAChB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;CAAG;AAC9C,MAAM,WAAW,oBAChB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;CAAG;AAC9C,MAAM,WAAW,qBAChB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;CAAG;AAE/C,qBAAa,cAAc;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;gBAE/B,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAKrD;;;;;;OAMG;IACU,IAAI,CAAC,IAAI,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAYzE;;;;;;;OAOG;IACU,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAYzE;;;;OAIG;IACU,MAAM,CAAC,IAAI,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAW3E"}
@@ -3,10 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.S2AccessTokens = void 0;
4
4
  const error_js_1 = require("./error.js");
5
5
  const index_js_1 = require("./generated/index.js");
6
+ const retry_js_1 = require("./lib/retry.js");
6
7
  class S2AccessTokens {
7
8
  client;
8
- constructor(client) {
9
+ retryConfig;
10
+ constructor(client, retryConfig) {
9
11
  this.client = client;
12
+ this.retryConfig = retryConfig;
10
13
  }
11
14
  /**
12
15
  * List access tokens.
@@ -16,19 +19,13 @@ class S2AccessTokens {
16
19
  * @param args.limit Max results (up to 1000)
17
20
  */
18
21
  async list(args, options) {
19
- const response = await (0, index_js_1.listAccessTokens)({
20
- client: this.client,
21
- query: args,
22
- ...options,
22
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
23
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.listAccessTokens)({
24
+ client: this.client,
25
+ query: args,
26
+ ...options,
27
+ }));
23
28
  });
24
- if (response.error) {
25
- throw new error_js_1.S2Error({
26
- message: response.error.message,
27
- code: response.error.code ?? undefined,
28
- status: response.response.status,
29
- });
30
- }
31
- return response.data;
32
29
  }
33
30
  /**
34
31
  * Issue a new access token.
@@ -39,19 +36,13 @@ class S2AccessTokens {
39
36
  * @param args.expires_at Expiration in ISO 8601; defaults to requestor's token expiry
40
37
  */
41
38
  async issue(args, options) {
42
- const response = await (0, index_js_1.issueAccessToken)({
43
- client: this.client,
44
- body: args,
45
- ...options,
39
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
40
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.issueAccessToken)({
41
+ client: this.client,
42
+ body: args,
43
+ ...options,
44
+ }));
46
45
  });
47
- if (response.error) {
48
- throw new error_js_1.S2Error({
49
- message: response.error.message,
50
- code: response.error.code ?? undefined,
51
- status: response.response.status,
52
- });
53
- }
54
- return response.data;
55
46
  }
56
47
  /**
57
48
  * Revoke an access token by ID.
@@ -59,19 +50,13 @@ class S2AccessTokens {
59
50
  * @param args.id Token ID to revoke
60
51
  */
61
52
  async revoke(args, options) {
62
- const response = await (0, index_js_1.revokeAccessToken)({
63
- client: this.client,
64
- path: args,
65
- ...options,
53
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
54
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.revokeAccessToken)({
55
+ client: this.client,
56
+ path: args,
57
+ ...options,
58
+ }));
66
59
  });
67
- if (response.error) {
68
- throw new error_js_1.S2Error({
69
- message: response.error.message,
70
- code: response.error.code ?? undefined,
71
- status: response.response.status,
72
- });
73
- }
74
- return response.data;
75
60
  }
76
61
  }
77
62
  exports.S2AccessTokens = S2AccessTokens;
@@ -1 +1 @@
1
- {"version":3,"file":"accessTokens.js","sourceRoot":"","sources":["../../src/accessTokens.ts"],"names":[],"mappings":";;;AACA,yCAAqC;AAErC,mDAO8B;AAS9B,MAAa,cAAc;IACjB,MAAM,CAAS;IAExB,YAAY,MAAc;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CAAC,IAA2B,EAAE,OAA0B;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAA,2BAAgB,EAAC;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI;YACX,GAAG,OAAO;SACV,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,kBAAO,CAAC;gBACjB,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;gBAC/B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS;gBACtC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;aAChC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,KAAK,CAAC,IAA0B,EAAE,OAA0B;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAA,2BAAgB,EAAC;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI;YACV,GAAG,OAAO;SACV,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,kBAAO,CAAC;gBACjB,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;gBAC/B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS;gBACtC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;aAChC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAAC,IAA2B,EAAE,OAA0B;QAC1E,MAAM,QAAQ,GAAG,MAAM,IAAA,4BAAiB,EAAC;YACxC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI;YACV,GAAG,OAAO;SACV,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,kBAAO,CAAC;gBACjB,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;gBAC/B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS;gBACtC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;aAChC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;CACD;AAhFD,wCAgFC"}
1
+ {"version":3,"file":"accessTokens.js","sourceRoot":"","sources":["../../src/accessTokens.ts"],"names":[],"mappings":";;;AACA,yCAAiD;AAEjD,mDAO8B;AAC9B,6CAA6C;AAS7C,MAAa,cAAc;IACjB,MAAM,CAAS;IACP,WAAW,CAAe;IAE3C,YAAY,MAAc,EAAE,WAAyB;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CAAC,IAA2B,EAAE,OAA0B;QACxE,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,2BAAgB,EAAC;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI;gBACX,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,KAAK,CAAC,IAA0B,EAAE,OAA0B;QACxE,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,2BAAgB,EAAC;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI;gBACV,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAAC,IAA2B,EAAE,OAA0B;QAC1E,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,4BAAiB,EAAC;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI;gBACV,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAhED,wCAgEC"}
@@ -1,3 +1,4 @@
1
+ import type { RetryConfig } from "./common.js";
1
2
  import * as Redacted from "./lib/redacted.js";
2
3
  import type { SessionTransports } from "./lib/stream/types.js";
3
4
  import { S2Stream } from "./stream.js";
@@ -5,6 +6,7 @@ import { S2Streams } from "./streams.js";
5
6
  export declare class S2Basin {
6
7
  private readonly client;
7
8
  private readonly transportConfig;
9
+ private readonly retryConfig?;
8
10
  readonly name: string;
9
11
  readonly streams: S2Streams;
10
12
  /**
@@ -12,14 +14,13 @@ export declare class S2Basin {
12
14
  *
13
15
  * Use this to work with streams inside a single basin.
14
16
  * @param name Basin name
15
- * @param accessToken Redacted access token from the parent `S2` client
16
- * @param baseUrl Base URL for the basin (e.g. `https://my-basin.b.aws.s2.dev/v1`)
17
- * @param includeBasinHeader Include the `S2-Basin` header with the request
17
+ * @param options Configuration for the basin-scoped client
18
18
  */
19
19
  constructor(name: string, options: {
20
20
  accessToken: Redacted.Redacted;
21
21
  baseUrl: string;
22
22
  includeBasinHeader: boolean;
23
+ retryConfig?: RetryConfig;
23
24
  });
24
25
  /**
25
26
  * Create a stream-scoped helper bound to `this` basin.
@@ -1 +1 @@
1
- {"version":3,"file":"basin.d.ts","sourceRoot":"","sources":["../../src/basin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,OAAO;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,EAAE,SAAS,CAAC;IAEnC;;;;;;;;OAQG;gBAEF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,kBAAkB,EAAE,OAAO,CAAC;KAC5B;IAiBF;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;CAMnD;AAED,MAAM,WAAW,aAAa;IAC7B,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACnC"}
1
+ {"version":3,"file":"basin.d.ts","sourceRoot":"","sources":["../../src/basin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,OAAO;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,EAAE,SAAS,CAAC;IAEnC;;;;;;OAMG;gBAEF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;KAC1B;IAqBF;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;CAWnD;AAED,MAAM,WAAW,aAAa;IAC7B,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACnC"}
package/dist/cjs/basin.js CHANGED
@@ -8,6 +8,7 @@ const streams_js_1 = require("./streams.js");
8
8
  class S2Basin {
9
9
  client;
10
10
  transportConfig;
11
+ retryConfig;
11
12
  name;
12
13
  streams;
13
14
  /**
@@ -15,22 +16,23 @@ class S2Basin {
15
16
  *
16
17
  * Use this to work with streams inside a single basin.
17
18
  * @param name Basin name
18
- * @param accessToken Redacted access token from the parent `S2` client
19
- * @param baseUrl Base URL for the basin (e.g. `https://my-basin.b.aws.s2.dev/v1`)
20
- * @param includeBasinHeader Include the `S2-Basin` header with the request
19
+ * @param options Configuration for the basin-scoped client
21
20
  */
22
21
  constructor(name, options) {
23
22
  this.name = name;
23
+ this.retryConfig = options.retryConfig;
24
24
  this.transportConfig = {
25
25
  baseUrl: options.baseUrl,
26
26
  accessToken: options.accessToken,
27
+ basinName: options.includeBasinHeader ? name : undefined,
28
+ retry: options.retryConfig,
27
29
  };
28
30
  this.client = (0, index_js_1.createClient)((0, index_js_1.createConfig)({
29
31
  baseUrl: options.baseUrl,
30
32
  auth: () => Redacted.value(this.transportConfig.accessToken),
31
33
  headers: options.includeBasinHeader ? { "s2-basin": name } : {},
32
34
  }));
33
- this.streams = new streams_js_1.S2Streams(this.client);
35
+ this.streams = new streams_js_1.S2Streams(this.client, this.retryConfig);
34
36
  }
35
37
  /**
36
38
  * Create a stream-scoped helper bound to `this` basin.
@@ -40,7 +42,7 @@ class S2Basin {
40
42
  return new stream_js_1.S2Stream(name, this.client, {
41
43
  ...this.transportConfig,
42
44
  forceTransport: options?.forceTransport,
43
- });
45
+ }, this.retryConfig);
44
46
  }
45
47
  }
46
48
  exports.S2Basin = S2Basin;
@@ -1 +1 @@
1
- {"version":3,"file":"basin.js","sourceRoot":"","sources":["../../src/basin.ts"],"names":[],"mappings":";;;AAAA,0DAAyE;AAEzE,8CAA8C;AAE9C,2CAAuC;AACvC,6CAAyC;AAEzC,MAAa,OAAO;IACF,MAAM,CAAS;IACf,eAAe,CAAkB;IAClC,IAAI,CAAS;IACb,OAAO,CAAY;IAEnC;;;;;;;;OAQG;IACH,YACC,IAAY,EACZ,OAIC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,eAAe,GAAG;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;SAChC,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAA,uBAAY,EACzB,IAAA,uBAAY,EAAC;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;YAC5D,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;SAC/D,CAAC,CACF,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,IAAY,EAAE,OAAuB;QAClD,OAAO,IAAI,oBAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACtC,GAAG,IAAI,CAAC,eAAe;YACvB,cAAc,EAAE,OAAO,EAAE,cAAc;SACvC,CAAC,CAAC;IACJ,CAAC;CACD;AAhDD,0BAgDC"}
1
+ {"version":3,"file":"basin.js","sourceRoot":"","sources":["../../src/basin.ts"],"names":[],"mappings":";;;AACA,0DAAyE;AAEzE,8CAA8C;AAE9C,2CAAuC;AACvC,6CAAyC;AAEzC,MAAa,OAAO;IACF,MAAM,CAAS;IACf,eAAe,CAAkB;IACjC,WAAW,CAAe;IAC3B,IAAI,CAAS;IACb,OAAO,CAAY;IAEnC;;;;;;OAMG;IACH,YACC,IAAY,EACZ,OAKC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxD,KAAK,EAAE,OAAO,CAAC,WAAW;SAC1B,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAA,uBAAY,EACzB,IAAA,uBAAY,EAAC;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;YAC5D,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;SAC/D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,IAAY,EAAE,OAAuB;QAClD,OAAO,IAAI,oBAAQ,CAClB,IAAI,EACJ,IAAI,CAAC,MAAM,EACX;YACC,GAAG,IAAI,CAAC,eAAe;YACvB,cAAc,EAAE,OAAO,EAAE,cAAc;SACvC,EACD,IAAI,CAAC,WAAW,CAChB,CAAC;IACH,CAAC;CACD;AAzDD,0BAyDC"}
@@ -1,6 +1,6 @@
1
- import type { DataToObject, S2RequestOptions } from "./common.js";
1
+ import type { DataToObject, RetryConfig, S2RequestOptions } from "./common.js";
2
2
  import type { Client } from "./generated/client/types.gen.js";
3
- import { type CreateBasinData, type DeleteBasinData, type GetBasinConfigData, type ListBasinsData, type ReconfigureBasinData } from "./generated/index.js";
3
+ import { type BasinConfig, type CreateBasinData, type CreateBasinResponse, type DeleteBasinData, type GetBasinConfigData, type ListBasinsData, type ListBasinsResponse, type ReconfigureBasinData, type ReconfigureBasinResponse } from "./generated/index.js";
4
4
  export interface ListBasinsArgs extends DataToObject<ListBasinsData> {
5
5
  }
6
6
  export interface CreateBasinArgs extends DataToObject<CreateBasinData> {
@@ -13,7 +13,8 @@ export interface ReconfigureBasinArgs extends DataToObject<ReconfigureBasinData>
13
13
  }
14
14
  export declare class S2Basins {
15
15
  private readonly client;
16
- constructor(client: Client);
16
+ private readonly retryConfig;
17
+ constructor(client: Client, retryConfig: RetryConfig);
17
18
  /**
18
19
  * List basins.
19
20
  *
@@ -21,7 +22,7 @@ export declare class S2Basins {
21
22
  * @param args.start_after Name to start after (for pagination)
22
23
  * @param args.limit Max results (up to 1000)
23
24
  */
24
- list(args?: ListBasinsArgs, options?: S2RequestOptions): Promise<import("./generated/types.gen.js").ListBasinsResponse>;
25
+ list(args?: ListBasinsArgs, options?: S2RequestOptions): Promise<ListBasinsResponse>;
25
26
  /**
26
27
  * Create a basin.
27
28
  *
@@ -29,25 +30,24 @@ export declare class S2Basins {
29
30
  * @param args.config Optional basin configuration (e.g. default stream config)
30
31
  * @param args.scope Basin scope
31
32
  */
32
- create(args: CreateBasinArgs, options?: S2RequestOptions): Promise<import("./generated/types.gen.js").BasinInfo>;
33
+ create(args: CreateBasinArgs, options?: S2RequestOptions): Promise<CreateBasinResponse>;
33
34
  /**
34
35
  * Get basin configuration.
35
36
  *
36
37
  * @param args.basin Basin name
37
38
  */
38
- getConfig(args: GetBasinConfigArgs, options?: S2RequestOptions): Promise<import("./generated/types.gen.js").BasinConfig>;
39
+ getConfig(args: GetBasinConfigArgs, options?: S2RequestOptions): Promise<BasinConfig>;
39
40
  /**
40
41
  * Delete a basin.
41
42
  *
42
43
  * @param args.basin Basin name
43
44
  */
44
- delete(args: DeleteBasinArgs, options?: S2RequestOptions): Promise<unknown>;
45
+ delete(args: DeleteBasinArgs, options?: S2RequestOptions): Promise<void>;
45
46
  /**
46
47
  * Reconfigure a basin.
47
48
  *
48
- * @param args.basin Basin name
49
- * @param args.body Configuration fields to change (e.g. default stream config)
49
+ * @param args Configuration for the basin to reconfigure (including basin name and fields to change)
50
50
  */
51
- reconfigure(args: ReconfigureBasinArgs, options?: S2RequestOptions): Promise<import("./generated/types.gen.js").BasinConfig>;
51
+ reconfigure(args: ReconfigureBasinArgs, options?: S2RequestOptions): Promise<ReconfigureBasinResponse>;
52
52
  }
53
53
  //# sourceMappingURL=basins.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"basins.d.ts","sourceRoot":"","sources":["../../src/basins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EACN,KAAK,eAAe,EAEpB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EAEnB,KAAK,oBAAoB,EAEzB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,cAAe,SAAQ,YAAY,CAAC,cAAc,CAAC;CAAG;AACvE,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,eAAe,CAAC;CAAG;AACzE,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,kBAAkB,CAAC;CAAG;AAC/E,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,eAAe,CAAC;CAAG;AACzE,MAAM,WAAW,oBAChB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;CAAG;AAE9C,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAI1B;;;;;;OAMG;IACU,IAAI,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAkBnE;;;;;;OAMG;IACU,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAkBrE;;;;OAIG;IACU,SAAS,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAkB3E;;;;OAIG;IACU,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAkBrE;;;;;OAKG;IACU,WAAW,CACvB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,CAAC,EAAE,gBAAgB;CAmB3B"}
1
+ {"version":3,"file":"basins.d.ts","sourceRoot":"","sources":["../../src/basins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAExB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAEvB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAE7B,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,cAAe,SAAQ,YAAY,CAAC,cAAc,CAAC;CAAG;AACvE,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,eAAe,CAAC;CAAG;AACzE,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,kBAAkB,CAAC;CAAG;AAC/E,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,eAAe,CAAC;CAAG;AACzE,MAAM,WAAW,oBAChB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;CAAG;AAE9C,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAKpD;;;;;;OAMG;IACU,IAAI,CAChB,IAAI,CAAC,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,kBAAkB,CAAC;IAY9B;;;;;;OAMG;IACU,MAAM,CAClB,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,mBAAmB,CAAC;IAY/B;;;;OAIG;IACU,SAAS,CACrB,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,WAAW,CAAC;IAYvB;;;;OAIG;IACU,MAAM,CAClB,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;OAIG;IACU,WAAW,CACvB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,wBAAwB,CAAC;CAYpC"}
@@ -3,10 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.S2Basins = void 0;
4
4
  const error_js_1 = require("./error.js");
5
5
  const index_js_1 = require("./generated/index.js");
6
+ const retry_js_1 = require("./lib/retry.js");
6
7
  class S2Basins {
7
8
  client;
8
- constructor(client) {
9
+ retryConfig;
10
+ constructor(client, retryConfig) {
9
11
  this.client = client;
12
+ this.retryConfig = retryConfig;
10
13
  }
11
14
  /**
12
15
  * List basins.
@@ -16,19 +19,13 @@ class S2Basins {
16
19
  * @param args.limit Max results (up to 1000)
17
20
  */
18
21
  async list(args, options) {
19
- const response = await (0, index_js_1.listBasins)({
20
- client: this.client,
21
- query: args,
22
- ...options,
22
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
23
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.listBasins)({
24
+ client: this.client,
25
+ query: args,
26
+ ...options,
27
+ }));
23
28
  });
24
- if (response.error) {
25
- throw new error_js_1.S2Error({
26
- message: response.error.message,
27
- code: response.error.code ?? undefined,
28
- status: response.response.status,
29
- });
30
- }
31
- return response.data;
32
29
  }
33
30
  /**
34
31
  * Create a basin.
@@ -38,19 +35,13 @@ class S2Basins {
38
35
  * @param args.scope Basin scope
39
36
  */
40
37
  async create(args, options) {
41
- const response = await (0, index_js_1.createBasin)({
42
- client: this.client,
43
- body: args,
44
- ...options,
38
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
39
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.createBasin)({
40
+ client: this.client,
41
+ body: args,
42
+ ...options,
43
+ }));
45
44
  });
46
- if (response.error) {
47
- throw new error_js_1.S2Error({
48
- message: response.error.message,
49
- code: response.error.code ?? undefined,
50
- status: response.response.status,
51
- });
52
- }
53
- return response.data;
54
45
  }
55
46
  /**
56
47
  * Get basin configuration.
@@ -58,19 +49,13 @@ class S2Basins {
58
49
  * @param args.basin Basin name
59
50
  */
60
51
  async getConfig(args, options) {
61
- const response = await (0, index_js_1.getBasinConfig)({
62
- client: this.client,
63
- path: args,
64
- ...options,
52
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
53
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.getBasinConfig)({
54
+ client: this.client,
55
+ path: args,
56
+ ...options,
57
+ }));
65
58
  });
66
- if (response.error) {
67
- throw new error_js_1.S2Error({
68
- message: response.error.message,
69
- code: response.error.code ?? undefined,
70
- status: response.response.status,
71
- });
72
- }
73
- return response.data;
74
59
  }
75
60
  /**
76
61
  * Delete a basin.
@@ -78,41 +63,28 @@ class S2Basins {
78
63
  * @param args.basin Basin name
79
64
  */
80
65
  async delete(args, options) {
81
- const response = await (0, index_js_1.deleteBasin)({
82
- client: this.client,
83
- path: args,
84
- ...options,
66
+ await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
67
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.deleteBasin)({
68
+ client: this.client,
69
+ path: args,
70
+ ...options,
71
+ }));
85
72
  });
86
- if (response.error) {
87
- throw new error_js_1.S2Error({
88
- message: response.error.message,
89
- code: response.error.code ?? undefined,
90
- status: response.response.status,
91
- });
92
- }
93
- return response.data;
94
73
  }
95
74
  /**
96
75
  * Reconfigure a basin.
97
76
  *
98
- * @param args.basin Basin name
99
- * @param args.body Configuration fields to change (e.g. default stream config)
77
+ * @param args Configuration for the basin to reconfigure (including basin name and fields to change)
100
78
  */
101
79
  async reconfigure(args, options) {
102
- const response = await (0, index_js_1.reconfigureBasin)({
103
- client: this.client,
104
- path: args,
105
- body: args,
106
- ...options,
80
+ return await (0, retry_js_1.withRetries)(this.retryConfig, async () => {
81
+ return await (0, error_js_1.withS2Data)(() => (0, index_js_1.reconfigureBasin)({
82
+ client: this.client,
83
+ path: args,
84
+ body: args,
85
+ ...options,
86
+ }));
107
87
  });
108
- if (response.error) {
109
- throw new error_js_1.S2Error({
110
- message: response.error.message,
111
- code: response.error.code ?? undefined,
112
- status: response.response.status,
113
- });
114
- }
115
- return response.data;
116
88
  }
117
89
  }
118
90
  exports.S2Basins = S2Basins;
@@ -1 +1 @@
1
- {"version":3,"file":"basins.js","sourceRoot":"","sources":["../../src/basins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"basins.js","sourceRoot":"","sources":["../../src/basins.ts"],"names":[],"mappings":";;;AACA,yCAAwC;AAExC,mDAe8B;AAC9B,6CAA6C;AAS7C,MAAa,QAAQ;IACH,MAAM,CAAS;IACf,WAAW,CAAc;IAE1C,YAAY,MAAc,EAAE,WAAwB;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CAChB,IAAqB,EACrB,OAA0B;QAE1B,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,qBAAU,EAAC;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI;gBACX,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,MAAM,CAClB,IAAqB,EACrB,OAA0B;QAE1B,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,sBAAW,EAAC;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI;gBACV,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,SAAS,CACrB,IAAwB,EACxB,OAA0B;QAE1B,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,yBAAc,EAAC;gBACd,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI;gBACV,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAClB,IAAqB,EACrB,OAA0B;QAE1B,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YAC9C,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,sBAAW,EAAC;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI;gBACV,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,WAAW,CACvB,IAA0B,EAC1B,OAA0B;QAE1B,OAAO,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,CAC5B,IAAA,2BAAgB,EAAC;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI;gBACV,GAAG,OAAO;aACV,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAjHD,4BAiHC"}
@@ -26,7 +26,7 @@ export type BatchOutput = {
26
26
  * @example
27
27
  * ```typescript
28
28
  * const batcher = new BatchTransform<"string">({
29
- * lingerDuration: 20,
29
+ * lingerDurationMillis: 20,
30
30
  * maxBatchRecords: 100,
31
31
  * maxBatchBytes: 256 * 1024,
32
32
  * match_seq_num: 0 // Optional: auto-increments per batch
@@ -1 +1 @@
1
- {"version":3,"file":"batch-transform.d.ts","sourceRoot":"","sources":["../../src/batch-transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IAClC,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAe,SAAQ,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC;IAC7E,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,UAAU,CACZ;IACN,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAS;gBAExB,IAAI,CAAC,EAAE,kBAAkB;IA8BrC,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,KAAK;IAgCb,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,iBAAiB;CAMzB"}
1
+ {"version":3,"file":"batch-transform.d.ts","sourceRoot":"","sources":["../../src/batch-transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,kBAAkB;IAClC,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAe,SAAQ,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC;IAC7E,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,UAAU,CACZ;IACN,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAS;gBAExB,IAAI,CAAC,EAAE,kBAAkB;IAyDrC,OAAO,CAAC,YAAY;IA4CpB,OAAO,CAAC,KAAK;IAgCb,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,iBAAiB;CAMzB"}
@@ -12,7 +12,7 @@ const utils_js_1 = require("./utils.js");
12
12
  * @example
13
13
  * ```typescript
14
14
  * const batcher = new BatchTransform<"string">({
15
- * lingerDuration: 20,
15
+ * lingerDurationMillis: 20,
16
16
  * maxBatchRecords: 100,
17
17
  * maxBatchBytes: 256 * 1024,
18
18
  * match_seq_num: 0 // Optional: auto-increments per batch
@@ -58,19 +58,50 @@ class BatchTransform extends TransformStream {
58
58
  this.flush();
59
59
  },
60
60
  });
61
- // Cap at maximum allowed values
62
- this.maxBatchRecords = Math.min(args?.maxBatchRecords ?? 1000, 1000);
63
- this.maxBatchBytes = Math.min(args?.maxBatchBytes ?? 1024 * 1024, 1024 * 1024);
61
+ // Validate configuration
62
+ if (args?.maxBatchRecords !== undefined) {
63
+ if (args.maxBatchRecords < 1 || args.maxBatchRecords > 1000) {
64
+ throw new error_js_1.S2Error({
65
+ message: `maxBatchRecords must be between 1 and 1000 (inclusive); got ${args.maxBatchRecords}`,
66
+ status: 400,
67
+ origin: "sdk",
68
+ });
69
+ }
70
+ }
71
+ if (args?.maxBatchBytes !== undefined) {
72
+ const max = 1024 * 1024;
73
+ if (args.maxBatchBytes < 1 || args.maxBatchBytes > max) {
74
+ throw new error_js_1.S2Error({
75
+ message: `maxBatchBytes must be between 1 and ${max} (1 MiB) bytes (inclusive); got ${args.maxBatchBytes}`,
76
+ status: 400,
77
+ origin: "sdk",
78
+ });
79
+ }
80
+ }
81
+ if (args?.lingerDurationMillis !== undefined) {
82
+ if (args.lingerDurationMillis < 0) {
83
+ throw new error_js_1.S2Error({
84
+ message: `lingerDurationMillis must be >= 0; got ${args.lingerDurationMillis}`,
85
+ status: 400,
86
+ origin: "sdk",
87
+ });
88
+ }
89
+ }
90
+ // Apply defaults
91
+ this.maxBatchRecords = args?.maxBatchRecords ?? 1000;
92
+ this.maxBatchBytes = args?.maxBatchBytes ?? 1024 * 1024;
64
93
  this.lingerDuration = args?.lingerDurationMillis ?? 5;
65
94
  this.fencing_token = args?.fencing_token;
66
95
  this.next_match_seq_num = args?.match_seq_num;
67
96
  }
68
97
  handleRecord(record) {
69
- const recordSize = (0, utils_js_1.meteredSizeBytes)(record);
98
+ const recordSize = (0, utils_js_1.meteredBytes)(record);
70
99
  // Reject individual records that exceed the max batch size
71
100
  if (recordSize > this.maxBatchBytes) {
72
101
  throw new error_js_1.S2Error({
73
102
  message: `Record size ${recordSize} bytes exceeds maximum batch size of ${this.maxBatchBytes} bytes`,
103
+ status: 400,
104
+ origin: "sdk",
74
105
  });
75
106
  }
76
107
  // Start linger timer on first record added to an empty batch