@s2-dev/streamstore 0.16.11 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/basin.d.ts +9 -2
- package/dist/cjs/basin.d.ts.map +1 -1
- package/dist/cjs/basin.js +14 -5
- package/dist/cjs/basin.js.map +1 -1
- package/dist/cjs/batch-transform.d.ts +64 -0
- package/dist/cjs/batch-transform.d.ts.map +1 -0
- package/dist/cjs/batch-transform.js +144 -0
- package/dist/cjs/batch-transform.js.map +1 -0
- package/dist/cjs/generated/client/utils.gen.d.ts +1 -1
- package/dist/cjs/generated/client/utils.gen.d.ts.map +1 -1
- package/dist/cjs/generated/client/utils.gen.js +7 -6
- package/dist/cjs/generated/client/utils.gen.js.map +1 -1
- package/dist/cjs/generated/core/bodySerializer.gen.d.ts +12 -4
- package/dist/cjs/generated/core/bodySerializer.gen.d.ts.map +1 -1
- package/dist/cjs/generated/core/bodySerializer.gen.js.map +1 -1
- package/dist/cjs/generated/proto/s2.d.ts.map +1 -1
- package/dist/cjs/generated/proto/s2.js.map +1 -1
- package/dist/cjs/index.d.ts +4 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/stream/factory.d.ts +15 -0
- package/dist/cjs/lib/stream/factory.d.ts.map +1 -0
- package/dist/cjs/lib/stream/factory.js +36 -0
- package/dist/cjs/lib/stream/factory.js.map +1 -0
- package/dist/cjs/lib/stream/runtime.d.ts +13 -0
- package/dist/cjs/lib/stream/runtime.d.ts.map +1 -0
- package/dist/cjs/lib/stream/runtime.js +50 -0
- package/dist/cjs/lib/stream/runtime.js.map +1 -0
- package/dist/cjs/lib/stream/transport/fetch/index.d.ts +79 -0
- package/dist/cjs/lib/stream/transport/fetch/index.d.ts.map +1 -0
- package/dist/cjs/lib/stream/transport/fetch/index.js +382 -0
- package/dist/cjs/lib/stream/transport/fetch/index.js.map +1 -0
- package/dist/cjs/lib/stream/transport/fetch/shared.d.ts +7 -0
- package/dist/cjs/lib/stream/transport/fetch/shared.d.ts.map +1 -0
- package/dist/cjs/lib/stream/transport/fetch/shared.js +170 -0
- package/dist/cjs/lib/stream/transport/fetch/shared.js.map +1 -0
- package/dist/cjs/lib/stream/transport/s2s/framing.d.ts +47 -0
- package/dist/cjs/lib/stream/transport/s2s/framing.d.ts.map +1 -0
- package/dist/cjs/lib/stream/transport/s2s/framing.js +123 -0
- package/dist/cjs/lib/stream/transport/s2s/framing.js.map +1 -0
- package/dist/cjs/lib/stream/transport/s2s/index.d.ts +23 -0
- package/dist/cjs/lib/stream/transport/s2s/index.d.ts.map +1 -0
- package/dist/cjs/lib/stream/transport/s2s/index.js +785 -0
- package/dist/cjs/lib/stream/transport/s2s/index.js.map +1 -0
- package/dist/cjs/lib/stream/types.d.ts +53 -0
- package/dist/cjs/lib/stream/types.d.ts.map +1 -0
- package/dist/cjs/lib/stream/types.js +3 -0
- package/dist/cjs/lib/stream/types.js.map +1 -0
- package/dist/cjs/s2.d.ts +1 -0
- package/dist/cjs/s2.d.ts.map +1 -1
- package/dist/cjs/s2.js +3 -0
- package/dist/cjs/s2.js.map +1 -1
- package/dist/cjs/stream.d.ts +22 -116
- package/dist/cjs/stream.d.ts.map +1 -1
- package/dist/cjs/stream.js +34 -549
- package/dist/cjs/stream.js.map +1 -1
- package/dist/cjs/utils.d.ts +32 -6
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +129 -34
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/basin.d.ts +9 -2
- package/dist/esm/basin.d.ts.map +1 -1
- package/dist/esm/basin.js +14 -5
- package/dist/esm/basin.js.map +1 -1
- package/dist/esm/batch-transform.d.ts +64 -0
- package/dist/esm/batch-transform.d.ts.map +1 -0
- package/dist/esm/batch-transform.js +140 -0
- package/dist/esm/batch-transform.js.map +1 -0
- package/dist/esm/generated/client/utils.gen.d.ts +1 -1
- package/dist/esm/generated/client/utils.gen.d.ts.map +1 -1
- package/dist/esm/generated/client/utils.gen.js +7 -6
- package/dist/esm/generated/client/utils.gen.js.map +1 -1
- package/dist/esm/generated/core/bodySerializer.gen.d.ts +12 -4
- package/dist/esm/generated/core/bodySerializer.gen.d.ts.map +1 -1
- package/dist/esm/generated/core/bodySerializer.gen.js.map +1 -1
- package/dist/esm/generated/proto/s2.d.ts.map +1 -1
- package/dist/esm/generated/proto/s2.js.map +1 -1
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/stream/factory.d.ts +15 -0
- package/dist/esm/lib/stream/factory.d.ts.map +1 -0
- package/dist/esm/lib/stream/factory.js +33 -0
- package/dist/esm/lib/stream/factory.js.map +1 -0
- package/dist/esm/lib/stream/runtime.d.ts +13 -0
- package/dist/esm/lib/stream/runtime.d.ts.map +1 -0
- package/dist/esm/lib/stream/runtime.js +46 -0
- package/dist/esm/lib/stream/runtime.js.map +1 -0
- package/dist/esm/lib/stream/transport/fetch/index.d.ts +79 -0
- package/dist/esm/lib/stream/transport/fetch/index.d.ts.map +1 -0
- package/dist/esm/lib/stream/transport/fetch/index.js +376 -0
- package/dist/esm/lib/stream/transport/fetch/index.js.map +1 -0
- package/dist/esm/lib/stream/transport/fetch/shared.d.ts +7 -0
- package/dist/esm/lib/stream/transport/fetch/shared.d.ts.map +1 -0
- package/dist/esm/lib/stream/transport/fetch/shared.js +166 -0
- package/dist/esm/lib/stream/transport/fetch/shared.js.map +1 -0
- package/dist/esm/lib/stream/transport/s2s/framing.d.ts +47 -0
- package/dist/esm/lib/stream/transport/s2s/framing.d.ts.map +1 -0
- package/dist/esm/lib/stream/transport/s2s/framing.js +118 -0
- package/dist/esm/lib/stream/transport/s2s/framing.js.map +1 -0
- package/dist/esm/lib/stream/transport/s2s/index.d.ts +23 -0
- package/dist/esm/lib/stream/transport/s2s/index.d.ts.map +1 -0
- package/dist/esm/lib/stream/transport/s2s/index.js +781 -0
- package/dist/esm/lib/stream/transport/s2s/index.js.map +1 -0
- package/dist/esm/lib/stream/types.d.ts +53 -0
- package/dist/esm/lib/stream/types.d.ts.map +1 -0
- package/dist/esm/lib/stream/types.js +2 -0
- package/dist/esm/lib/stream/types.js.map +1 -0
- package/dist/esm/s2.d.ts +1 -0
- package/dist/esm/s2.d.ts.map +1 -1
- package/dist/esm/s2.js +3 -0
- package/dist/esm/s2.js.map +1 -1
- package/dist/esm/stream.d.ts +22 -116
- package/dist/esm/stream.d.ts.map +1 -1
- package/dist/esm/stream.js +36 -551
- package/dist/esm/stream.js.map +1 -1
- package/dist/esm/utils.d.ts +32 -6
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +126 -34
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -4
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { RangeNotSatisfiableError, S2Error } from "../../../../error.js";
|
|
2
|
+
import { createClient, createConfig, } from "../../../../generated/client/index.js";
|
|
3
|
+
import { read } from "../../../../generated/index.js";
|
|
4
|
+
import { meteredSizeBytes } from "../../../../utils.js";
|
|
5
|
+
import { decodeFromBase64 } from "../../../base64.js";
|
|
6
|
+
import { EventStream } from "../../../event-stream.js";
|
|
7
|
+
import * as Redacted from "../../../redacted.js";
|
|
8
|
+
import { streamAppend } from "./shared.js";
|
|
9
|
+
export class FetchReadSession extends EventStream {
|
|
10
|
+
static async create(client, name, args, options) {
|
|
11
|
+
const { as, ...queryParams } = args ?? {};
|
|
12
|
+
const response = await read({
|
|
13
|
+
client,
|
|
14
|
+
path: {
|
|
15
|
+
stream: name,
|
|
16
|
+
},
|
|
17
|
+
headers: {
|
|
18
|
+
accept: "text/event-stream",
|
|
19
|
+
...(as === "bytes" ? { "s2-format": "base64" } : {}),
|
|
20
|
+
},
|
|
21
|
+
query: queryParams,
|
|
22
|
+
parseAs: "stream",
|
|
23
|
+
...options,
|
|
24
|
+
});
|
|
25
|
+
if (response.error) {
|
|
26
|
+
if ("message" in response.error) {
|
|
27
|
+
throw new S2Error({
|
|
28
|
+
message: response.error.message,
|
|
29
|
+
code: response.error.code ?? undefined,
|
|
30
|
+
status: response.response.status,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// special case for 416 - Range Not Satisfiable
|
|
35
|
+
throw new RangeNotSatisfiableError({
|
|
36
|
+
status: response.response.status,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!response.response.body) {
|
|
41
|
+
throw new S2Error({
|
|
42
|
+
message: "No body in SSE response",
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const format = (args?.as ?? "string");
|
|
46
|
+
return new FetchReadSession(response.response.body, format);
|
|
47
|
+
}
|
|
48
|
+
_lastReadPosition = undefined;
|
|
49
|
+
constructor(stream, format) {
|
|
50
|
+
super(stream, (msg) => {
|
|
51
|
+
// Parse SSE events according to the S2 protocol
|
|
52
|
+
if (msg.event === "batch" && msg.data) {
|
|
53
|
+
const rawBatch = JSON.parse(msg.data);
|
|
54
|
+
const batch = (() => {
|
|
55
|
+
// If format is bytes, decode base64 to Uint8Array
|
|
56
|
+
if (format === "bytes") {
|
|
57
|
+
return {
|
|
58
|
+
...rawBatch,
|
|
59
|
+
records: rawBatch.records.map((record) => ({
|
|
60
|
+
...record,
|
|
61
|
+
body: record.body ? decodeFromBase64(record.body) : undefined,
|
|
62
|
+
headers: record.headers?.map((header) => header.map((h) => decodeFromBase64(h))),
|
|
63
|
+
})),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
return {
|
|
68
|
+
...rawBatch,
|
|
69
|
+
records: rawBatch.records.map((record) => ({
|
|
70
|
+
...record,
|
|
71
|
+
headers: record.headers
|
|
72
|
+
? Object.fromEntries(record.headers)
|
|
73
|
+
: undefined,
|
|
74
|
+
})),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
})();
|
|
78
|
+
if (batch.tail) {
|
|
79
|
+
this._lastReadPosition = batch.tail;
|
|
80
|
+
}
|
|
81
|
+
return { done: false, batch: true, value: batch.records ?? [] };
|
|
82
|
+
}
|
|
83
|
+
if (msg.event === "error") {
|
|
84
|
+
// Handle error events
|
|
85
|
+
throw new S2Error({ message: msg.data ?? "Unknown error" });
|
|
86
|
+
}
|
|
87
|
+
// Skip ping events and other events
|
|
88
|
+
return { done: false };
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
lastReadPosition() {
|
|
92
|
+
return this._lastReadPosition;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
class AcksStream extends ReadableStream {
|
|
96
|
+
constructor(setController) {
|
|
97
|
+
super({
|
|
98
|
+
start: (controller) => {
|
|
99
|
+
setController(controller);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async [Symbol.asyncDispose]() {
|
|
104
|
+
await this.cancel("disposed");
|
|
105
|
+
}
|
|
106
|
+
// Polyfill for older browsers
|
|
107
|
+
[Symbol.asyncIterator]() {
|
|
108
|
+
const fn = ReadableStream.prototype[Symbol.asyncIterator];
|
|
109
|
+
if (typeof fn === "function")
|
|
110
|
+
return fn.call(this);
|
|
111
|
+
const reader = this.getReader();
|
|
112
|
+
return {
|
|
113
|
+
next: async () => {
|
|
114
|
+
const r = await reader.read();
|
|
115
|
+
if (r.done) {
|
|
116
|
+
reader.releaseLock();
|
|
117
|
+
return { done: true, value: undefined };
|
|
118
|
+
}
|
|
119
|
+
return { done: false, value: r.value };
|
|
120
|
+
},
|
|
121
|
+
throw: async (e) => {
|
|
122
|
+
await reader.cancel(e);
|
|
123
|
+
reader.releaseLock();
|
|
124
|
+
return { done: true, value: undefined };
|
|
125
|
+
},
|
|
126
|
+
return: async () => {
|
|
127
|
+
await reader.cancel("done");
|
|
128
|
+
reader.releaseLock();
|
|
129
|
+
return { done: true, value: undefined };
|
|
130
|
+
},
|
|
131
|
+
[Symbol.asyncIterator]() {
|
|
132
|
+
return this;
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Session for appending records to a stream.
|
|
139
|
+
* Queues append requests and ensures only one is in-flight at a time.
|
|
140
|
+
*/
|
|
141
|
+
export class FetchAppendSession {
|
|
142
|
+
_lastAckedPosition = undefined;
|
|
143
|
+
queue = [];
|
|
144
|
+
pendingResolvers = [];
|
|
145
|
+
inFlight = false;
|
|
146
|
+
options;
|
|
147
|
+
stream;
|
|
148
|
+
acksController;
|
|
149
|
+
_readable;
|
|
150
|
+
_writable;
|
|
151
|
+
closed = false;
|
|
152
|
+
processingPromise = null;
|
|
153
|
+
queuedBytes = 0;
|
|
154
|
+
maxQueuedBytes;
|
|
155
|
+
waitingForCapacity = [];
|
|
156
|
+
client;
|
|
157
|
+
readable;
|
|
158
|
+
writable;
|
|
159
|
+
static async create(stream, transportConfig, sessionOptions, requestOptions) {
|
|
160
|
+
return new FetchAppendSession(stream, transportConfig, sessionOptions, requestOptions);
|
|
161
|
+
}
|
|
162
|
+
constructor(stream, transportConfig, sessionOptions, requestOptions) {
|
|
163
|
+
this.options = requestOptions;
|
|
164
|
+
this.stream = stream;
|
|
165
|
+
this.maxQueuedBytes = sessionOptions?.maxQueuedBytes ?? 10 * 1024 * 1024; // 10 MiB default
|
|
166
|
+
this.client = createClient(createConfig({
|
|
167
|
+
baseUrl: transportConfig.baseUrl,
|
|
168
|
+
auth: () => Redacted.value(transportConfig.accessToken),
|
|
169
|
+
}));
|
|
170
|
+
// Create the readable stream for acks
|
|
171
|
+
this._readable = new AcksStream((controller) => {
|
|
172
|
+
this.acksController = controller;
|
|
173
|
+
});
|
|
174
|
+
this.readable = this._readable;
|
|
175
|
+
// Create the writable stream
|
|
176
|
+
let writableController;
|
|
177
|
+
this._writable = new WritableStream({
|
|
178
|
+
start: (controller) => {
|
|
179
|
+
writableController = controller;
|
|
180
|
+
},
|
|
181
|
+
write: async (chunk) => {
|
|
182
|
+
// Calculate batch size
|
|
183
|
+
let batchMeteredSize = 0;
|
|
184
|
+
for (const record of chunk.records) {
|
|
185
|
+
batchMeteredSize += meteredSizeBytes(record);
|
|
186
|
+
}
|
|
187
|
+
// Wait for capacity if needed
|
|
188
|
+
while (this.queuedBytes + batchMeteredSize > this.maxQueuedBytes &&
|
|
189
|
+
!this.closed) {
|
|
190
|
+
await new Promise((resolve) => {
|
|
191
|
+
this.waitingForCapacity.push(resolve);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Submit the batch
|
|
195
|
+
this.submit(chunk.records, {
|
|
196
|
+
fencing_token: chunk.fencing_token ?? undefined,
|
|
197
|
+
match_seq_num: chunk.match_seq_num ?? undefined,
|
|
198
|
+
}, batchMeteredSize);
|
|
199
|
+
},
|
|
200
|
+
close: async () => {
|
|
201
|
+
this.closed = true;
|
|
202
|
+
await this.waitForDrain();
|
|
203
|
+
},
|
|
204
|
+
abort: async (reason) => {
|
|
205
|
+
this.closed = true;
|
|
206
|
+
this.queue = [];
|
|
207
|
+
this.queuedBytes = 0;
|
|
208
|
+
// Reject all pending promises
|
|
209
|
+
const error = new S2Error({
|
|
210
|
+
message: `AppendSession was aborted: ${reason}`,
|
|
211
|
+
});
|
|
212
|
+
for (const resolver of this.pendingResolvers) {
|
|
213
|
+
resolver.reject(error);
|
|
214
|
+
}
|
|
215
|
+
this.pendingResolvers = [];
|
|
216
|
+
// Reject all waiting for capacity
|
|
217
|
+
for (const resolver of this.waitingForCapacity) {
|
|
218
|
+
resolver();
|
|
219
|
+
}
|
|
220
|
+
this.waitingForCapacity = [];
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
this.writable = this._writable;
|
|
224
|
+
}
|
|
225
|
+
async [Symbol.asyncDispose]() {
|
|
226
|
+
await this.close();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get a stream of acknowledgements for appends.
|
|
230
|
+
*/
|
|
231
|
+
acks() {
|
|
232
|
+
return this._readable;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Close the append session.
|
|
236
|
+
* Waits for all pending appends to complete before resolving.
|
|
237
|
+
*/
|
|
238
|
+
async close() {
|
|
239
|
+
await this.writable.close();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Submit an append request to the session.
|
|
243
|
+
* The request will be queued and sent when no other request is in-flight.
|
|
244
|
+
* Returns a promise that resolves when the append is acknowledged or rejects on error.
|
|
245
|
+
*/
|
|
246
|
+
submit(records, args, precalculatedSize) {
|
|
247
|
+
if (this.closed) {
|
|
248
|
+
return Promise.reject(new S2Error({ message: "AppendSession is closed" }));
|
|
249
|
+
}
|
|
250
|
+
const recordsArray = Array.isArray(records) ? records : [records];
|
|
251
|
+
// Validate batch size limits
|
|
252
|
+
if (recordsArray.length > 1000) {
|
|
253
|
+
return Promise.reject(new S2Error({
|
|
254
|
+
message: `Batch of ${recordsArray.length} exceeds maximum batch size of 1000 records`,
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
// Validate metered size (use precalculated if provided)
|
|
258
|
+
let batchMeteredSize = precalculatedSize ?? 0;
|
|
259
|
+
if (batchMeteredSize === 0) {
|
|
260
|
+
for (const record of recordsArray) {
|
|
261
|
+
batchMeteredSize += meteredSizeBytes(record);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (batchMeteredSize > 1024 * 1024) {
|
|
265
|
+
return Promise.reject(new S2Error({
|
|
266
|
+
message: `Batch size ${batchMeteredSize} bytes exceeds maximum of 1 MiB (1048576 bytes)`,
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
return new Promise((resolve, reject) => {
|
|
270
|
+
this.queue.push({
|
|
271
|
+
records: recordsArray,
|
|
272
|
+
fencing_token: args?.fencing_token,
|
|
273
|
+
match_seq_num: args?.match_seq_num,
|
|
274
|
+
meteredSize: batchMeteredSize,
|
|
275
|
+
});
|
|
276
|
+
this.queuedBytes += batchMeteredSize;
|
|
277
|
+
this.pendingResolvers.push({ resolve, reject });
|
|
278
|
+
// Start processing if not already running
|
|
279
|
+
if (!this.processingPromise) {
|
|
280
|
+
this.processingPromise = this.processLoop();
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Main processing loop that sends queued requests one at a time.
|
|
286
|
+
*/
|
|
287
|
+
async processLoop() {
|
|
288
|
+
while (this.queue.length > 0) {
|
|
289
|
+
this.inFlight = true;
|
|
290
|
+
const args = this.queue.shift();
|
|
291
|
+
const resolver = this.pendingResolvers.shift();
|
|
292
|
+
try {
|
|
293
|
+
const ack = await streamAppend(this.stream, this.client, args.records, {
|
|
294
|
+
fencing_token: args.fencing_token,
|
|
295
|
+
match_seq_num: args.match_seq_num,
|
|
296
|
+
}, this.options);
|
|
297
|
+
this._lastAckedPosition = ack;
|
|
298
|
+
// Emit ack to the acks stream if it exists
|
|
299
|
+
if (this.acksController) {
|
|
300
|
+
this.acksController.enqueue(ack);
|
|
301
|
+
}
|
|
302
|
+
// Resolve the promise for this request
|
|
303
|
+
resolver.resolve(ack);
|
|
304
|
+
// Release capacity and wake up waiting writers
|
|
305
|
+
this.queuedBytes -= args.meteredSize;
|
|
306
|
+
while (this.waitingForCapacity.length > 0) {
|
|
307
|
+
const waiter = this.waitingForCapacity.shift();
|
|
308
|
+
waiter();
|
|
309
|
+
// Only wake one at a time - let them check capacity again
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
this.inFlight = false;
|
|
315
|
+
this.processingPromise = null;
|
|
316
|
+
// Reject the promise for this request
|
|
317
|
+
resolver.reject(error);
|
|
318
|
+
// Reject all remaining pending promises
|
|
319
|
+
for (const pendingResolver of this.pendingResolvers) {
|
|
320
|
+
pendingResolver.reject(error);
|
|
321
|
+
}
|
|
322
|
+
this.pendingResolvers = [];
|
|
323
|
+
// Clear the queue and reset queued bytes
|
|
324
|
+
this.queue = [];
|
|
325
|
+
this.queuedBytes = 0;
|
|
326
|
+
// Wake up all waiting writers (they'll see the closed state or retry)
|
|
327
|
+
for (const waiter of this.waitingForCapacity) {
|
|
328
|
+
waiter();
|
|
329
|
+
}
|
|
330
|
+
this.waitingForCapacity = [];
|
|
331
|
+
// Do not rethrow here to avoid unhandled rejection; callers already received rejection
|
|
332
|
+
}
|
|
333
|
+
this.inFlight = false;
|
|
334
|
+
}
|
|
335
|
+
this.processingPromise = null;
|
|
336
|
+
}
|
|
337
|
+
async waitForDrain() {
|
|
338
|
+
// Wait for processing to complete
|
|
339
|
+
if (this.processingPromise) {
|
|
340
|
+
await this.processingPromise;
|
|
341
|
+
}
|
|
342
|
+
// Wait until queue is empty and nothing is in flight
|
|
343
|
+
while (this.queue.length > 0 || this.inFlight) {
|
|
344
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
345
|
+
}
|
|
346
|
+
// Close the acks stream if it exists
|
|
347
|
+
if (this.acksController) {
|
|
348
|
+
this.acksController.close();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
lastAckedPosition() {
|
|
352
|
+
return this._lastAckedPosition;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Fetch-based transport using HTTP/1.1 + JSON
|
|
357
|
+
* Works in all JavaScript environments (browser, Node.js, Deno, etc.)
|
|
358
|
+
*/
|
|
359
|
+
export class FetchTransport {
|
|
360
|
+
client;
|
|
361
|
+
transportConfig;
|
|
362
|
+
constructor(config) {
|
|
363
|
+
this.client = createClient(createConfig({
|
|
364
|
+
baseUrl: config.baseUrl,
|
|
365
|
+
auth: () => Redacted.value(config.accessToken),
|
|
366
|
+
}));
|
|
367
|
+
this.transportConfig = config;
|
|
368
|
+
}
|
|
369
|
+
async makeAppendSession(stream, sessionOptions, requestOptions) {
|
|
370
|
+
return FetchAppendSession.create(stream, this.transportConfig, sessionOptions, requestOptions);
|
|
371
|
+
}
|
|
372
|
+
async makeReadSession(stream, args, options) {
|
|
373
|
+
return FetchReadSession.create(this.client, stream, args, options);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/lib/stream/transport/fetch/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { S2RequestOptions } from "../../../../common.js";
|
|
2
|
+
import type { Client } from "../../../../generated/client/index.js";
|
|
3
|
+
import { type AppendAck } from "../../../../generated/index.js";
|
|
4
|
+
import type { AppendArgs, AppendRecord, ReadArgs, ReadBatch } from "../../types.js";
|
|
5
|
+
export declare function streamRead<Format extends "string" | "bytes" = "string">(stream: string, client: Client, args?: ReadArgs<Format>, options?: S2RequestOptions): Promise<ReadBatch<Format>>;
|
|
6
|
+
export declare function streamAppend(stream: string, client: Client, records: AppendRecord | AppendRecord[], args?: Omit<AppendArgs, "records">, options?: S2RequestOptions): Promise<AppendAck>;
|
|
7
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/stream/transport/fetch/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EACN,KAAK,SAAS,EAUd,MAAM,gCAAgC,CAAC;AAMxC,OAAO,KAAK,EACX,UAAU,EAEV,YAAY,EAEZ,QAAQ,EACR,SAAS,EACT,MAAM,gBAAgB,CAAC;AAExB,wBAAsB,UAAU,CAAC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAC5E,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,OAAO,CAAC,EAAE,gBAAgB,8BA2D1B;AAED,wBAAsB,YAAY,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GAAG,YAAY,EAAE,EACtC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAClC,OAAO,CAAC,EAAE,gBAAgB,sBAqH1B"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { FencingTokenMismatchError, RangeNotSatisfiableError, S2Error, SeqNumMismatchError, } from "../../../../error.js";
|
|
2
|
+
import { append, checkTail, read, } from "../../../../generated/index.js";
|
|
3
|
+
import { computeAppendRecordFormat, meteredSizeBytes, } from "../../../../utils.js";
|
|
4
|
+
import { decodeFromBase64, encodeToBase64 } from "../../../base64.js";
|
|
5
|
+
export async function streamRead(stream, client, args, options) {
|
|
6
|
+
const { as, ...queryParams } = args ?? {};
|
|
7
|
+
const response = await read({
|
|
8
|
+
client,
|
|
9
|
+
path: {
|
|
10
|
+
stream,
|
|
11
|
+
},
|
|
12
|
+
headers: {
|
|
13
|
+
...(as === "bytes" ? { "s2-format": "base64" } : {}),
|
|
14
|
+
},
|
|
15
|
+
query: queryParams,
|
|
16
|
+
...options,
|
|
17
|
+
});
|
|
18
|
+
if (response.error) {
|
|
19
|
+
if ("message" in response.error) {
|
|
20
|
+
throw new S2Error({
|
|
21
|
+
message: response.error.message,
|
|
22
|
+
code: response.error.code ?? undefined,
|
|
23
|
+
status: response.response.status,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// special case for 416 - Range Not Satisfiable
|
|
28
|
+
throw new RangeNotSatisfiableError({
|
|
29
|
+
status: response.response.status,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (args?.as === "bytes") {
|
|
34
|
+
const res = {
|
|
35
|
+
...response.data,
|
|
36
|
+
records: response.data.records?.map((record) => ({
|
|
37
|
+
...record,
|
|
38
|
+
body: record.body ? decodeFromBase64(record.body) : undefined,
|
|
39
|
+
headers: record.headers?.map((header) => header.map((h) => decodeFromBase64(h))),
|
|
40
|
+
})),
|
|
41
|
+
};
|
|
42
|
+
return res;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const res = {
|
|
46
|
+
...response.data,
|
|
47
|
+
records: response.data.records.map((record) => ({
|
|
48
|
+
...record,
|
|
49
|
+
headers: record.headers
|
|
50
|
+
? Object.fromEntries(record.headers)
|
|
51
|
+
: undefined,
|
|
52
|
+
})),
|
|
53
|
+
};
|
|
54
|
+
return res;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function streamAppend(stream, client, records, args, options) {
|
|
58
|
+
const recordsArray = Array.isArray(records) ? records : [records];
|
|
59
|
+
if (recordsArray.length === 0) {
|
|
60
|
+
throw new S2Error({ message: "Cannot append empty array of records" });
|
|
61
|
+
}
|
|
62
|
+
let batchMeteredSize = 0;
|
|
63
|
+
for (const record of recordsArray) {
|
|
64
|
+
batchMeteredSize += meteredSizeBytes(record);
|
|
65
|
+
}
|
|
66
|
+
if (batchMeteredSize > 1024 * 1024) {
|
|
67
|
+
throw new S2Error({
|
|
68
|
+
message: `Batch size ${batchMeteredSize} bytes exceeds maximum of 1 MiB (1048576 bytes)`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (recordsArray.length > 1000) {
|
|
72
|
+
throw new S2Error({
|
|
73
|
+
message: `Batch of ${recordsArray.length} exceeds maximum batch size of 1000 records`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
let encodedRecords = [];
|
|
77
|
+
let hasAnyBytesRecords = false;
|
|
78
|
+
for (const record of recordsArray) {
|
|
79
|
+
const format = computeAppendRecordFormat(record);
|
|
80
|
+
if (format === "bytes") {
|
|
81
|
+
const formattedRecord = record;
|
|
82
|
+
const encodedRecord = {
|
|
83
|
+
...formattedRecord,
|
|
84
|
+
body: formattedRecord.body
|
|
85
|
+
? encodeToBase64(formattedRecord.body)
|
|
86
|
+
: undefined,
|
|
87
|
+
headers: formattedRecord.headers?.map((header) => header.map((h) => encodeToBase64(h))),
|
|
88
|
+
};
|
|
89
|
+
encodedRecords.push(encodedRecord);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Normalize headers to array format
|
|
93
|
+
const normalizeHeaders = (headers) => {
|
|
94
|
+
if (headers === undefined) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
else if (Array.isArray(headers)) {
|
|
98
|
+
return headers;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
return Object.entries(headers);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const formattedRecord = record;
|
|
105
|
+
const encodedRecord = {
|
|
106
|
+
...formattedRecord,
|
|
107
|
+
headers: formattedRecord.headers
|
|
108
|
+
? normalizeHeaders(formattedRecord.headers)
|
|
109
|
+
: undefined,
|
|
110
|
+
};
|
|
111
|
+
encodedRecords.push(encodedRecord);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const response = await append({
|
|
115
|
+
client,
|
|
116
|
+
path: {
|
|
117
|
+
stream,
|
|
118
|
+
},
|
|
119
|
+
body: {
|
|
120
|
+
fencing_token: args?.fencing_token,
|
|
121
|
+
match_seq_num: args?.match_seq_num,
|
|
122
|
+
records: encodedRecords,
|
|
123
|
+
},
|
|
124
|
+
headers: {
|
|
125
|
+
...(hasAnyBytesRecords ? { "s2-format": "base64" } : {}),
|
|
126
|
+
},
|
|
127
|
+
...options,
|
|
128
|
+
});
|
|
129
|
+
if (response.error) {
|
|
130
|
+
if ("message" in response.error) {
|
|
131
|
+
throw new S2Error({
|
|
132
|
+
message: response.error.message,
|
|
133
|
+
code: response.error.code ?? undefined,
|
|
134
|
+
status: response.response.status,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// special case for 412 - append condition failed
|
|
139
|
+
if ("seq_num_mismatch" in response.error) {
|
|
140
|
+
throw new SeqNumMismatchError({
|
|
141
|
+
message: "Append condition failed: sequence number mismatch",
|
|
142
|
+
code: "APPEND_CONDITION_FAILED",
|
|
143
|
+
status: response.response.status,
|
|
144
|
+
expectedSeqNum: response.error.seq_num_mismatch,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else if ("fencing_token_mismatch" in response.error) {
|
|
148
|
+
throw new FencingTokenMismatchError({
|
|
149
|
+
message: "Append condition failed: fencing token mismatch",
|
|
150
|
+
code: "APPEND_CONDITION_FAILED",
|
|
151
|
+
status: response.response.status,
|
|
152
|
+
expectedFencingToken: response.error.fencing_token_mismatch,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// fallback for unknown 412 error format
|
|
157
|
+
throw new S2Error({
|
|
158
|
+
message: "Append condition failed",
|
|
159
|
+
status: response.response.status,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return response.data;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../../src/lib/stream/transport/fetch/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S2S Protocol Message Framing
|
|
3
|
+
*
|
|
4
|
+
* Message format:
|
|
5
|
+
* - 3 bytes: Length prefix (total message length including flag byte, big-endian)
|
|
6
|
+
* - 1 byte: Flag byte [T][CC][RRRRR]
|
|
7
|
+
* - T (bit 7): Terminal flag (1 = stream ends after this message)
|
|
8
|
+
* - CC (bits 6-5): Compression (00=none, 01=zstd, 10=gzip)
|
|
9
|
+
* - RRRRR (bits 4-0): Reserved
|
|
10
|
+
* - Variable: Body (protobuf message or JSON error for terminal frames)
|
|
11
|
+
*/
|
|
12
|
+
export type CompressionType = "none" | "zstd" | "gzip";
|
|
13
|
+
export interface S2SFrame {
|
|
14
|
+
terminal: boolean;
|
|
15
|
+
compression: CompressionType;
|
|
16
|
+
body: Uint8Array;
|
|
17
|
+
statusCode?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Frame a message for s2s protocol
|
|
21
|
+
*/
|
|
22
|
+
export declare function frameMessage(opts: {
|
|
23
|
+
terminal: boolean;
|
|
24
|
+
compression?: CompressionType;
|
|
25
|
+
body: Uint8Array;
|
|
26
|
+
statusCode?: number;
|
|
27
|
+
}): Uint8Array;
|
|
28
|
+
/**
|
|
29
|
+
* Parser for reading s2s frames from a stream
|
|
30
|
+
*/
|
|
31
|
+
export declare class S2SFrameParser {
|
|
32
|
+
private buffer;
|
|
33
|
+
/**
|
|
34
|
+
* Add data to the parser buffer
|
|
35
|
+
*/
|
|
36
|
+
push(data: Uint8Array): void;
|
|
37
|
+
/**
|
|
38
|
+
* Try to parse the next frame from the buffer
|
|
39
|
+
* Returns null if not enough data available
|
|
40
|
+
*/
|
|
41
|
+
parseFrame(): S2SFrame | null;
|
|
42
|
+
/**
|
|
43
|
+
* Check if parser has any buffered data
|
|
44
|
+
*/
|
|
45
|
+
hasData(): boolean;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=framing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/stream/transport/s2s/framing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,UAAU,CA+Cb;AAED;;GAEG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,MAAM,CAAiC;IAE/C;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAOnC;;;OAGG;IACI,UAAU,IAAI,QAAQ,GAAG,IAAI;IA8CpC;;OAEG;IACI,OAAO,IAAI,OAAO;CAGzB"}
|