@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.
Files changed (123) hide show
  1. package/dist/cjs/basin.d.ts +9 -2
  2. package/dist/cjs/basin.d.ts.map +1 -1
  3. package/dist/cjs/basin.js +14 -5
  4. package/dist/cjs/basin.js.map +1 -1
  5. package/dist/cjs/batch-transform.d.ts +64 -0
  6. package/dist/cjs/batch-transform.d.ts.map +1 -0
  7. package/dist/cjs/batch-transform.js +144 -0
  8. package/dist/cjs/batch-transform.js.map +1 -0
  9. package/dist/cjs/generated/client/utils.gen.d.ts +1 -1
  10. package/dist/cjs/generated/client/utils.gen.d.ts.map +1 -1
  11. package/dist/cjs/generated/client/utils.gen.js +7 -6
  12. package/dist/cjs/generated/client/utils.gen.js.map +1 -1
  13. package/dist/cjs/generated/core/bodySerializer.gen.d.ts +12 -4
  14. package/dist/cjs/generated/core/bodySerializer.gen.d.ts.map +1 -1
  15. package/dist/cjs/generated/core/bodySerializer.gen.js.map +1 -1
  16. package/dist/cjs/generated/proto/s2.d.ts.map +1 -1
  17. package/dist/cjs/generated/proto/s2.js.map +1 -1
  18. package/dist/cjs/index.d.ts +4 -2
  19. package/dist/cjs/index.d.ts.map +1 -1
  20. package/dist/cjs/index.js +5 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/lib/stream/factory.d.ts +15 -0
  23. package/dist/cjs/lib/stream/factory.d.ts.map +1 -0
  24. package/dist/cjs/lib/stream/factory.js +36 -0
  25. package/dist/cjs/lib/stream/factory.js.map +1 -0
  26. package/dist/cjs/lib/stream/runtime.d.ts +13 -0
  27. package/dist/cjs/lib/stream/runtime.d.ts.map +1 -0
  28. package/dist/cjs/lib/stream/runtime.js +50 -0
  29. package/dist/cjs/lib/stream/runtime.js.map +1 -0
  30. package/dist/cjs/lib/stream/transport/fetch/index.d.ts +79 -0
  31. package/dist/cjs/lib/stream/transport/fetch/index.d.ts.map +1 -0
  32. package/dist/cjs/lib/stream/transport/fetch/index.js +382 -0
  33. package/dist/cjs/lib/stream/transport/fetch/index.js.map +1 -0
  34. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts +7 -0
  35. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts.map +1 -0
  36. package/dist/cjs/lib/stream/transport/fetch/shared.js +170 -0
  37. package/dist/cjs/lib/stream/transport/fetch/shared.js.map +1 -0
  38. package/dist/cjs/lib/stream/transport/s2s/framing.d.ts +47 -0
  39. package/dist/cjs/lib/stream/transport/s2s/framing.d.ts.map +1 -0
  40. package/dist/cjs/lib/stream/transport/s2s/framing.js +123 -0
  41. package/dist/cjs/lib/stream/transport/s2s/framing.js.map +1 -0
  42. package/dist/cjs/lib/stream/transport/s2s/index.d.ts +23 -0
  43. package/dist/cjs/lib/stream/transport/s2s/index.d.ts.map +1 -0
  44. package/dist/cjs/lib/stream/transport/s2s/index.js +785 -0
  45. package/dist/cjs/lib/stream/transport/s2s/index.js.map +1 -0
  46. package/dist/cjs/lib/stream/types.d.ts +53 -0
  47. package/dist/cjs/lib/stream/types.d.ts.map +1 -0
  48. package/dist/cjs/lib/stream/types.js +3 -0
  49. package/dist/cjs/lib/stream/types.js.map +1 -0
  50. package/dist/cjs/s2.d.ts +1 -0
  51. package/dist/cjs/s2.d.ts.map +1 -1
  52. package/dist/cjs/s2.js +3 -0
  53. package/dist/cjs/s2.js.map +1 -1
  54. package/dist/cjs/stream.d.ts +22 -116
  55. package/dist/cjs/stream.d.ts.map +1 -1
  56. package/dist/cjs/stream.js +34 -549
  57. package/dist/cjs/stream.js.map +1 -1
  58. package/dist/cjs/utils.d.ts +32 -6
  59. package/dist/cjs/utils.d.ts.map +1 -1
  60. package/dist/cjs/utils.js +129 -34
  61. package/dist/cjs/utils.js.map +1 -1
  62. package/dist/esm/basin.d.ts +9 -2
  63. package/dist/esm/basin.d.ts.map +1 -1
  64. package/dist/esm/basin.js +14 -5
  65. package/dist/esm/basin.js.map +1 -1
  66. package/dist/esm/batch-transform.d.ts +64 -0
  67. package/dist/esm/batch-transform.d.ts.map +1 -0
  68. package/dist/esm/batch-transform.js +140 -0
  69. package/dist/esm/batch-transform.js.map +1 -0
  70. package/dist/esm/generated/client/utils.gen.d.ts +1 -1
  71. package/dist/esm/generated/client/utils.gen.d.ts.map +1 -1
  72. package/dist/esm/generated/client/utils.gen.js +7 -6
  73. package/dist/esm/generated/client/utils.gen.js.map +1 -1
  74. package/dist/esm/generated/core/bodySerializer.gen.d.ts +12 -4
  75. package/dist/esm/generated/core/bodySerializer.gen.d.ts.map +1 -1
  76. package/dist/esm/generated/core/bodySerializer.gen.js.map +1 -1
  77. package/dist/esm/generated/proto/s2.d.ts.map +1 -1
  78. package/dist/esm/generated/proto/s2.js.map +1 -1
  79. package/dist/esm/index.d.ts +4 -2
  80. package/dist/esm/index.d.ts.map +1 -1
  81. package/dist/esm/index.js +2 -1
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/lib/stream/factory.d.ts +15 -0
  84. package/dist/esm/lib/stream/factory.d.ts.map +1 -0
  85. package/dist/esm/lib/stream/factory.js +33 -0
  86. package/dist/esm/lib/stream/factory.js.map +1 -0
  87. package/dist/esm/lib/stream/runtime.d.ts +13 -0
  88. package/dist/esm/lib/stream/runtime.d.ts.map +1 -0
  89. package/dist/esm/lib/stream/runtime.js +46 -0
  90. package/dist/esm/lib/stream/runtime.js.map +1 -0
  91. package/dist/esm/lib/stream/transport/fetch/index.d.ts +79 -0
  92. package/dist/esm/lib/stream/transport/fetch/index.d.ts.map +1 -0
  93. package/dist/esm/lib/stream/transport/fetch/index.js +376 -0
  94. package/dist/esm/lib/stream/transport/fetch/index.js.map +1 -0
  95. package/dist/esm/lib/stream/transport/fetch/shared.d.ts +7 -0
  96. package/dist/esm/lib/stream/transport/fetch/shared.d.ts.map +1 -0
  97. package/dist/esm/lib/stream/transport/fetch/shared.js +166 -0
  98. package/dist/esm/lib/stream/transport/fetch/shared.js.map +1 -0
  99. package/dist/esm/lib/stream/transport/s2s/framing.d.ts +47 -0
  100. package/dist/esm/lib/stream/transport/s2s/framing.d.ts.map +1 -0
  101. package/dist/esm/lib/stream/transport/s2s/framing.js +118 -0
  102. package/dist/esm/lib/stream/transport/s2s/framing.js.map +1 -0
  103. package/dist/esm/lib/stream/transport/s2s/index.d.ts +23 -0
  104. package/dist/esm/lib/stream/transport/s2s/index.d.ts.map +1 -0
  105. package/dist/esm/lib/stream/transport/s2s/index.js +781 -0
  106. package/dist/esm/lib/stream/transport/s2s/index.js.map +1 -0
  107. package/dist/esm/lib/stream/types.d.ts +53 -0
  108. package/dist/esm/lib/stream/types.d.ts.map +1 -0
  109. package/dist/esm/lib/stream/types.js +2 -0
  110. package/dist/esm/lib/stream/types.js.map +1 -0
  111. package/dist/esm/s2.d.ts +1 -0
  112. package/dist/esm/s2.d.ts.map +1 -1
  113. package/dist/esm/s2.js +3 -0
  114. package/dist/esm/s2.js.map +1 -1
  115. package/dist/esm/stream.d.ts +22 -116
  116. package/dist/esm/stream.d.ts.map +1 -1
  117. package/dist/esm/stream.js +36 -551
  118. package/dist/esm/stream.js.map +1 -1
  119. package/dist/esm/utils.d.ts +32 -6
  120. package/dist/esm/utils.d.ts.map +1 -1
  121. package/dist/esm/utils.js +126 -34
  122. package/dist/esm/utils.js.map +1 -1
  123. package/package.json +2 -4
@@ -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: (body?: string | Uint8Array, headers?: Headers, timestamp?: AppendRecordType["timestamp"]) => AppendRecordType;
15
- readonly command: (command: string, body?: string | Uint8Array, additionalHeaders?: Headers, timestamp?: AppendRecordType["timestamp"]) => AppendRecordType;
16
- readonly fence: (fencing_token: string, additionalHeaders?: Headers, timestamp?: AppendRecordType["timestamp"]) => AppendRecordType;
17
- readonly trim: (seqNum: number | bigint, additionalHeaders?: Headers, timestamp?: AppendRecordType["timestamp"]) => AppendRecordType;
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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpE,KAAK,OAAO,GACT,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,KAAK,CAAC,CAAC,MAAM,GAAG,UAAU,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY;2BAEhB,MAAM,GAAG,UAAU,YAChB,OAAO,cACL,gBAAgB,CAAC,WAAW,CAAC,KACvC,gBAAgB;gCAST,MAAM,SACR,MAAM,GAAG,UAAU,sBACN,OAAO,cACf,gBAAgB,CAAC,WAAW,CAAC,KACvC,gBAAgB;oCAsBH,MAAM,sBACD,OAAO,cACf,gBAAgB,CAAC,WAAW,CAAC;4BAUjC,MAAM,GAAG,MAAM,sBACH,OAAO,cACf,gBAAgB,CAAC,WAAW,CAAC,KACvC,gBAAgB;CAOV,CAAC"}
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
- make: (body, headers, timestamp) => {
15
- return {
16
- body,
17
- headers,
18
- timestamp,
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
- command: (
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, additionalHeaders, timestamp);
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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAQA;;;;;;;;GAQG;AACU,QAAA,YAAY,GAAG;IAC3B,IAAI,EAAE,CACL,IAA0B,EAC1B,OAAiB,EACjB,SAAyC,EACtB,EAAE;QACrB,OAAO;YACN,IAAI;YACJ,OAAO;YACP,SAAS;SACT,CAAC;IACH,CAAC;IACD,OAAO,EAAE;IACR,6CAA6C;IAC7C,OAAe,EACf,IAA0B,EAC1B,iBAA2B,EAC3B,SAAyC,EACtB,EAAE;QACrB,MAAM,OAAO,GAAgC,CAAC,GAAG,EAAE;YAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACxB,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAqB,EAAE,GAAG,iBAAiB,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACP,OAAO;oBACN,CAAC,EAAE,EAAE,OAAO,CAAqB;oBACjC,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CACvC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAqB,CAClD;iBACD,CAAC;YACH,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QACL,OAAO;YACN,IAAI;YACJ,OAAO;YACP,SAAS;SACT,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CACN,aAAqB,EACrB,iBAA2B,EAC3B,SAAyC,EACxC,EAAE;QACH,OAAO,oBAAY,CAAC,OAAO,CAC1B,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,SAAS,CACT,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CACL,MAAuB,EACvB,iBAA2B,EAC3B,SAAyC,EACtB,EAAE;QACrB,+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,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;CACQ,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -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 accessToken;
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
@@ -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,WAAW,CAAoB;IAEhD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,EAAE,SAAS,CAAC;IAEnC;;;;;;OAMG;gBAEF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAa7D;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM;CAG1B"}
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
- accessToken;
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.accessToken = options.accessToken;
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
@@ -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;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,OAAO;IACF,MAAM,CAAS;IACf,WAAW,CAAoB;IAEhC,IAAI,CAAS;IACb,OAAO,CAAY;IAEnC;;;;;;OAMG;IACH,YACC,IAAY,EACZ,OAA4D;QAE5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,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,WAAW,CAAC;SAC5C,CAAC,CACF,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,IAAY;QACzB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;CACD"}
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>({ allowReserved, array, object, }?: QuerySerializerOptions) => (queryParams: T) => string;
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":"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"}
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 = ({ allowReserved, array, object, } = {}) => {
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
  });