@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
package/dist/cjs/utils.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { AppendRecord as AppendRecordType } from "./stream.js";
|
|
2
|
-
type Headers = Record<string, string> | Array<[string | Uint8Array, string | Uint8Array]>;
|
|
1
|
+
import type { AppendHeaders, AppendRecord as AppendRecordType } from "./lib/stream/types.js";
|
|
3
2
|
export type AppendRecord = AppendRecordType;
|
|
3
|
+
declare function appendRecordMake(body?: string, headers?: AppendHeaders<"string">, timestamp?: number): AppendRecord;
|
|
4
|
+
declare function appendRecordMake(body?: Uint8Array, headers?: AppendHeaders<"bytes">, timestamp?: number): AppendRecord;
|
|
5
|
+
declare function appendRecordCommand(command: string, body?: string, timestamp?: number): AppendRecord;
|
|
6
|
+
declare function appendRecordCommand(command: Uint8Array, body?: Uint8Array, timestamp?: number): AppendRecord;
|
|
4
7
|
/**
|
|
5
8
|
* Helpers to construct appendable records.
|
|
6
9
|
*
|
|
@@ -11,10 +14,33 @@ export type AppendRecord = AppendRecordType;
|
|
|
11
14
|
* - `trim` is a command record that encodes a sequence number for trimming
|
|
12
15
|
*/
|
|
13
16
|
export declare const AppendRecord: {
|
|
14
|
-
readonly make:
|
|
15
|
-
readonly command:
|
|
16
|
-
readonly fence: (fencing_token: string,
|
|
17
|
-
readonly trim: (seqNum: number | bigint,
|
|
17
|
+
readonly make: typeof appendRecordMake;
|
|
18
|
+
readonly command: typeof appendRecordCommand;
|
|
19
|
+
readonly fence: (fencing_token: string, timestamp?: number) => AppendRecord;
|
|
20
|
+
readonly trim: (seqNum: number | bigint, timestamp?: number) => AppendRecord;
|
|
18
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* Calculate the UTF-8 byte length of a string.
|
|
24
|
+
* Handles all Unicode characters including surrogate pairs correctly.
|
|
25
|
+
*
|
|
26
|
+
* @param str The string to measure
|
|
27
|
+
* @returns The byte length when encoded as UTF-8
|
|
28
|
+
*/
|
|
29
|
+
export declare function utf8ByteLength(str: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Calculate the metered size in bytes of an AppendRecord.
|
|
32
|
+
* This includes the body and headers, but not metadata like timestamp.
|
|
33
|
+
*
|
|
34
|
+
* This function calculates how many bytes the record will occupy
|
|
35
|
+
* after being received and deserialized as raw bytes on the S2 side.
|
|
36
|
+
* For strings, it calculates UTF-8 byte length. For Uint8Array, it uses
|
|
37
|
+
* the array length directly (same value as would be used when encoding
|
|
38
|
+
* to base64 for transmission).
|
|
39
|
+
*
|
|
40
|
+
* @param record The record to measure
|
|
41
|
+
* @returns The size in bytes
|
|
42
|
+
*/
|
|
43
|
+
export declare function meteredSizeBytes(record: AppendRecord): number;
|
|
44
|
+
export declare function computeAppendRecordFormat(record: AppendRecord): "string" | "bytes";
|
|
19
45
|
export {};
|
|
20
46
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/cjs/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EACb,YAAY,IAAI,gBAAgB,EAChC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C,iBAAS,gBAAgB,CACxB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,EACjC,SAAS,CAAC,EAAE,MAAM,GAChB,YAAY,CAAC;AAChB,iBAAS,gBAAgB,CACxB,IAAI,CAAC,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,GAChB,YAAY,CAAC;AAahB,iBAAS,mBAAmB,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GAChB,YAAY,CAAC;AAChB,iBAAS,mBAAmB,CAC3B,OAAO,EAAE,UAAU,EACnB,IAAI,CAAC,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,MAAM,GAChB,YAAY,CAAC;AAgBhB;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY;;;oCAID,MAAM,cAAc,MAAM,KAAG,YAAY;4BAGjD,MAAM,GAAG,MAAM,cAAc,MAAM,KAAG,YAAY;CAWxD,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiClD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgC7D;AAED,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,YAAY,GAClB,QAAQ,GAAG,OAAO,CAiBpB"}
|
package/dist/cjs/utils.js
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AppendRecord = void 0;
|
|
4
|
+
exports.utf8ByteLength = utf8ByteLength;
|
|
5
|
+
exports.meteredSizeBytes = meteredSizeBytes;
|
|
6
|
+
exports.computeAppendRecordFormat = computeAppendRecordFormat;
|
|
7
|
+
function appendRecordMake(body, headers, timestamp) {
|
|
8
|
+
return {
|
|
9
|
+
body,
|
|
10
|
+
headers,
|
|
11
|
+
timestamp,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function appendRecordCommand(command, body, timestamp) {
|
|
15
|
+
const headers = (() => {
|
|
16
|
+
if (typeof command === "string") {
|
|
17
|
+
return [["", command]];
|
|
18
|
+
}
|
|
19
|
+
return [[new TextEncoder().encode(""), command]];
|
|
20
|
+
})();
|
|
21
|
+
// safety: we know the types are correct because of the overloads
|
|
22
|
+
return exports.AppendRecord.make(body, headers, timestamp);
|
|
23
|
+
}
|
|
4
24
|
/**
|
|
5
25
|
* Helpers to construct appendable records.
|
|
6
26
|
*
|
|
@@ -11,45 +31,120 @@ exports.AppendRecord = void 0;
|
|
|
11
31
|
* - `trim` is a command record that encodes a sequence number for trimming
|
|
12
32
|
*/
|
|
13
33
|
exports.AppendRecord = {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
34
|
+
// overloads for only string or only bytes
|
|
35
|
+
make: appendRecordMake,
|
|
36
|
+
command: appendRecordCommand,
|
|
37
|
+
fence: (fencing_token, timestamp) => {
|
|
38
|
+
return exports.AppendRecord.command("fence", fencing_token, timestamp);
|
|
20
39
|
},
|
|
21
|
-
|
|
22
|
-
/** Command name (e.g. "fence" or "trim"). */
|
|
23
|
-
command, body, additionalHeaders, timestamp) => {
|
|
24
|
-
const headers = (() => {
|
|
25
|
-
if (!additionalHeaders) {
|
|
26
|
-
return [["", command]];
|
|
27
|
-
}
|
|
28
|
-
else if (Array.isArray(additionalHeaders)) {
|
|
29
|
-
return [["", command], ...additionalHeaders];
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
return [
|
|
33
|
-
["", command],
|
|
34
|
-
...Object.entries(additionalHeaders).map(([key, value]) => [key, value]),
|
|
35
|
-
];
|
|
36
|
-
}
|
|
37
|
-
})();
|
|
38
|
-
return {
|
|
39
|
-
body,
|
|
40
|
-
headers,
|
|
41
|
-
timestamp,
|
|
42
|
-
};
|
|
43
|
-
},
|
|
44
|
-
fence: (fencing_token, additionalHeaders, timestamp) => {
|
|
45
|
-
return exports.AppendRecord.command("fence", fencing_token, additionalHeaders, timestamp);
|
|
46
|
-
},
|
|
47
|
-
trim: (seqNum, additionalHeaders, timestamp) => {
|
|
40
|
+
trim: (seqNum, timestamp) => {
|
|
48
41
|
// Encode sequence number as 8 big-endian bytes
|
|
49
42
|
const buffer = new Uint8Array(8);
|
|
50
43
|
const view = new DataView(buffer.buffer);
|
|
51
44
|
view.setBigUint64(0, BigInt(seqNum), false); // false = big-endian
|
|
52
|
-
return exports.AppendRecord.command("trim", buffer,
|
|
45
|
+
return exports.AppendRecord.command(new TextEncoder().encode("trim"), buffer, timestamp);
|
|
53
46
|
},
|
|
54
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* Calculate the UTF-8 byte length of a string.
|
|
50
|
+
* Handles all Unicode characters including surrogate pairs correctly.
|
|
51
|
+
*
|
|
52
|
+
* @param str The string to measure
|
|
53
|
+
* @returns The byte length when encoded as UTF-8
|
|
54
|
+
*/
|
|
55
|
+
function utf8ByteLength(str) {
|
|
56
|
+
let bytes = 0;
|
|
57
|
+
for (let i = 0; i < str.length; i++) {
|
|
58
|
+
const code = str.charCodeAt(i);
|
|
59
|
+
if (code <= 0x7f) {
|
|
60
|
+
bytes += 1;
|
|
61
|
+
}
|
|
62
|
+
else if (code <= 0x7ff) {
|
|
63
|
+
bytes += 2;
|
|
64
|
+
}
|
|
65
|
+
else if (code >= 0xd800 && code <= 0xdbff) {
|
|
66
|
+
// high surrogate
|
|
67
|
+
if (i + 1 < str.length) {
|
|
68
|
+
const next = str.charCodeAt(i + 1);
|
|
69
|
+
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
70
|
+
// valid surrogate pair → 4 bytes in UTF-8
|
|
71
|
+
bytes += 4;
|
|
72
|
+
i++; // skip low surrogate
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// unpaired high surrogate → treat as 3 bytes (replacement-style)
|
|
76
|
+
bytes += 3;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// unpaired high surrogate at end of string
|
|
81
|
+
bytes += 3;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (code >= 0xdc00 && code <= 0xdfff) {
|
|
85
|
+
// lone low surrogate — treat as 3 bytes
|
|
86
|
+
bytes += 3;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
bytes += 3;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return bytes;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Calculate the metered size in bytes of an AppendRecord.
|
|
96
|
+
* This includes the body and headers, but not metadata like timestamp.
|
|
97
|
+
*
|
|
98
|
+
* This function calculates how many bytes the record will occupy
|
|
99
|
+
* after being received and deserialized as raw bytes on the S2 side.
|
|
100
|
+
* For strings, it calculates UTF-8 byte length. For Uint8Array, it uses
|
|
101
|
+
* the array length directly (same value as would be used when encoding
|
|
102
|
+
* to base64 for transmission).
|
|
103
|
+
*
|
|
104
|
+
* @param record The record to measure
|
|
105
|
+
* @returns The size in bytes
|
|
106
|
+
*/
|
|
107
|
+
function meteredSizeBytes(record) {
|
|
108
|
+
// Calculate header size based on actual data types
|
|
109
|
+
let numHeaders = 0;
|
|
110
|
+
let headersSize = 0;
|
|
111
|
+
if (record.headers) {
|
|
112
|
+
if (Array.isArray(record.headers)) {
|
|
113
|
+
numHeaders = record.headers.length;
|
|
114
|
+
headersSize = record.headers.reduce((sum, [k, v]) => {
|
|
115
|
+
// Infer format from key type: string = UTF-8 bytes, Uint8Array = byte length
|
|
116
|
+
const keySize = typeof k === "string" ? utf8ByteLength(k) : k.length;
|
|
117
|
+
const valueSize = typeof v === "string" ? utf8ByteLength(v) : v.length;
|
|
118
|
+
return sum + keySize + valueSize;
|
|
119
|
+
}, 0);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Record<string, string> format (only for string format)
|
|
123
|
+
const entries = Object.entries(record.headers);
|
|
124
|
+
numHeaders = entries.length;
|
|
125
|
+
headersSize = entries.reduce((sum, [k, v]) => {
|
|
126
|
+
return sum + utf8ByteLength(k) + utf8ByteLength(v);
|
|
127
|
+
}, 0);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Calculate body size based on actual data type
|
|
131
|
+
const bodySize = record.body
|
|
132
|
+
? typeof record.body === "string"
|
|
133
|
+
? utf8ByteLength(record.body)
|
|
134
|
+
: record.body.length
|
|
135
|
+
: 0;
|
|
136
|
+
return 8 + 2 * numHeaders + headersSize + bodySize;
|
|
137
|
+
}
|
|
138
|
+
function computeAppendRecordFormat(record) {
|
|
139
|
+
let result = "string";
|
|
140
|
+
if (record.body && typeof record.body !== "string") {
|
|
141
|
+
result = "bytes";
|
|
142
|
+
}
|
|
143
|
+
if (record.headers &&
|
|
144
|
+
Array.isArray(record.headers) &&
|
|
145
|
+
record.headers.some(([k, v]) => typeof k !== "string" || typeof v !== "string")) {
|
|
146
|
+
result = "bytes";
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
55
150
|
//# sourceMappingURL=utils.js.map
|
package/dist/cjs/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AA0FA,wCAiCC;AAeD,4CAgCC;AAED,8DAmBC;AA9KD,SAAS,gBAAgB,CACxB,IAA0B,EAC1B,OAA0D,EAC1D,SAAkB;IAElB,OAAO;QACN,IAAI;QACJ,OAAO;QACP,SAAS;KACO,CAAC;AACnB,CAAC;AAYD,SAAS,mBAAmB,CAC3B,OAA4B,EAC5B,IAA0B,EAC1B,SAAkB;IAElB,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;QACrB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,EAAE,CAAC;IACL,iEAAiE;IACjE,OAAO,oBAAY,CAAC,IAAI,CAAC,IAAW,EAAE,OAAc,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;GAQG;AACU,QAAA,YAAY,GAAG;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,mBAAmB;IAC5B,KAAK,EAAE,CAAC,aAAqB,EAAE,SAAkB,EAAgB,EAAE;QAClE,OAAO,oBAAY,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,EAAE,CAAC,MAAuB,EAAE,SAAkB,EAAgB,EAAE;QACnE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB;QAClE,OAAO,oBAAY,CAAC,OAAO,CAC1B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAChC,MAAM,EACN,SAAS,CACT,CAAC;IACH,CAAC;CACQ,CAAC;AAEX;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,GAAW;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;aAAM,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;aAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YAC7C,iBAAiB;YACjB,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;oBACtC,0CAA0C;oBAC1C,KAAK,IAAI,CAAC,CAAC;oBACX,CAAC,EAAE,CAAC,CAAC,qBAAqB;gBAC3B,CAAC;qBAAM,CAAC;oBACP,iEAAiE;oBACjE,KAAK,IAAI,CAAC,CAAC;gBACZ,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,2CAA2C;gBAC3C,KAAK,IAAI,CAAC,CAAC;YACZ,CAAC;QACF,CAAC;aAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YAC7C,wCAAwC;YACxC,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,gBAAgB,CAAC,MAAoB;IACpD,mDAAmD;IACnD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBACnD,6EAA6E;gBAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACrE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACvE,OAAO,GAAG,GAAG,OAAO,GAAG,SAAS,CAAC;YAClC,CAAC,EAAE,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACP,yDAAyD;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC5C,OAAO,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC,EAAE,CAAC,CAAC,CAAC;QACP,CAAC;IACF,CAAC;IAED,gDAAgD;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI;QAC3B,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAChC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;QACrB,CAAC,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AACpD,CAAC;AAED,SAAgB,yBAAyB,CACxC,MAAoB;IAEpB,IAAI,MAAM,GAAuB,QAAQ,CAAC;IAE1C,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,GAAG,OAAO,CAAC;IAClB,CAAC;IACD,IACC,MAAM,CAAC,OAAO;QACd,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,IAAI,CAClB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,CAC1D,EACA,CAAC;QACF,MAAM,GAAG,OAAO,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/dist/esm/basin.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as Redacted from "./lib/redacted.js";
|
|
2
|
+
import type { SessionTransports } from "./lib/stream/types.js";
|
|
2
3
|
import { S2Stream } from "./stream.js";
|
|
3
4
|
import { S2Streams } from "./streams.js";
|
|
4
5
|
export declare class S2Basin {
|
|
5
6
|
private readonly client;
|
|
6
|
-
private readonly
|
|
7
|
+
private readonly transportConfig;
|
|
7
8
|
readonly name: string;
|
|
8
9
|
readonly streams: S2Streams;
|
|
9
10
|
/**
|
|
@@ -12,15 +13,21 @@ export declare class S2Basin {
|
|
|
12
13
|
* Use this to work with streams inside a single basin.
|
|
13
14
|
* @param name Basin name
|
|
14
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
|
|
15
18
|
*/
|
|
16
19
|
constructor(name: string, options: {
|
|
17
20
|
accessToken: Redacted.Redacted;
|
|
18
21
|
baseUrl: string;
|
|
22
|
+
includeBasinHeader: boolean;
|
|
19
23
|
});
|
|
20
24
|
/**
|
|
21
25
|
* Create a stream-scoped helper bound to `this` basin.
|
|
22
26
|
* @param name Stream name
|
|
23
27
|
*/
|
|
24
|
-
stream(name: string): S2Stream;
|
|
28
|
+
stream(name: string, options?: StreamOptions): S2Stream;
|
|
29
|
+
}
|
|
30
|
+
export interface StreamOptions {
|
|
31
|
+
forceTransport?: SessionTransports;
|
|
25
32
|
}
|
|
26
33
|
//# sourceMappingURL=basin.d.ts.map
|
package/dist/esm/basin.d.ts.map
CHANGED
|
@@ -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,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,
|
|
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"}
|
package/dist/esm/basin.js
CHANGED
|
@@ -4,7 +4,7 @@ import { S2Stream } from "./stream.js";
|
|
|
4
4
|
import { S2Streams } from "./streams.js";
|
|
5
5
|
export class S2Basin {
|
|
6
6
|
client;
|
|
7
|
-
|
|
7
|
+
transportConfig;
|
|
8
8
|
name;
|
|
9
9
|
streams;
|
|
10
10
|
/**
|
|
@@ -13,13 +13,19 @@ export class S2Basin {
|
|
|
13
13
|
* Use this to work with streams inside a single basin.
|
|
14
14
|
* @param name Basin name
|
|
15
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
|
|
16
18
|
*/
|
|
17
19
|
constructor(name, options) {
|
|
18
20
|
this.name = name;
|
|
19
|
-
this.
|
|
21
|
+
this.transportConfig = {
|
|
22
|
+
baseUrl: options.baseUrl,
|
|
23
|
+
accessToken: options.accessToken,
|
|
24
|
+
};
|
|
20
25
|
this.client = createClient(createConfig({
|
|
21
26
|
baseUrl: options.baseUrl,
|
|
22
|
-
auth: () => Redacted.value(this.accessToken),
|
|
27
|
+
auth: () => Redacted.value(this.transportConfig.accessToken),
|
|
28
|
+
headers: options.includeBasinHeader ? { "s2-basin": name } : {},
|
|
23
29
|
}));
|
|
24
30
|
this.streams = new S2Streams(this.client);
|
|
25
31
|
}
|
|
@@ -27,8 +33,11 @@ export class S2Basin {
|
|
|
27
33
|
* Create a stream-scoped helper bound to `this` basin.
|
|
28
34
|
* @param name Stream name
|
|
29
35
|
*/
|
|
30
|
-
stream(name) {
|
|
31
|
-
return new S2Stream(name, this.client
|
|
36
|
+
stream(name, options) {
|
|
37
|
+
return new S2Stream(name, this.client, {
|
|
38
|
+
...this.transportConfig,
|
|
39
|
+
forceTransport: options?.forceTransport,
|
|
40
|
+
});
|
|
32
41
|
}
|
|
33
42
|
}
|
|
34
43
|
//# sourceMappingURL=basin.js.map
|
package/dist/esm/basin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basin.js","sourceRoot":"","sources":["../../src/basin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"basin.js","sourceRoot":"","sources":["../../src/basin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,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,YAAY,CACzB,YAAY,CAAC;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,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,IAAY,EAAE,OAAuB;QAClD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACtC,GAAG,IAAI,CAAC,eAAe;YACvB,cAAc,EAAE,OAAO,EAAE,cAAc;SACvC,CAAC,CAAC;IACJ,CAAC;CACD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { AppendRecord } from "./utils.js";
|
|
2
|
+
export interface BatchTransformArgs {
|
|
3
|
+
/** Duration in milliseconds to wait before flushing a batch (default: 5ms) */
|
|
4
|
+
lingerDuration?: number;
|
|
5
|
+
/** Maximum number of records in a batch (default: 1000, max: 1000) */
|
|
6
|
+
maxBatchRecords?: number;
|
|
7
|
+
/** Maximum batch size in bytes (default: 1 MiB, max: 1 MiB) */
|
|
8
|
+
maxBatchBytes?: number;
|
|
9
|
+
/** Optional fencing token to enforce (remains static across batches) */
|
|
10
|
+
fencing_token?: string;
|
|
11
|
+
/** Optional sequence number to match for first batch (auto-increments for subsequent batches) */
|
|
12
|
+
match_seq_num?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Batch output type with optional fencing token and match_seq_num */
|
|
15
|
+
export type BatchOutput = {
|
|
16
|
+
records: AppendRecord[];
|
|
17
|
+
fencing_token?: string;
|
|
18
|
+
match_seq_num?: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A TransformStream that batches AppendRecords based on time, record count, and byte size.
|
|
22
|
+
*
|
|
23
|
+
* Input: AppendRecord (individual records)
|
|
24
|
+
* Output: { records: AppendRecord[], fencing_token?: string, match_seq_num?: number }
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const batcher = new BatchTransform<"string">({
|
|
29
|
+
* lingerDuration: 20,
|
|
30
|
+
* maxBatchRecords: 100,
|
|
31
|
+
* maxBatchBytes: 256 * 1024,
|
|
32
|
+
* match_seq_num: 0 // Optional: auto-increments per batch
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Pipe through the batcher and session to get acks
|
|
36
|
+
* readable.pipeThrough(batcher).pipeThrough(session).pipeTo(writable);
|
|
37
|
+
*
|
|
38
|
+
* // Or use manually
|
|
39
|
+
* const writer = batcher.writable.getWriter();
|
|
40
|
+
* writer.write(AppendRecord.make("foo"));
|
|
41
|
+
* await writer.close();
|
|
42
|
+
*
|
|
43
|
+
* for await (const batch of batcher.readable) {
|
|
44
|
+
* console.log(`Got batch of ${batch.records.length} records`);
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class BatchTransform extends TransformStream<AppendRecord, BatchOutput> {
|
|
49
|
+
private currentBatch;
|
|
50
|
+
private currentBatchSize;
|
|
51
|
+
private lingerTimer;
|
|
52
|
+
private controller;
|
|
53
|
+
private readonly maxBatchRecords;
|
|
54
|
+
private readonly maxBatchBytes;
|
|
55
|
+
private readonly lingerDuration;
|
|
56
|
+
private readonly fencing_token?;
|
|
57
|
+
private next_match_seq_num?;
|
|
58
|
+
constructor(args?: BatchTransformArgs);
|
|
59
|
+
private handleRecord;
|
|
60
|
+
private flush;
|
|
61
|
+
private startLingerTimer;
|
|
62
|
+
private cancelLingerTimer;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=batch-transform.d.ts.map
|
|
@@ -0,0 +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,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { S2Error } from "./error.js";
|
|
2
|
+
import { AppendRecord, meteredSizeBytes } from "./utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* A TransformStream that batches AppendRecords based on time, record count, and byte size.
|
|
5
|
+
*
|
|
6
|
+
* Input: AppendRecord (individual records)
|
|
7
|
+
* Output: { records: AppendRecord[], fencing_token?: string, match_seq_num?: number }
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const batcher = new BatchTransform<"string">({
|
|
12
|
+
* lingerDuration: 20,
|
|
13
|
+
* maxBatchRecords: 100,
|
|
14
|
+
* maxBatchBytes: 256 * 1024,
|
|
15
|
+
* match_seq_num: 0 // Optional: auto-increments per batch
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Pipe through the batcher and session to get acks
|
|
19
|
+
* readable.pipeThrough(batcher).pipeThrough(session).pipeTo(writable);
|
|
20
|
+
*
|
|
21
|
+
* // Or use manually
|
|
22
|
+
* const writer = batcher.writable.getWriter();
|
|
23
|
+
* writer.write(AppendRecord.make("foo"));
|
|
24
|
+
* await writer.close();
|
|
25
|
+
*
|
|
26
|
+
* for await (const batch of batcher.readable) {
|
|
27
|
+
* console.log(`Got batch of ${batch.records.length} records`);
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export class BatchTransform extends TransformStream {
|
|
32
|
+
currentBatch = [];
|
|
33
|
+
currentBatchSize = 0;
|
|
34
|
+
lingerTimer = null;
|
|
35
|
+
controller = null;
|
|
36
|
+
maxBatchRecords;
|
|
37
|
+
maxBatchBytes;
|
|
38
|
+
lingerDuration;
|
|
39
|
+
fencing_token;
|
|
40
|
+
next_match_seq_num;
|
|
41
|
+
constructor(args) {
|
|
42
|
+
let controller;
|
|
43
|
+
super({
|
|
44
|
+
start: (c) => {
|
|
45
|
+
controller = c;
|
|
46
|
+
},
|
|
47
|
+
transform: (chunk, c) => {
|
|
48
|
+
// Store controller reference on first transform
|
|
49
|
+
if (!this.controller) {
|
|
50
|
+
this.controller = c;
|
|
51
|
+
}
|
|
52
|
+
this.handleRecord(chunk);
|
|
53
|
+
},
|
|
54
|
+
flush: () => {
|
|
55
|
+
this.flush();
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
// Cap at maximum allowed values
|
|
59
|
+
this.maxBatchRecords = Math.min(args?.maxBatchRecords ?? 1000, 1000);
|
|
60
|
+
this.maxBatchBytes = Math.min(args?.maxBatchBytes ?? 1024 * 1024, 1024 * 1024);
|
|
61
|
+
this.lingerDuration = args?.lingerDuration ?? 5;
|
|
62
|
+
this.fencing_token = args?.fencing_token;
|
|
63
|
+
this.next_match_seq_num = args?.match_seq_num;
|
|
64
|
+
}
|
|
65
|
+
handleRecord(record) {
|
|
66
|
+
const recordSize = meteredSizeBytes(record);
|
|
67
|
+
// Reject individual records that exceed the max batch size
|
|
68
|
+
if (recordSize > this.maxBatchBytes) {
|
|
69
|
+
throw new S2Error({
|
|
70
|
+
message: `Record size ${recordSize} bytes exceeds maximum batch size of ${this.maxBatchBytes} bytes`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Start linger timer on first record added to an empty batch
|
|
74
|
+
if (this.currentBatch.length === 0 && this.lingerDuration > 0) {
|
|
75
|
+
this.startLingerTimer();
|
|
76
|
+
}
|
|
77
|
+
// Check if adding this record would exceed limits
|
|
78
|
+
const wouldExceedRecords = this.currentBatch.length + 1 > this.maxBatchRecords;
|
|
79
|
+
const wouldExceedBytes = this.currentBatchSize + recordSize > this.maxBatchBytes;
|
|
80
|
+
if (wouldExceedRecords || wouldExceedBytes) {
|
|
81
|
+
this.flush();
|
|
82
|
+
// Restart linger timer for new batch
|
|
83
|
+
if (this.lingerDuration > 0) {
|
|
84
|
+
this.startLingerTimer();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Add record to current batch
|
|
88
|
+
this.currentBatch.push(record);
|
|
89
|
+
this.currentBatchSize += recordSize;
|
|
90
|
+
// Check if we've now reached the limits
|
|
91
|
+
const nowExceedsRecords = this.currentBatch.length >= this.maxBatchRecords;
|
|
92
|
+
const nowExceedsBytes = this.currentBatchSize >= this.maxBatchBytes;
|
|
93
|
+
if (nowExceedsRecords || nowExceedsBytes) {
|
|
94
|
+
this.flush();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
flush() {
|
|
98
|
+
this.cancelLingerTimer();
|
|
99
|
+
if (this.currentBatch.length === 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Auto-increment match_seq_num for next batch
|
|
103
|
+
const match_seq_num = this.next_match_seq_num;
|
|
104
|
+
if (this.next_match_seq_num !== undefined) {
|
|
105
|
+
this.next_match_seq_num += this.currentBatch.length;
|
|
106
|
+
}
|
|
107
|
+
// Emit the batch downstream with optional fencing token and match_seq_num
|
|
108
|
+
if (this.controller) {
|
|
109
|
+
const batch = {
|
|
110
|
+
records: [...this.currentBatch],
|
|
111
|
+
};
|
|
112
|
+
if (this.fencing_token !== undefined) {
|
|
113
|
+
batch.fencing_token = this.fencing_token;
|
|
114
|
+
}
|
|
115
|
+
if (match_seq_num !== undefined) {
|
|
116
|
+
batch.match_seq_num = match_seq_num;
|
|
117
|
+
}
|
|
118
|
+
this.controller.enqueue(batch);
|
|
119
|
+
}
|
|
120
|
+
// Reset batch
|
|
121
|
+
this.currentBatch = [];
|
|
122
|
+
this.currentBatchSize = 0;
|
|
123
|
+
}
|
|
124
|
+
startLingerTimer() {
|
|
125
|
+
this.cancelLingerTimer();
|
|
126
|
+
this.lingerTimer = setTimeout(() => {
|
|
127
|
+
this.lingerTimer = null;
|
|
128
|
+
if (this.currentBatch.length > 0) {
|
|
129
|
+
this.flush();
|
|
130
|
+
}
|
|
131
|
+
}, this.lingerDuration);
|
|
132
|
+
}
|
|
133
|
+
cancelLingerTimer() {
|
|
134
|
+
if (this.lingerTimer) {
|
|
135
|
+
clearTimeout(this.lingerTimer);
|
|
136
|
+
this.lingerTimer = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=batch-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-transform.js","sourceRoot":"","sources":["../../src/batch-transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { QuerySerializerOptions } from '../core/bodySerializer.gen.js';
|
|
2
2
|
import type { Client, ClientOptions, Config, RequestOptions } from './types.gen.js';
|
|
3
|
-
export declare const createQuerySerializer: <T = unknown>({
|
|
3
|
+
export declare const createQuerySerializer: <T = unknown>({ parameters, ...args }?: QuerySerializerOptions) => (queryParams: T) => string;
|
|
4
4
|
/**
|
|
5
5
|
* Infers parseAs value from provided Content-Type header.
|
|
6
6
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.gen.d.ts","sourceRoot":"","sources":["../../../../src/generated/client/utils.gen.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAQ5E,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpF,eAAO,MAAM,qBAAqB,GAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.gen.d.ts","sourceRoot":"","sources":["../../../../src/generated/client/utils.gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { getAuthToken } from '../core/auth.gen.js';
|
|
|
3
3
|
import { jsonBodySerializer } from '../core/bodySerializer.gen.js';
|
|
4
4
|
import { serializeArrayParam, serializeObjectParam, serializePrimitiveParam, } from '../core/pathSerializer.gen.js';
|
|
5
5
|
import { getUrl } from '../core/utils.gen.js';
|
|
6
|
-
export const createQuerySerializer = ({
|
|
6
|
+
export const createQuerySerializer = ({ parameters = {}, ...args } = {}) => {
|
|
7
7
|
const querySerializer = (queryParams) => {
|
|
8
8
|
const search = [];
|
|
9
9
|
if (queryParams && typeof queryParams === 'object') {
|
|
@@ -12,33 +12,34 @@ export const createQuerySerializer = ({ allowReserved, array, object, } = {}) =>
|
|
|
12
12
|
if (value === undefined || value === null) {
|
|
13
13
|
continue;
|
|
14
14
|
}
|
|
15
|
+
const options = parameters[name] || args;
|
|
15
16
|
if (Array.isArray(value)) {
|
|
16
17
|
const serializedArray = serializeArrayParam({
|
|
17
|
-
allowReserved,
|
|
18
|
+
allowReserved: options.allowReserved,
|
|
18
19
|
explode: true,
|
|
19
20
|
name,
|
|
20
21
|
style: 'form',
|
|
21
22
|
value,
|
|
22
|
-
...array,
|
|
23
|
+
...options.array,
|
|
23
24
|
});
|
|
24
25
|
if (serializedArray)
|
|
25
26
|
search.push(serializedArray);
|
|
26
27
|
}
|
|
27
28
|
else if (typeof value === 'object') {
|
|
28
29
|
const serializedObject = serializeObjectParam({
|
|
29
|
-
allowReserved,
|
|
30
|
+
allowReserved: options.allowReserved,
|
|
30
31
|
explode: true,
|
|
31
32
|
name,
|
|
32
33
|
style: 'deepObject',
|
|
33
34
|
value: value,
|
|
34
|
-
...object,
|
|
35
|
+
...options.object,
|
|
35
36
|
});
|
|
36
37
|
if (serializedObject)
|
|
37
38
|
search.push(serializedObject);
|
|
38
39
|
}
|
|
39
40
|
else {
|
|
40
41
|
const serializedPrimitive = serializePrimitiveParam({
|
|
41
|
-
allowReserved,
|
|
42
|
+
allowReserved: options.allowReserved,
|
|
42
43
|
name,
|
|
43
44
|
value: value,
|
|
44
45
|
});
|