@s2-dev/streamstore 0.20.0 → 0.21.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 (221) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +60 -10
  3. package/dist/cjs/accessTokens.d.ts +27 -14
  4. package/dist/cjs/accessTokens.d.ts.map +1 -1
  5. package/dist/cjs/accessTokens.js +72 -8
  6. package/dist/cjs/accessTokens.js.map +1 -1
  7. package/dist/cjs/basins.d.ts +29 -19
  8. package/dist/cjs/basins.d.ts.map +1 -1
  9. package/dist/cjs/basins.js +119 -9
  10. package/dist/cjs/basins.js.map +1 -1
  11. package/dist/cjs/batch-transform.d.ts +12 -16
  12. package/dist/cjs/batch-transform.d.ts.map +1 -1
  13. package/dist/cjs/batch-transform.js +17 -21
  14. package/dist/cjs/batch-transform.js.map +1 -1
  15. package/dist/cjs/common.d.ts +31 -24
  16. package/dist/cjs/common.d.ts.map +1 -1
  17. package/dist/cjs/common.js +22 -0
  18. package/dist/cjs/common.js.map +1 -1
  19. package/dist/cjs/endpoints.d.ts +63 -0
  20. package/dist/cjs/endpoints.d.ts.map +1 -0
  21. package/dist/cjs/endpoints.js +120 -0
  22. package/dist/cjs/endpoints.js.map +1 -0
  23. package/dist/cjs/error.d.ts.map +1 -1
  24. package/dist/cjs/error.js +11 -0
  25. package/dist/cjs/error.js.map +1 -1
  26. package/dist/cjs/generated/types.gen.d.ts +11 -20
  27. package/dist/cjs/generated/types.gen.d.ts.map +1 -1
  28. package/dist/cjs/index.d.ts +30 -46
  29. package/dist/cjs/index.d.ts.map +1 -1
  30. package/dist/cjs/index.js +50 -26
  31. package/dist/cjs/index.js.map +1 -1
  32. package/dist/cjs/internal/case-transform.d.ts +59 -0
  33. package/dist/cjs/internal/case-transform.d.ts.map +1 -0
  34. package/dist/cjs/internal/case-transform.js +80 -0
  35. package/dist/cjs/internal/case-transform.js.map +1 -0
  36. package/dist/cjs/internal/mappers.d.ts +51 -0
  37. package/dist/cjs/internal/mappers.d.ts.map +1 -0
  38. package/dist/cjs/internal/mappers.js +225 -0
  39. package/dist/cjs/internal/mappers.js.map +1 -0
  40. package/dist/cjs/internal/sdk-types.d.ts +127 -0
  41. package/dist/cjs/internal/sdk-types.d.ts.map +1 -0
  42. package/dist/cjs/internal/sdk-types.js +9 -0
  43. package/dist/cjs/internal/sdk-types.js.map +1 -0
  44. package/dist/cjs/lib/base64.d.ts +8 -0
  45. package/dist/cjs/lib/base64.d.ts.map +1 -1
  46. package/dist/cjs/lib/base64.js +32 -12
  47. package/dist/cjs/lib/base64.js.map +1 -1
  48. package/dist/cjs/lib/event-stream.d.ts.map +1 -1
  49. package/dist/cjs/lib/event-stream.js +2 -1
  50. package/dist/cjs/lib/event-stream.js.map +1 -1
  51. package/dist/cjs/lib/paginate.d.ts +57 -0
  52. package/dist/cjs/lib/paginate.d.ts.map +1 -0
  53. package/dist/cjs/lib/paginate.js +51 -0
  54. package/dist/cjs/lib/paginate.js.map +1 -0
  55. package/dist/cjs/lib/result.d.ts +1 -1
  56. package/dist/cjs/lib/result.d.ts.map +1 -1
  57. package/dist/cjs/lib/retry.d.ts +47 -31
  58. package/dist/cjs/lib/retry.d.ts.map +1 -1
  59. package/dist/cjs/lib/retry.js +302 -201
  60. package/dist/cjs/lib/retry.js.map +1 -1
  61. package/dist/cjs/lib/stream/runtime.d.ts +1 -1
  62. package/dist/cjs/lib/stream/transport/fetch/index.d.ts +7 -9
  63. package/dist/cjs/lib/stream/transport/fetch/index.d.ts.map +1 -1
  64. package/dist/cjs/lib/stream/transport/fetch/index.js +38 -39
  65. package/dist/cjs/lib/stream/transport/fetch/index.js.map +1 -1
  66. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts +7 -2
  67. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts.map +1 -1
  68. package/dist/cjs/lib/stream/transport/fetch/shared.js +56 -110
  69. package/dist/cjs/lib/stream/transport/fetch/shared.js.map +1 -1
  70. package/dist/cjs/lib/stream/transport/proto.d.ts +9 -0
  71. package/dist/cjs/lib/stream/transport/proto.d.ts.map +1 -0
  72. package/dist/cjs/lib/stream/transport/proto.js +118 -0
  73. package/dist/cjs/lib/stream/transport/proto.js.map +1 -0
  74. package/dist/cjs/lib/stream/transport/s2s/index.d.ts +3 -3
  75. package/dist/cjs/lib/stream/transport/s2s/index.d.ts.map +1 -1
  76. package/dist/cjs/lib/stream/transport/s2s/index.js +115 -82
  77. package/dist/cjs/lib/stream/transport/s2s/index.js.map +1 -1
  78. package/dist/cjs/lib/stream/types.d.ts +81 -36
  79. package/dist/cjs/lib/stream/types.d.ts.map +1 -1
  80. package/dist/cjs/lib/stream/types.js +18 -0
  81. package/dist/cjs/lib/stream/types.js.map +1 -1
  82. package/dist/cjs/metrics.d.ts +18 -17
  83. package/dist/cjs/metrics.d.ts.map +1 -1
  84. package/dist/cjs/metrics.js +67 -12
  85. package/dist/cjs/metrics.js.map +1 -1
  86. package/dist/cjs/producer.d.ts +82 -0
  87. package/dist/cjs/producer.d.ts.map +1 -0
  88. package/dist/cjs/producer.js +305 -0
  89. package/dist/cjs/producer.js.map +1 -0
  90. package/dist/cjs/s2.d.ts +1 -2
  91. package/dist/cjs/s2.d.ts.map +1 -1
  92. package/dist/cjs/s2.js +9 -9
  93. package/dist/cjs/s2.js.map +1 -1
  94. package/dist/cjs/stream.d.ts +26 -12
  95. package/dist/cjs/stream.d.ts.map +1 -1
  96. package/dist/cjs/stream.js +77 -13
  97. package/dist/cjs/stream.js.map +1 -1
  98. package/dist/cjs/streams.d.ts +29 -19
  99. package/dist/cjs/streams.d.ts.map +1 -1
  100. package/dist/cjs/streams.js +120 -9
  101. package/dist/cjs/streams.js.map +1 -1
  102. package/dist/cjs/types.d.ts +624 -0
  103. package/dist/cjs/types.d.ts.map +1 -0
  104. package/dist/cjs/types.js +129 -0
  105. package/dist/cjs/types.js.map +1 -0
  106. package/dist/cjs/utils.d.ts +1 -22
  107. package/dist/cjs/utils.d.ts.map +1 -1
  108. package/dist/cjs/utils.js +0 -42
  109. package/dist/cjs/utils.js.map +1 -1
  110. package/dist/cjs/version.d.ts +1 -1
  111. package/dist/cjs/version.js +1 -1
  112. package/dist/esm/accessTokens.d.ts +27 -14
  113. package/dist/esm/accessTokens.d.ts.map +1 -1
  114. package/dist/esm/accessTokens.js +73 -9
  115. package/dist/esm/accessTokens.js.map +1 -1
  116. package/dist/esm/basins.d.ts +29 -19
  117. package/dist/esm/basins.d.ts.map +1 -1
  118. package/dist/esm/basins.js +119 -9
  119. package/dist/esm/basins.js.map +1 -1
  120. package/dist/esm/batch-transform.d.ts +12 -16
  121. package/dist/esm/batch-transform.d.ts.map +1 -1
  122. package/dist/esm/batch-transform.js +18 -22
  123. package/dist/esm/batch-transform.js.map +1 -1
  124. package/dist/esm/common.d.ts +31 -24
  125. package/dist/esm/common.d.ts.map +1 -1
  126. package/dist/esm/common.js +20 -1
  127. package/dist/esm/common.js.map +1 -1
  128. package/dist/esm/endpoints.d.ts +63 -0
  129. package/dist/esm/endpoints.d.ts.map +1 -0
  130. package/dist/esm/endpoints.js +115 -0
  131. package/dist/esm/endpoints.js.map +1 -0
  132. package/dist/esm/error.d.ts.map +1 -1
  133. package/dist/esm/error.js +11 -0
  134. package/dist/esm/error.js.map +1 -1
  135. package/dist/esm/generated/types.gen.d.ts +11 -20
  136. package/dist/esm/generated/types.gen.d.ts.map +1 -1
  137. package/dist/esm/index.d.ts +30 -46
  138. package/dist/esm/index.d.ts.map +1 -1
  139. package/dist/esm/index.js +33 -19
  140. package/dist/esm/index.js.map +1 -1
  141. package/dist/esm/internal/case-transform.d.ts +59 -0
  142. package/dist/esm/internal/case-transform.d.ts.map +1 -0
  143. package/dist/esm/internal/case-transform.js +76 -0
  144. package/dist/esm/internal/case-transform.js.map +1 -0
  145. package/dist/esm/internal/mappers.d.ts +51 -0
  146. package/dist/esm/internal/mappers.d.ts.map +1 -0
  147. package/dist/esm/internal/mappers.js +218 -0
  148. package/dist/esm/internal/mappers.js.map +1 -0
  149. package/dist/esm/internal/sdk-types.d.ts +127 -0
  150. package/dist/esm/internal/sdk-types.d.ts.map +1 -0
  151. package/dist/esm/internal/sdk-types.js +8 -0
  152. package/dist/esm/internal/sdk-types.js.map +1 -0
  153. package/dist/esm/lib/base64.d.ts +8 -0
  154. package/dist/esm/lib/base64.d.ts.map +1 -1
  155. package/dist/esm/lib/base64.js +30 -11
  156. package/dist/esm/lib/base64.js.map +1 -1
  157. package/dist/esm/lib/event-stream.d.ts.map +1 -1
  158. package/dist/esm/lib/event-stream.js +2 -1
  159. package/dist/esm/lib/event-stream.js.map +1 -1
  160. package/dist/esm/lib/paginate.d.ts +57 -0
  161. package/dist/esm/lib/paginate.d.ts.map +1 -0
  162. package/dist/esm/lib/paginate.js +48 -0
  163. package/dist/esm/lib/paginate.js.map +1 -0
  164. package/dist/esm/lib/result.d.ts +1 -1
  165. package/dist/esm/lib/result.d.ts.map +1 -1
  166. package/dist/esm/lib/retry.d.ts +47 -31
  167. package/dist/esm/lib/retry.d.ts.map +1 -1
  168. package/dist/esm/lib/retry.js +303 -201
  169. package/dist/esm/lib/retry.js.map +1 -1
  170. package/dist/esm/lib/stream/runtime.d.ts +1 -1
  171. package/dist/esm/lib/stream/transport/fetch/index.d.ts +7 -9
  172. package/dist/esm/lib/stream/transport/fetch/index.d.ts.map +1 -1
  173. package/dist/esm/lib/stream/transport/fetch/index.js +40 -41
  174. package/dist/esm/lib/stream/transport/fetch/index.js.map +1 -1
  175. package/dist/esm/lib/stream/transport/fetch/shared.d.ts +7 -2
  176. package/dist/esm/lib/stream/transport/fetch/shared.d.ts.map +1 -1
  177. package/dist/esm/lib/stream/transport/fetch/shared.js +58 -112
  178. package/dist/esm/lib/stream/transport/fetch/shared.js.map +1 -1
  179. package/dist/esm/lib/stream/transport/proto.d.ts +9 -0
  180. package/dist/esm/lib/stream/transport/proto.d.ts.map +1 -0
  181. package/dist/esm/lib/stream/transport/proto.js +110 -0
  182. package/dist/esm/lib/stream/transport/proto.js.map +1 -0
  183. package/dist/esm/lib/stream/transport/s2s/index.d.ts +3 -3
  184. package/dist/esm/lib/stream/transport/s2s/index.d.ts.map +1 -1
  185. package/dist/esm/lib/stream/transport/s2s/index.js +116 -82
  186. package/dist/esm/lib/stream/transport/s2s/index.js.map +1 -1
  187. package/dist/esm/lib/stream/types.d.ts +81 -36
  188. package/dist/esm/lib/stream/types.d.ts.map +1 -1
  189. package/dist/esm/lib/stream/types.js +17 -1
  190. package/dist/esm/lib/stream/types.js.map +1 -1
  191. package/dist/esm/metrics.d.ts +18 -17
  192. package/dist/esm/metrics.d.ts.map +1 -1
  193. package/dist/esm/metrics.js +66 -12
  194. package/dist/esm/metrics.js.map +1 -1
  195. package/dist/esm/producer.d.ts +82 -0
  196. package/dist/esm/producer.d.ts.map +1 -0
  197. package/dist/esm/producer.js +300 -0
  198. package/dist/esm/producer.js.map +1 -0
  199. package/dist/esm/s2.d.ts +1 -2
  200. package/dist/esm/s2.d.ts.map +1 -1
  201. package/dist/esm/s2.js +9 -9
  202. package/dist/esm/s2.js.map +1 -1
  203. package/dist/esm/stream.d.ts +26 -12
  204. package/dist/esm/stream.d.ts.map +1 -1
  205. package/dist/esm/stream.js +79 -15
  206. package/dist/esm/stream.js.map +1 -1
  207. package/dist/esm/streams.d.ts +29 -19
  208. package/dist/esm/streams.d.ts.map +1 -1
  209. package/dist/esm/streams.js +120 -9
  210. package/dist/esm/streams.js.map +1 -1
  211. package/dist/esm/types.d.ts +624 -0
  212. package/dist/esm/types.d.ts.map +1 -0
  213. package/dist/esm/types.js +126 -0
  214. package/dist/esm/types.js.map +1 -0
  215. package/dist/esm/utils.d.ts +1 -22
  216. package/dist/esm/utils.d.ts.map +1 -1
  217. package/dist/esm/utils.js +0 -41
  218. package/dist/esm/utils.js.map +1 -1
  219. package/dist/esm/version.d.ts +1 -1
  220. package/dist/esm/version.js +1 -1
  221. package/package.json +4 -3
@@ -0,0 +1,300 @@
1
+ import createDebug from "debug";
2
+ import { BatchTransform } from "./batch-transform.js";
3
+ import { S2Error } from "./error.js";
4
+ import { AppendInput } from "./types.js";
5
+ const debugProducer = createDebug("s2:producer");
6
+ const toS2Error = (err) => err instanceof S2Error
7
+ ? err
8
+ : new S2Error({
9
+ message: String(err),
10
+ status: 500,
11
+ origin: "sdk",
12
+ });
13
+ export class IndexedAppendAck {
14
+ index;
15
+ ack;
16
+ constructor(index, ack) {
17
+ this.index = index;
18
+ this.ack = ack;
19
+ }
20
+ batchAppendAck() {
21
+ return this.ack;
22
+ }
23
+ seqNum() {
24
+ return this.ack.start.seqNum + this.index;
25
+ }
26
+ }
27
+ export class RecordSubmitTicket {
28
+ ackPromise;
29
+ constructor(ackPromise) {
30
+ this.ackPromise = ackPromise;
31
+ // Avoid unhandled rejections if the caller never awaits ack().
32
+ this.ackPromise.catch(() => { });
33
+ }
34
+ /**
35
+ * Returns a promise that resolves with the IndexedAppendAck once the record is durable.
36
+ */
37
+ ack() {
38
+ return this.ackPromise;
39
+ }
40
+ }
41
+ /**
42
+ * Producer provides per-record append semantics on top of a batched AppendSession.
43
+ *
44
+ * - submit(record) returns a Promise<RecordSubmitTicket> that resolves once the record
45
+ * has been accepted (written to the batch transform). Backpressure is applied
46
+ * automatically via the transform stream when the AppendSession is at capacity.
47
+ * - ticket.ack() returns a Promise<IndexedAppendAck> that resolves once the record is durable.
48
+ *
49
+ * See the "Producer API" section of the root README for guidance on sizing batches,
50
+ * wiring transforms, and handling application-level ids.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const appendSession = await stream.appendSession();
55
+ * const producer = new Producer(new BatchTransform(), appendSession);
56
+ * const writer = producer.writable.getWriter();
57
+ * await writer.write(AppendRecord.string({ body: "hello" }));
58
+ * await writer.close();
59
+ *
60
+ * for await (const ack of producer.readable) {
61
+ * console.log("record durable at seq", ack.seqNum());
62
+ * }
63
+ *
64
+ * await producer.close();
65
+ * ```
66
+ */
67
+ export class Producer {
68
+ batchTransform;
69
+ transformWriter;
70
+ transformReader;
71
+ pump;
72
+ appendSession;
73
+ readable;
74
+ writable;
75
+ inflightRecords = [];
76
+ pumpError = null;
77
+ readableController = null;
78
+ debugName;
79
+ submitCounter = 0;
80
+ constructor(batchTransform, appendSession, debugName) {
81
+ this.debugName = debugName ?? `producer-${Date.now()}`;
82
+ this.batchTransform = batchTransform;
83
+ this.transformWriter = batchTransform.writable.getWriter();
84
+ this.transformReader = batchTransform.readable.getReader();
85
+ this.appendSession = appendSession;
86
+ debugProducer("[%s] created", this.debugName);
87
+ // Create readable stream that emits individual record acknowledgements
88
+ this.readable = new ReadableStream({
89
+ start: (controller) => {
90
+ this.readableController = controller;
91
+ },
92
+ cancel: () => {
93
+ this.close().catch(() => {
94
+ // Ignore errors during cleanup
95
+ });
96
+ },
97
+ });
98
+ // Create writable stream that accepts individual records
99
+ this.writable = new WritableStream({
100
+ write: async (record) => {
101
+ await this.submit(record);
102
+ },
103
+ close: async () => {
104
+ await this.close();
105
+ },
106
+ abort: async (reason) => {
107
+ this.pumpError = toS2Error(reason);
108
+ await this.close();
109
+ },
110
+ });
111
+ this.pump = this.runPump();
112
+ }
113
+ /**
114
+ * Main pump loop: reads batches from transform, submits to session, handles acks.
115
+ */
116
+ async runPump() {
117
+ debugProducer("[%s] pump started", this.debugName);
118
+ try {
119
+ while (true) {
120
+ const { value: batch, done } = await this.transformReader.read();
121
+ if (done) {
122
+ debugProducer("[%s] pump done (transform closed)", this.debugName);
123
+ break;
124
+ }
125
+ debugProducer("[%s] pump got batch: records=%d, match_seq_num=%s, inflightRecords=%d", this.debugName, batch.records.length, batch.matchSeqNum ?? "none", this.inflightRecords.length);
126
+ // Associate records with this batch (FIFO correspondence)
127
+ const recordCount = batch.records.length;
128
+ const associatedRecords = this.inflightRecords.splice(0, recordCount);
129
+ if (associatedRecords.length !== recordCount) {
130
+ throw new S2Error({
131
+ message: `Internal error: flushed ${recordCount} records but only ${associatedRecords.length} inflight entries`,
132
+ status: 500,
133
+ origin: "sdk",
134
+ });
135
+ }
136
+ // Submit to AppendSession (blocks on capacity)
137
+ let ticket;
138
+ try {
139
+ debugProducer("[%s] pump submitting to session: records=%d, match_seq_num=%s", this.debugName, batch.records.length, batch.matchSeqNum ?? "none");
140
+ const input = AppendInput.create(batch.records, {
141
+ fencingToken: batch.fencingToken,
142
+ matchSeqNum: batch.matchSeqNum,
143
+ });
144
+ ticket = await this.appendSession.submit(input);
145
+ debugProducer("[%s] pump submit returned ticket", this.debugName);
146
+ }
147
+ catch (err) {
148
+ const error = toS2Error(err);
149
+ debugProducer("[%s] pump submit error: %s", this.debugName, error.message);
150
+ if (!this.pumpError) {
151
+ this.pumpError = error;
152
+ }
153
+ // Reject acks for records in this batch
154
+ for (const record of associatedRecords) {
155
+ record.rejectAck(error);
156
+ }
157
+ if (this.readableController) {
158
+ this.readableController.error(error);
159
+ }
160
+ continue;
161
+ }
162
+ // Handle ack asynchronously (non-blocking)
163
+ ticket
164
+ .ack()
165
+ .then((ack) => {
166
+ debugProducer("[%s] pump ack received: seq_num=%d-%d", this.debugName, ack.start.seqNum, ack.end.seqNum);
167
+ for (const [i, record] of associatedRecords.entries()) {
168
+ const indexedAck = new IndexedAppendAck(i, ack);
169
+ record.resolveAck(indexedAck);
170
+ if (this.readableController) {
171
+ this.readableController.enqueue(indexedAck);
172
+ }
173
+ }
174
+ })
175
+ .catch((err) => {
176
+ const error = toS2Error(err);
177
+ debugProducer("[%s] pump ack error: %s", this.debugName, error.message);
178
+ if (!this.pumpError) {
179
+ this.pumpError = error;
180
+ }
181
+ for (const record of associatedRecords) {
182
+ record.rejectAck(error);
183
+ }
184
+ if (this.readableController) {
185
+ this.readableController.error(error);
186
+ }
187
+ });
188
+ }
189
+ }
190
+ catch (err) {
191
+ const error = toS2Error(err);
192
+ debugProducer("[%s] pump caught error: %s", this.debugName, error.message);
193
+ if (!this.pumpError) {
194
+ this.pumpError = error;
195
+ }
196
+ // Reject all remaining inflight records
197
+ for (const record of this.inflightRecords.splice(0)) {
198
+ record.rejectAck(error);
199
+ }
200
+ // Error the readable stream
201
+ if (this.readableController) {
202
+ this.readableController.error(error);
203
+ this.readableController = null;
204
+ }
205
+ }
206
+ }
207
+ /**
208
+ * Submit a single record for appending.
209
+ *
210
+ * Returns a promise that resolves to a RecordSubmitTicket once the record has been
211
+ * accepted. The promise blocks if the underlying AppendSession is at capacity
212
+ * (backpressure is applied via the transform stream).
213
+ *
214
+ * @throws S2Error if the Producer has failed
215
+ */
216
+ async submit(record) {
217
+ const submitId = ++this.submitCounter;
218
+ debugProducer("[%s] submit #%d: inflightRecords=%d", this.debugName, submitId, this.inflightRecords.length);
219
+ // Check if pump has already failed
220
+ if (this.pumpError) {
221
+ debugProducer("[%s] submit #%d: pump already failed", this.debugName, submitId);
222
+ throw new S2Error({
223
+ message: `Cannot submit: producer has failed: ${this.pumpError.message}`,
224
+ status: 500,
225
+ origin: "sdk",
226
+ });
227
+ }
228
+ // Create the ack promise (resolved later by pump)
229
+ let resolveAck;
230
+ let rejectAck;
231
+ const ackPromise = new Promise((resolve, reject) => {
232
+ resolveAck = resolve;
233
+ rejectAck = reject;
234
+ });
235
+ // Suppress unhandled rejection if write fails before we return the ticket
236
+ ackPromise.catch(() => { });
237
+ // Track this record
238
+ const entry = { resolveAck, rejectAck };
239
+ this.inflightRecords.push(entry);
240
+ debugProducer("[%s] submit #%d: pushed to inflightRecords (now %d), writing to transform", this.debugName, submitId, this.inflightRecords.length);
241
+ try {
242
+ // Write to transform - BLOCKS on backpressure
243
+ await this.transformWriter.write(record);
244
+ debugProducer("[%s] submit #%d: write completed", this.debugName, submitId);
245
+ }
246
+ catch (err) {
247
+ debugProducer("[%s] submit #%d: write failed: %s", this.debugName, submitId, err);
248
+ // Remove from inflight if the write failed
249
+ const idx = this.inflightRecords.indexOf(entry);
250
+ if (idx >= 0) {
251
+ this.inflightRecords.splice(idx, 1);
252
+ }
253
+ const error = toS2Error(err);
254
+ rejectAck(error);
255
+ throw error;
256
+ }
257
+ // Write succeeded - return ticket immediately
258
+ return new RecordSubmitTicket(ackPromise);
259
+ }
260
+ /**
261
+ * Close the Producer gracefully.
262
+ *
263
+ * Waits for all pending records to be flushed, submitted, and acknowledged.
264
+ * If any error occurred during the Producer's lifetime, this method throws it.
265
+ */
266
+ async close() {
267
+ debugProducer("[%s] close requested", this.debugName);
268
+ // Close the writer to signal no more records
269
+ await this.transformWriter.close();
270
+ // Wait for the pump to finish processing all batches
271
+ await this.pump;
272
+ // Close the underlying session
273
+ await this.appendSession.close();
274
+ // Reject any remaining inflight records (shouldn't happen in normal operation)
275
+ if (this.inflightRecords.length > 0) {
276
+ const closingError = new S2Error({
277
+ message: "Producer closed with pending records",
278
+ status: 499,
279
+ origin: "sdk",
280
+ });
281
+ for (const record of this.inflightRecords.splice(0)) {
282
+ record.rejectAck(closingError);
283
+ }
284
+ }
285
+ // Close the readable stream
286
+ if (this.readableController) {
287
+ this.readableController.close();
288
+ this.readableController = null;
289
+ }
290
+ debugProducer("[%s] close complete", this.debugName);
291
+ // If an error occurred, throw it
292
+ if (this.pumpError) {
293
+ throw this.pumpError;
294
+ }
295
+ }
296
+ async [Symbol.asyncDispose]() {
297
+ await this.close();
298
+ }
299
+ }
300
+ //# sourceMappingURL=producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"producer.js","sourceRoot":"","sources":["../../src/producer.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAkB,WAAW,EAAqB,MAAM,YAAY,CAAC;AAE5E,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;AAEjD,MAAM,SAAS,GAAG,CAAC,GAAY,EAAW,EAAE,CAC3C,GAAG,YAAY,OAAO;IACrB,CAAC,CAAC,GAAG;IACL,CAAC,CAAC,IAAI,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;QACpB,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,KAAK;KACb,CAAC,CAAC;AAEN,MAAM,OAAO,gBAAgB;IAElB;IACA;IAFV,YACU,KAAa,EACb,GAAc;QADd,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAW;IACrB,CAAC;IAEJ,cAAc;QACb,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3C,CAAC;CACD;AAED,MAAM,OAAO,kBAAkB;IACD;IAA7B,YAA6B,UAAqC;QAArC,eAAU,GAAV,UAAU,CAA2B;QACjE,+DAA+D;QAC/D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,GAAG;QACF,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,QAAQ;IACX,cAAc,CAAiB;IAC/B,eAAe,CAA4C;IAC3D,eAAe,CAA2C;IAE1D,IAAI,CAAgB;IAEpB,aAAa,CAAgB;IAE7B,QAAQ,CAAmC;IAC3C,QAAQ,CAA+B;IAE/B,eAAe,GAAqB,EAAE,CAAC;IAEhD,SAAS,GAAmB,IAAI,CAAC;IACjC,kBAAkB,GACzB,IAAI,CAAC;IAEW,SAAS,CAAS;IAC3B,aAAa,GAAG,CAAC,CAAC;IAE1B,YACC,cAA8B,EAC9B,aAA4B,EAC5B,SAAkB;QAElB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAE3D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9C,uEAAuE;QACvE,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAmB;YACpD,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;gBACrB,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;YACtC,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;oBACvB,+BAA+B;gBAChC,CAAC,CAAC,CAAC;YACJ,CAAC;SACD,CAAC,CAAC;QAEH,yDAAyD;QACzD,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAe;YAChD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACvB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACpB,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,CAAC;YACJ,OAAO,IAAI,EAAE,CAAC;gBACb,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;gBAEjE,IAAI,IAAI,EAAE,CAAC;oBACV,aAAa,CAAC,mCAAmC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;oBACnE,MAAM;gBACP,CAAC;gBAED,aAAa,CACZ,uEAAuE,EACvE,IAAI,CAAC,SAAS,EACd,KAAK,CAAC,OAAO,CAAC,MAAM,EACpB,KAAK,CAAC,WAAW,IAAI,MAAM,EAC3B,IAAI,CAAC,eAAe,CAAC,MAAM,CAC3B,CAAC;gBAEF,0DAA0D;gBAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAEtE,IAAI,iBAAiB,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC9C,MAAM,IAAI,OAAO,CAAC;wBACjB,OAAO,EAAE,2BAA2B,WAAW,qBAAqB,iBAAiB,CAAC,MAAM,mBAAmB;wBAC/G,MAAM,EAAE,GAAG;wBACX,MAAM,EAAE,KAAK;qBACb,CAAC,CAAC;gBACJ,CAAC;gBAED,+CAA+C;gBAC/C,IAAI,MAAyB,CAAC;gBAC9B,IAAI,CAAC;oBACJ,aAAa,CACZ,+DAA+D,EAC/D,IAAI,CAAC,SAAS,EACd,KAAK,CAAC,OAAO,CAAC,MAAM,EACpB,KAAK,CAAC,WAAW,IAAI,MAAM,CAC3B,CAAC;oBAEF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;wBAC/C,YAAY,EAAE,KAAK,CAAC,YAAY;wBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;qBAC9B,CAAC,CAAC;oBACH,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAEhD,aAAa,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC7B,aAAa,CACZ,4BAA4B,EAC5B,IAAI,CAAC,SAAS,EACd,KAAK,CAAC,OAAO,CACb,CAAC;oBAEF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACxB,CAAC;oBAED,wCAAwC;oBACxC,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;wBACxC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;oBAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBAC7B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtC,CAAC;oBAED,SAAS;gBACV,CAAC;gBAED,2CAA2C;gBAC3C,MAAM;qBACJ,GAAG,EAAE;qBACL,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;oBACb,aAAa,CACZ,uCAAuC,EACvC,IAAI,CAAC,SAAS,EACd,GAAG,CAAC,KAAK,CAAC,MAAM,EAChB,GAAG,CAAC,GAAG,CAAC,MAAM,CACd,CAAC;oBAEF,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;wBACvD,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAChD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;wBAE9B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;4BAC7B,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAC7C,CAAC;oBACF,CAAC;gBACF,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACd,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC7B,aAAa,CACZ,yBAAyB,EACzB,IAAI,CAAC,SAAS,EACd,KAAK,CAAC,OAAO,CACb,CAAC;oBAEF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACxB,CAAC;oBAED,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;wBACxC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;oBAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBAC7B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtC,CAAC;gBACF,CAAC,CAAC,CAAC;YACL,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,aAAa,CACZ,4BAA4B,EAC5B,IAAI,CAAC,SAAS,EACd,KAAK,CAAC,OAAO,CACb,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,CAAC;YAED,wCAAwC;YACxC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,CAAC,MAAoB;QAChC,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;QAEtC,aAAa,CACZ,qCAAqC,EACrC,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,IAAI,CAAC,eAAe,CAAC,MAAM,CAC3B,CAAC;QAEF,mCAAmC;QACnC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,aAAa,CACZ,sCAAsC,EACtC,IAAI,CAAC,SAAS,EACd,QAAQ,CACR,CAAC;YACF,MAAM,IAAI,OAAO,CAAC;gBACjB,OAAO,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;gBACxE,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,KAAK;aACb,CAAC,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,IAAI,UAA4C,CAAC;QACjD,IAAI,SAAkC,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpE,UAAU,GAAG,OAAO,CAAC;YACrB,SAAS,GAAG,MAAM,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,0EAA0E;QAC1E,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3B,oBAAoB;QACpB,MAAM,KAAK,GAAmB,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjC,aAAa,CACZ,2EAA2E,EAC3E,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,IAAI,CAAC,eAAe,CAAC,MAAM,CAC3B,CAAC;QAEF,IAAI,CAAC;YACJ,8CAA8C;YAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEzC,aAAa,CACZ,kCAAkC,EAClC,IAAI,CAAC,SAAS,EACd,QAAQ,CACR,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,aAAa,CACZ,mCAAmC,EACnC,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,GAAG,CACH,CAAC;YAEF,2CAA2C;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACd,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,SAAS,CAAC,KAAK,CAAC,CAAC;YACjB,MAAM,KAAK,CAAC;QACb,CAAC;QAED,8CAA8C;QAC9C,OAAO,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK;QACV,aAAa,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtD,6CAA6C;QAC7C,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAEnC,qDAAqD;QACrD,MAAM,IAAI,CAAC,IAAI,CAAC;QAEhB,+BAA+B;QAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAEjC,+EAA+E;QAC/E,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC;gBAChC,OAAO,EAAE,sCAAsC;gBAC/C,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,KAAK;aACb,CAAC,CAAC;YAEH,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;QACF,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAErD,iCAAiC;QACjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,SAAS,CAAC;QACtB,CAAC;IACF,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACD"}
package/dist/esm/s2.d.ts CHANGED
@@ -11,8 +11,7 @@ import { S2Metrics } from "./metrics.js";
11
11
  export declare class S2 {
12
12
  private readonly accessToken;
13
13
  private readonly client;
14
- private readonly makeBasinBaseUrl;
15
- private readonly includeBasinHeader;
14
+ private readonly endpoints;
16
15
  private readonly retryConfig;
17
16
  /**
18
17
  * Account-scoped basin management operations.
@@ -1 +1 @@
1
- {"version":3,"file":"s2.d.ts","sourceRoot":"","sources":["../../src/s2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,aAAa,CAAC;AAShE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC;;;;GAIG;AACH,qBAAa,EAAE;IACd,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4B;IAC7D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAE1C;;;;OAIG;IACH,SAAgB,MAAM,EAAE,QAAQ,CAAC;IACjC,kEAAkE;IAClE,SAAgB,YAAY,EAAE,cAAc,CAAC;IAC7C,+CAA+C;IAC/C,SAAgB,OAAO,EAAE,SAAS,CAAC;IAEnC;;;;OAIG;gBACS,OAAO,EAAE,eAAe;IA0BpC;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM;CAQzB"}
1
+ {"version":3,"file":"s2.d.ts","sourceRoot":"","sources":["../../src/s2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,aAAa,CAAC;AAUhE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;GAIG;AACH,qBAAa,EAAE;IACd,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAE1C;;;;OAIG;IACH,SAAgB,MAAM,EAAE,QAAQ,CAAC;IACjC,kEAAkE;IAClE,SAAgB,YAAY,EAAE,cAAc,CAAC;IAC7C,+CAA+C;IAC/C,SAAgB,OAAO,EAAE,SAAS,CAAC;IAEnC;;;;OAIG;gBACS,OAAO,EAAE,eAAe;IA4BpC;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM;CAQzB"}
package/dist/esm/s2.js CHANGED
@@ -1,13 +1,12 @@
1
1
  import { S2AccessTokens } from "./accessTokens.js";
2
2
  import { S2Basin } from "./basin.js";
3
3
  import { S2Basins } from "./basins.js";
4
+ import { S2Endpoints } from "./endpoints.js";
4
5
  import { makeServerError } from "./error.js";
5
6
  import { createClient, createConfig } from "./generated/client/index.js";
6
7
  import * as Redacted from "./lib/redacted.js";
7
8
  import { canSetUserAgentHeader, DEFAULT_USER_AGENT, } from "./lib/stream/runtime.js";
8
9
  import { S2Metrics } from "./metrics.js";
9
- const defaultBaseUrl = "https://aws.s2.dev/v1";
10
- const defaultMakeBasinBaseUrl = (basin) => `https://${basin}.b.aws.s2.dev/v1`;
11
10
  /**
12
11
  * Top-level S2 SDK client.
13
12
  *
@@ -16,8 +15,7 @@ const defaultMakeBasinBaseUrl = (basin) => `https://${basin}.b.aws.s2.dev/v1`;
16
15
  export class S2 {
17
16
  accessToken;
18
17
  client;
19
- makeBasinBaseUrl;
20
- includeBasinHeader;
18
+ endpoints;
21
19
  retryConfig;
22
20
  /**
23
21
  * Account-scoped basin management operations.
@@ -37,12 +35,16 @@ export class S2 {
37
35
  constructor(options) {
38
36
  this.accessToken = Redacted.make(options.accessToken);
39
37
  this.retryConfig = options.retry ?? {};
38
+ this.endpoints =
39
+ options.endpoints instanceof S2Endpoints
40
+ ? options.endpoints
41
+ : new S2Endpoints(options.endpoints);
40
42
  const headers = {};
41
43
  if (canSetUserAgentHeader()) {
42
44
  headers["user-agent"] = DEFAULT_USER_AGENT;
43
45
  }
44
46
  this.client = createClient(createConfig({
45
- baseUrl: options.baseUrl ?? defaultBaseUrl,
47
+ baseUrl: this.endpoints.accountBaseUrl(),
46
48
  auth: () => Redacted.value(this.accessToken),
47
49
  headers: headers,
48
50
  }));
@@ -52,8 +54,6 @@ export class S2 {
52
54
  this.basins = new S2Basins(this.client, this.retryConfig);
53
55
  this.accessTokens = new S2AccessTokens(this.client, this.retryConfig);
54
56
  this.metrics = new S2Metrics(this.client, this.retryConfig);
55
- this.makeBasinBaseUrl = options.makeBasinBaseUrl ?? defaultMakeBasinBaseUrl;
56
- this.includeBasinHeader = !!options.makeBasinBaseUrl;
57
57
  }
58
58
  /**
59
59
  * Create a basin-scoped client bound to a specific basin name.
@@ -63,8 +63,8 @@ export class S2 {
63
63
  basin(name) {
64
64
  return new S2Basin(name, {
65
65
  accessToken: this.accessToken,
66
- baseUrl: this.makeBasinBaseUrl(name),
67
- includeBasinHeader: this.includeBasinHeader,
66
+ baseUrl: this.endpoints.basinBaseUrl(name),
67
+ includeBasinHeader: this.endpoints.includeBasinHeader,
68
68
  retryConfig: this.retryConfig,
69
69
  });
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"s2.js","sourceRoot":"","sources":["../../src/s2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACN,qBAAqB,EACrB,kBAAkB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAC/C,MAAM,uBAAuB,GAAG,CAAC,KAAa,EAAE,EAAE,CACjD,WAAW,KAAK,kBAAkB,CAAC;AAEpC;;;;GAIG;AACH,MAAM,OAAO,EAAE;IACG,WAAW,CAAoB;IAC/B,MAAM,CAAS;IACf,gBAAgB,CAA4B;IAC5C,kBAAkB,CAAU;IAC5B,WAAW,CAAc;IAE1C;;;;OAIG;IACa,MAAM,CAAW;IACjC,kEAAkE;IAClD,YAAY,CAAiB;IAC7C,+CAA+C;IAC/B,OAAO,CAAY;IAEnC;;;;OAIG;IACH,YAAY,OAAwB;QACnC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,qBAAqB,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,YAAY,CACzB,YAAY,CAAC;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc;YAC1C,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;YAC5C,OAAO,EAAE,OAAO;SAChB,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/C,OAAO,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;QAC5E,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAY;QACxB,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;YACxB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACpC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC,CAAC;IACJ,CAAC;CACD"}
1
+ {"version":3,"file":"s2.js","sourceRoot":"","sources":["../../src/s2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACN,qBAAqB,EACrB,kBAAkB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;GAIG;AACH,MAAM,OAAO,EAAE;IACG,WAAW,CAAoB;IAC/B,MAAM,CAAS;IACf,SAAS,CAAc;IACvB,WAAW,CAAc;IAE1C;;;;OAIG;IACa,MAAM,CAAW;IACjC,kEAAkE;IAClD,YAAY,CAAiB;IAC7C,+CAA+C;IAC/B,OAAO,CAAY;IAEnC;;;;OAIG;IACH,YAAY,OAAwB;QACnC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS;YACb,OAAO,CAAC,SAAS,YAAY,WAAW;gBACvC,CAAC,CAAC,OAAO,CAAC,SAAS;gBACnB,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,qBAAqB,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,YAAY,CACzB,YAAY,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;YACxC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;YAC5C,OAAO,EAAE,OAAO;SAChB,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/C,OAAO,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAY;QACxB,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;YACxB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;YAC1C,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB;YACrD,WAAW,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC,CAAC;IACJ,CAAC;CACD"}
@@ -1,24 +1,32 @@
1
1
  import type { RetryConfig, S2RequestOptions } from "./common.js";
2
2
  import type { Client } from "./generated/client/types.gen.js";
3
- import { type AppendAck } from "./generated/index.js";
4
- import type { AppendArgs, AppendRecord, AppendSession, AppendSessionOptions, ReadArgs, ReadBatch, ReadSession, TransportConfig } from "./lib/stream/types.js";
3
+ import type { AppendSession, ReadSession, TransportConfig } from "./lib/stream/types.js";
4
+ import type * as Types from "./types.js";
5
+ /**
6
+ * Basin-scoped stream helper for append/read operations.
7
+ *
8
+ * Created via {@link S2Basin.stream}. Provides direct methods plus factories for read/append sessions.
9
+ */
5
10
  export declare class S2Stream {
6
11
  private readonly client;
7
12
  private readonly transportConfig;
8
13
  private readonly retryConfig?;
9
14
  private _transport?;
15
+ private closed;
16
+ private closePromise?;
10
17
  readonly name: string;
11
18
  constructor(name: string, client: Client, transportConfig: TransportConfig, retryConfig?: RetryConfig);
12
19
  /**
13
20
  * Get or create the transport instance
14
21
  */
15
22
  private getTransport;
23
+ private ensureOpen;
16
24
  /**
17
25
  * Check the tail of the stream.
18
26
  *
19
27
  * Returns the next sequence number and timestamp to be assigned (`tail`).
20
28
  */
21
- checkTail(options?: S2RequestOptions): Promise<import("./generated/types.gen.js").TailResponse>;
29
+ checkTail(options?: S2RequestOptions): Promise<Types.TailResponse>;
22
30
  /**
23
31
  * Read records from the stream.
24
32
  *
@@ -27,29 +35,33 @@ export declare class S2Stream {
27
35
  * - Non-streaming reads are bounded by `count` and `bytes` (defaults 1000 and 1 MiB).
28
36
  * - Use `readSession` for streaming reads
29
37
  */
30
- read<Format extends "string" | "bytes" = "string">(args?: ReadArgs<Format>, options?: S2RequestOptions): Promise<ReadBatch<Format>>;
38
+ read<Format extends "string" | "bytes" = "string">(input?: Types.ReadInput, options?: S2RequestOptions & {
39
+ as?: Format;
40
+ }): Promise<Types.ReadBatch<Format>>;
31
41
  /**
32
- * Append one or more records to the stream.
42
+ * Append a batch of records to the stream.
33
43
  *
34
44
  * - Automatically base64-encodes when format is "bytes".
35
- * - Supports conditional appends via `fencing_token` and `match_seq_num`.
45
+ * - Supports conditional appends via `fencingToken` and `matchSeqNum` in the input.
36
46
  * - Returns the acknowledged range and the stream tail after the append.
47
+ * - All records in a batch must use the same format (either all string or all bytes).
37
48
  *
38
- * All records in a single append call must use the same format (either all string or all bytes).
49
+ * Use {@link AppendInput.create} to construct a validated AppendInput.
39
50
  * For high-throughput sequential appends, use `appendSession()` instead.
40
51
  *
41
- * @param records The record(s) to append
42
- * @param args Optional append arguments (fencing_token, match_seq_num)
52
+ * @param input The append input containing records and optional conditions
43
53
  * @param options Optional request options
44
54
  */
45
- append(records: AppendRecord | AppendRecord[], args?: Omit<AppendArgs, "records">, options?: S2RequestOptions): Promise<AppendAck>;
55
+ append(input: Types.AppendInput, options?: S2RequestOptions): Promise<Types.AppendAck>;
46
56
  /**
47
57
  * Open a streaming read session
48
58
  *
49
59
  * Use the returned session as an async iterable or as a readable stream.
50
60
  * When `as: "bytes"` is provided, bodies and headers are decoded to `Uint8Array`.
51
61
  */
52
- readSession<Format extends "string" | "bytes" = "string">(args?: ReadArgs<Format>, options?: S2RequestOptions): Promise<ReadSession<Format>>;
62
+ readSession<Format extends "string" | "bytes" = "string">(input?: Types.ReadInput, options?: S2RequestOptions & {
63
+ as?: Format;
64
+ }): Promise<ReadSession<Format>>;
53
65
  /**
54
66
  * Create an append session that guarantees ordering of submissions.
55
67
  *
@@ -59,6 +71,8 @@ export declare class S2Stream {
59
71
  * @param sessionOptions Options that control append session behavior
60
72
  * @param requestOptions Optional request options
61
73
  */
62
- appendSession(sessionOptions?: AppendSessionOptions, requestOptions?: S2RequestOptions): Promise<AppendSession>;
74
+ appendSession(sessionOptions?: Types.AppendSessionOptions, requestOptions?: S2RequestOptions): Promise<AppendSession>;
75
+ close(): Promise<void>;
76
+ [Symbol.asyncDispose](): Promise<void>;
63
77
  }
64
78
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,sBAAsB,CAAC;AAOjE,OAAO,KAAK,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,WAAW,EAEX,eAAe,EACf,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,OAAO,CAAC,UAAU,CAAC,CAAmB;IAEtC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,WAAW,CAAC,EAAE,WAAW;IAQ1B;;OAEG;YACW,YAAY;IAO1B;;;;OAIG;IACU,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB;IAcjD;;;;;;;OAOG;IACU,IAAI,CAAC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAC7D,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAK7B;;;;;;;;;;;;;OAaG;IACU,MAAM,CAClB,OAAO,EAAE,YAAY,GAAG,YAAY,EAAE,EACtC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAClC,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,SAAS,CAAC;IAuBrB;;;;;OAKG;IACU,WAAW,CAAC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,QAAQ,EACpE,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAI/B;;;;;;;;OAQG;IACU,aAAa,CACzB,cAAc,CAAC,EAAE,oBAAoB,EACrC,cAAc,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,aAAa,CAAC;CAQzB"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAc9D,OAAO,KAAK,EACX,aAAa,EAEb,WAAW,EAEX,eAAe,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAC;AAEzC;;;;GAIG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAC,CAAgB;IAErC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,WAAW,CAAC,EAAE,WAAW;IAQ1B;;OAEG;YACW,YAAY;IAQ1B,OAAO,CAAC,UAAU;IAMlB;;;;OAIG;IACU,SAAS,CACrB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;IAgB9B;;;;;;;OAOG;IACU,IAAI,CAAC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,EACvB,OAAO,CAAC,EAAE,gBAAgB,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAuBnC;;;;;;;;;;;;;OAaG;IACU,MAAM,CAClB,KAAK,EAAE,KAAK,CAAC,WAAW,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;IAkB3B;;;;;OAKG;IACU,WAAW,CAAC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,QAAQ,EACpE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,EACvB,OAAO,CAAC,EAAE,gBAAgB,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAW/B;;;;;;;;OAQG;IACU,aAAa,CACzB,cAAc,CAAC,EAAE,KAAK,CAAC,oBAAoB,EAC3C,cAAc,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,aAAa,CAAC;IASZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B7B,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5C"}