@s2-dev/streamstore 0.20.0 → 0.22.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 (223) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +60 -10
  3. package/dist/cjs/accessTokens.d.ts +27 -14
  4. package/dist/cjs/accessTokens.d.ts.map +1 -1
  5. package/dist/cjs/accessTokens.js +72 -8
  6. package/dist/cjs/accessTokens.js.map +1 -1
  7. package/dist/cjs/basins.d.ts +29 -19
  8. package/dist/cjs/basins.d.ts.map +1 -1
  9. package/dist/cjs/basins.js +119 -9
  10. package/dist/cjs/basins.js.map +1 -1
  11. package/dist/cjs/batch-transform.d.ts +12 -16
  12. package/dist/cjs/batch-transform.d.ts.map +1 -1
  13. package/dist/cjs/batch-transform.js +17 -21
  14. package/dist/cjs/batch-transform.js.map +1 -1
  15. package/dist/cjs/common.d.ts +31 -24
  16. package/dist/cjs/common.d.ts.map +1 -1
  17. package/dist/cjs/common.js +22 -0
  18. package/dist/cjs/common.js.map +1 -1
  19. package/dist/cjs/endpoints.d.ts +63 -0
  20. package/dist/cjs/endpoints.d.ts.map +1 -0
  21. package/dist/cjs/endpoints.js +120 -0
  22. package/dist/cjs/endpoints.js.map +1 -0
  23. package/dist/cjs/error.d.ts +12 -2
  24. package/dist/cjs/error.d.ts.map +1 -1
  25. package/dist/cjs/error.js +20 -1
  26. package/dist/cjs/error.js.map +1 -1
  27. package/dist/cjs/generated/types.gen.d.ts +11 -20
  28. package/dist/cjs/generated/types.gen.d.ts.map +1 -1
  29. package/dist/cjs/index.d.ts +30 -46
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/index.js +50 -26
  32. package/dist/cjs/index.js.map +1 -1
  33. package/dist/cjs/internal/case-transform.d.ts +59 -0
  34. package/dist/cjs/internal/case-transform.d.ts.map +1 -0
  35. package/dist/cjs/internal/case-transform.js +80 -0
  36. package/dist/cjs/internal/case-transform.js.map +1 -0
  37. package/dist/cjs/internal/mappers.d.ts +51 -0
  38. package/dist/cjs/internal/mappers.d.ts.map +1 -0
  39. package/dist/cjs/internal/mappers.js +225 -0
  40. package/dist/cjs/internal/mappers.js.map +1 -0
  41. package/dist/cjs/internal/sdk-types.d.ts +127 -0
  42. package/dist/cjs/internal/sdk-types.d.ts.map +1 -0
  43. package/dist/cjs/internal/sdk-types.js +9 -0
  44. package/dist/cjs/internal/sdk-types.js.map +1 -0
  45. package/dist/cjs/lib/base64.d.ts +8 -0
  46. package/dist/cjs/lib/base64.d.ts.map +1 -1
  47. package/dist/cjs/lib/base64.js +32 -12
  48. package/dist/cjs/lib/base64.js.map +1 -1
  49. package/dist/cjs/lib/event-stream.d.ts.map +1 -1
  50. package/dist/cjs/lib/event-stream.js +2 -1
  51. package/dist/cjs/lib/event-stream.js.map +1 -1
  52. package/dist/cjs/lib/paginate.d.ts +57 -0
  53. package/dist/cjs/lib/paginate.d.ts.map +1 -0
  54. package/dist/cjs/lib/paginate.js +51 -0
  55. package/dist/cjs/lib/paginate.js.map +1 -0
  56. package/dist/cjs/lib/result.d.ts +1 -1
  57. package/dist/cjs/lib/result.d.ts.map +1 -1
  58. package/dist/cjs/lib/retry.d.ts +47 -31
  59. package/dist/cjs/lib/retry.d.ts.map +1 -1
  60. package/dist/cjs/lib/retry.js +302 -201
  61. package/dist/cjs/lib/retry.js.map +1 -1
  62. package/dist/cjs/lib/stream/runtime.d.ts +1 -1
  63. package/dist/cjs/lib/stream/transport/fetch/index.d.ts +7 -9
  64. package/dist/cjs/lib/stream/transport/fetch/index.d.ts.map +1 -1
  65. package/dist/cjs/lib/stream/transport/fetch/index.js +38 -39
  66. package/dist/cjs/lib/stream/transport/fetch/index.js.map +1 -1
  67. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts +7 -2
  68. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts.map +1 -1
  69. package/dist/cjs/lib/stream/transport/fetch/shared.js +62 -111
  70. package/dist/cjs/lib/stream/transport/fetch/shared.js.map +1 -1
  71. package/dist/cjs/lib/stream/transport/proto.d.ts +9 -0
  72. package/dist/cjs/lib/stream/transport/proto.d.ts.map +1 -0
  73. package/dist/cjs/lib/stream/transport/proto.js +118 -0
  74. package/dist/cjs/lib/stream/transport/proto.js.map +1 -0
  75. package/dist/cjs/lib/stream/transport/s2s/index.d.ts +3 -3
  76. package/dist/cjs/lib/stream/transport/s2s/index.d.ts.map +1 -1
  77. package/dist/cjs/lib/stream/transport/s2s/index.js +139 -86
  78. package/dist/cjs/lib/stream/transport/s2s/index.js.map +1 -1
  79. package/dist/cjs/lib/stream/types.d.ts +81 -36
  80. package/dist/cjs/lib/stream/types.d.ts.map +1 -1
  81. package/dist/cjs/lib/stream/types.js +18 -0
  82. package/dist/cjs/lib/stream/types.js.map +1 -1
  83. package/dist/cjs/metrics.d.ts +18 -17
  84. package/dist/cjs/metrics.d.ts.map +1 -1
  85. package/dist/cjs/metrics.js +67 -12
  86. package/dist/cjs/metrics.js.map +1 -1
  87. package/dist/cjs/producer.d.ts +82 -0
  88. package/dist/cjs/producer.d.ts.map +1 -0
  89. package/dist/cjs/producer.js +305 -0
  90. package/dist/cjs/producer.js.map +1 -0
  91. package/dist/cjs/s2.d.ts +1 -2
  92. package/dist/cjs/s2.d.ts.map +1 -1
  93. package/dist/cjs/s2.js +9 -9
  94. package/dist/cjs/s2.js.map +1 -1
  95. package/dist/cjs/stream.d.ts +26 -12
  96. package/dist/cjs/stream.d.ts.map +1 -1
  97. package/dist/cjs/stream.js +77 -13
  98. package/dist/cjs/stream.js.map +1 -1
  99. package/dist/cjs/streams.d.ts +29 -19
  100. package/dist/cjs/streams.d.ts.map +1 -1
  101. package/dist/cjs/streams.js +120 -9
  102. package/dist/cjs/streams.js.map +1 -1
  103. package/dist/cjs/types.d.ts +624 -0
  104. package/dist/cjs/types.d.ts.map +1 -0
  105. package/dist/cjs/types.js +129 -0
  106. package/dist/cjs/types.js.map +1 -0
  107. package/dist/cjs/utils.d.ts +1 -22
  108. package/dist/cjs/utils.d.ts.map +1 -1
  109. package/dist/cjs/utils.js +0 -42
  110. package/dist/cjs/utils.js.map +1 -1
  111. package/dist/cjs/version.d.ts +1 -1
  112. package/dist/cjs/version.js +1 -1
  113. package/dist/esm/accessTokens.d.ts +27 -14
  114. package/dist/esm/accessTokens.d.ts.map +1 -1
  115. package/dist/esm/accessTokens.js +73 -9
  116. package/dist/esm/accessTokens.js.map +1 -1
  117. package/dist/esm/basins.d.ts +29 -19
  118. package/dist/esm/basins.d.ts.map +1 -1
  119. package/dist/esm/basins.js +119 -9
  120. package/dist/esm/basins.js.map +1 -1
  121. package/dist/esm/batch-transform.d.ts +12 -16
  122. package/dist/esm/batch-transform.d.ts.map +1 -1
  123. package/dist/esm/batch-transform.js +18 -22
  124. package/dist/esm/batch-transform.js.map +1 -1
  125. package/dist/esm/common.d.ts +31 -24
  126. package/dist/esm/common.d.ts.map +1 -1
  127. package/dist/esm/common.js +20 -1
  128. package/dist/esm/common.js.map +1 -1
  129. package/dist/esm/endpoints.d.ts +63 -0
  130. package/dist/esm/endpoints.d.ts.map +1 -0
  131. package/dist/esm/endpoints.js +115 -0
  132. package/dist/esm/endpoints.js.map +1 -0
  133. package/dist/esm/error.d.ts +12 -2
  134. package/dist/esm/error.d.ts.map +1 -1
  135. package/dist/esm/error.js +20 -1
  136. package/dist/esm/error.js.map +1 -1
  137. package/dist/esm/generated/types.gen.d.ts +11 -20
  138. package/dist/esm/generated/types.gen.d.ts.map +1 -1
  139. package/dist/esm/index.d.ts +30 -46
  140. package/dist/esm/index.d.ts.map +1 -1
  141. package/dist/esm/index.js +33 -19
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/internal/case-transform.d.ts +59 -0
  144. package/dist/esm/internal/case-transform.d.ts.map +1 -0
  145. package/dist/esm/internal/case-transform.js +76 -0
  146. package/dist/esm/internal/case-transform.js.map +1 -0
  147. package/dist/esm/internal/mappers.d.ts +51 -0
  148. package/dist/esm/internal/mappers.d.ts.map +1 -0
  149. package/dist/esm/internal/mappers.js +218 -0
  150. package/dist/esm/internal/mappers.js.map +1 -0
  151. package/dist/esm/internal/sdk-types.d.ts +127 -0
  152. package/dist/esm/internal/sdk-types.d.ts.map +1 -0
  153. package/dist/esm/internal/sdk-types.js +8 -0
  154. package/dist/esm/internal/sdk-types.js.map +1 -0
  155. package/dist/esm/lib/base64.d.ts +8 -0
  156. package/dist/esm/lib/base64.d.ts.map +1 -1
  157. package/dist/esm/lib/base64.js +30 -11
  158. package/dist/esm/lib/base64.js.map +1 -1
  159. package/dist/esm/lib/event-stream.d.ts.map +1 -1
  160. package/dist/esm/lib/event-stream.js +2 -1
  161. package/dist/esm/lib/event-stream.js.map +1 -1
  162. package/dist/esm/lib/paginate.d.ts +57 -0
  163. package/dist/esm/lib/paginate.d.ts.map +1 -0
  164. package/dist/esm/lib/paginate.js +48 -0
  165. package/dist/esm/lib/paginate.js.map +1 -0
  166. package/dist/esm/lib/result.d.ts +1 -1
  167. package/dist/esm/lib/result.d.ts.map +1 -1
  168. package/dist/esm/lib/retry.d.ts +47 -31
  169. package/dist/esm/lib/retry.d.ts.map +1 -1
  170. package/dist/esm/lib/retry.js +303 -201
  171. package/dist/esm/lib/retry.js.map +1 -1
  172. package/dist/esm/lib/stream/runtime.d.ts +1 -1
  173. package/dist/esm/lib/stream/transport/fetch/index.d.ts +7 -9
  174. package/dist/esm/lib/stream/transport/fetch/index.d.ts.map +1 -1
  175. package/dist/esm/lib/stream/transport/fetch/index.js +40 -41
  176. package/dist/esm/lib/stream/transport/fetch/index.js.map +1 -1
  177. package/dist/esm/lib/stream/transport/fetch/shared.d.ts +7 -2
  178. package/dist/esm/lib/stream/transport/fetch/shared.d.ts.map +1 -1
  179. package/dist/esm/lib/stream/transport/fetch/shared.js +64 -113
  180. package/dist/esm/lib/stream/transport/fetch/shared.js.map +1 -1
  181. package/dist/esm/lib/stream/transport/proto.d.ts +9 -0
  182. package/dist/esm/lib/stream/transport/proto.d.ts.map +1 -0
  183. package/dist/esm/lib/stream/transport/proto.js +110 -0
  184. package/dist/esm/lib/stream/transport/proto.js.map +1 -0
  185. package/dist/esm/lib/stream/transport/s2s/index.d.ts +3 -3
  186. package/dist/esm/lib/stream/transport/s2s/index.d.ts.map +1 -1
  187. package/dist/esm/lib/stream/transport/s2s/index.js +140 -86
  188. package/dist/esm/lib/stream/transport/s2s/index.js.map +1 -1
  189. package/dist/esm/lib/stream/types.d.ts +81 -36
  190. package/dist/esm/lib/stream/types.d.ts.map +1 -1
  191. package/dist/esm/lib/stream/types.js +17 -1
  192. package/dist/esm/lib/stream/types.js.map +1 -1
  193. package/dist/esm/metrics.d.ts +18 -17
  194. package/dist/esm/metrics.d.ts.map +1 -1
  195. package/dist/esm/metrics.js +66 -12
  196. package/dist/esm/metrics.js.map +1 -1
  197. package/dist/esm/producer.d.ts +82 -0
  198. package/dist/esm/producer.d.ts.map +1 -0
  199. package/dist/esm/producer.js +300 -0
  200. package/dist/esm/producer.js.map +1 -0
  201. package/dist/esm/s2.d.ts +1 -2
  202. package/dist/esm/s2.d.ts.map +1 -1
  203. package/dist/esm/s2.js +9 -9
  204. package/dist/esm/s2.js.map +1 -1
  205. package/dist/esm/stream.d.ts +26 -12
  206. package/dist/esm/stream.d.ts.map +1 -1
  207. package/dist/esm/stream.js +79 -15
  208. package/dist/esm/stream.js.map +1 -1
  209. package/dist/esm/streams.d.ts +29 -19
  210. package/dist/esm/streams.d.ts.map +1 -1
  211. package/dist/esm/streams.js +120 -9
  212. package/dist/esm/streams.js.map +1 -1
  213. package/dist/esm/types.d.ts +624 -0
  214. package/dist/esm/types.d.ts.map +1 -0
  215. package/dist/esm/types.js +126 -0
  216. package/dist/esm/types.js.map +1 -0
  217. package/dist/esm/utils.d.ts +1 -22
  218. package/dist/esm/utils.d.ts.map +1 -1
  219. package/dist/esm/utils.js +0 -41
  220. package/dist/esm/utils.js.map +1 -1
  221. package/dist/esm/version.d.ts +1 -1
  222. package/dist/esm/version.js +1 -1
  223. package/package.json +4 -3
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Type-level and runtime utilities for converting between snake_case and camelCase.
3
+ *
4
+ * These utilities allow the SDK to expose camelCase APIs to users while the
5
+ * generated types from OpenAPI use snake_case to match the wire format.
6
+ */
7
+ /**
8
+ * Convert a snake_case string literal to camelCase at the type level.
9
+ *
10
+ * @example
11
+ * type Result = SnakeToCamel<"seq_num">; // "seqNum"
12
+ * type Result2 = SnakeToCamel<"created_at">; // "createdAt"
13
+ */
14
+ export type SnakeToCamel<S extends string> = S extends `${infer Head}_${infer Tail}` ? `${Head}${Capitalize<SnakeToCamel<Tail>>}` : S;
15
+ /**
16
+ * Convert a camelCase string literal to snake_case at the type level.
17
+ *
18
+ * @example
19
+ * type Result = CamelToSnake<"seqNum">; // "seq_num"
20
+ * type Result2 = CamelToSnake<"createdAt">; // "created_at"
21
+ */
22
+ export type CamelToSnake<S extends string> = S extends `${infer Head}${infer Tail}` ? Head extends Uppercase<Head> ? Head extends Lowercase<Head> ? `${Head}${CamelToSnake<Tail>}` : `_${Lowercase<Head>}${CamelToSnake<Tail>}` : `${Head}${CamelToSnake<Tail>}` : S;
23
+ /**
24
+ * Recursively transform all keys in an object type from snake_case to camelCase.
25
+ *
26
+ * @example
27
+ * type API = { seq_num: number; created_at: string };
28
+ * type SDK = CamelCaseKeys<API>; // { seqNum: number; createdAt: string }
29
+ */
30
+ export type CamelCaseKeys<T> = T extends object ? T extends Array<infer U> ? Array<CamelCaseKeys<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<CamelCaseKeys<U>> : {
31
+ [K in keyof T as SnakeToCamel<K & string>]: CamelCaseKeys<T[K]>;
32
+ } : T;
33
+ /**
34
+ * Recursively transform all keys in an object type from camelCase to snake_case.
35
+ *
36
+ * @example
37
+ * type SDK = { seqNum: number; createdAt: string };
38
+ * type API = SnakeCaseKeys<SDK>; // { seq_num: number; created_at: string }
39
+ */
40
+ export type SnakeCaseKeys<T> = T extends object ? T extends Array<infer U> ? Array<SnakeCaseKeys<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<SnakeCaseKeys<U>> : {
41
+ [K in keyof T as CamelToSnake<K & string>]: SnakeCaseKeys<T[K]>;
42
+ } : T;
43
+ /**
44
+ * Recursively transform all keys in an object from snake_case to camelCase at runtime.
45
+ *
46
+ * @example
47
+ * const api = { seq_num: 123, created_at: "2024-01-01" };
48
+ * const sdk = toCamelCase(api); // { seqNum: 123, createdAt: "2024-01-01" }
49
+ */
50
+ export declare function toCamelCase<T>(obj: unknown): CamelCaseKeys<T>;
51
+ /**
52
+ * Recursively transform all keys in an object from camelCase to snake_case at runtime.
53
+ *
54
+ * @example
55
+ * const sdk = { seqNum: 123, createdAt: "2024-01-01" };
56
+ * const api = toSnakeCase(sdk); // { seq_num: 123, created_at: "2024-01-01" }
57
+ */
58
+ export declare function toSnakeCase<T>(obj: unknown): SnakeCaseKeys<T>;
59
+ //# sourceMappingURL=case-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-transform.d.ts","sourceRoot":"","sources":["../../../src/internal/case-transform.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IACxC,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GACpC,GAAG,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,GAC1C,CAAC,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IACxC,CAAC,SAAS,GAAG,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,GACnC,IAAI,SAAS,SAAS,CAAC,IAAI,CAAC,GAC3B,IAAI,SAAS,SAAS,CAAC,IAAI,CAAC,GAC3B,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,GAC9B,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,GAC3C,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,GAC/B,CAAC,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC5C,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACvB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GACvB,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAC/B,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAC/B;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACrE,CAAC,CAAC;AAEL;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC5C,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACvB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GACvB,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAC/B,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAC/B;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACrE,CAAC,CAAC;AAoBL;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAuB7D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAuB7D"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Type-level and runtime utilities for converting between snake_case and camelCase.
3
+ *
4
+ * These utilities allow the SDK to expose camelCase APIs to users while the
5
+ * generated types from OpenAPI use snake_case to match the wire format.
6
+ */
7
+ // =============================================================================
8
+ // Runtime Transformations
9
+ // =============================================================================
10
+ /**
11
+ * Convert a snake_case string to camelCase at runtime.
12
+ */
13
+ function snakeToCamelString(str) {
14
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
15
+ }
16
+ /**
17
+ * Convert a camelCase string to snake_case at runtime.
18
+ */
19
+ function camelToSnakeString(str) {
20
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
21
+ }
22
+ /**
23
+ * Recursively transform all keys in an object from snake_case to camelCase at runtime.
24
+ *
25
+ * @example
26
+ * const api = { seq_num: 123, created_at: "2024-01-01" };
27
+ * const sdk = toCamelCase(api); // { seqNum: 123, createdAt: "2024-01-01" }
28
+ */
29
+ export function toCamelCase(obj) {
30
+ if (obj === null || obj === undefined) {
31
+ return obj;
32
+ }
33
+ if (typeof obj !== "object") {
34
+ return obj;
35
+ }
36
+ if (Array.isArray(obj)) {
37
+ return obj.map((item) => toCamelCase(item));
38
+ }
39
+ // Handle Uint8Array and other typed arrays - don't transform
40
+ if (ArrayBuffer.isView(obj)) {
41
+ return obj;
42
+ }
43
+ const result = {};
44
+ for (const [key, value] of Object.entries(obj)) {
45
+ result[snakeToCamelString(key)] = toCamelCase(value);
46
+ }
47
+ return result;
48
+ }
49
+ /**
50
+ * Recursively transform all keys in an object from camelCase to snake_case at runtime.
51
+ *
52
+ * @example
53
+ * const sdk = { seqNum: 123, createdAt: "2024-01-01" };
54
+ * const api = toSnakeCase(sdk); // { seq_num: 123, created_at: "2024-01-01" }
55
+ */
56
+ export function toSnakeCase(obj) {
57
+ if (obj === null || obj === undefined) {
58
+ return obj;
59
+ }
60
+ if (typeof obj !== "object") {
61
+ return obj;
62
+ }
63
+ if (Array.isArray(obj)) {
64
+ return obj.map((item) => toSnakeCase(item));
65
+ }
66
+ // Handle Uint8Array and other typed arrays - don't transform
67
+ if (ArrayBuffer.isView(obj)) {
68
+ return obj;
69
+ }
70
+ const result = {};
71
+ for (const [key, value] of Object.entries(obj)) {
72
+ result[camelToSnakeString(key)] = toSnakeCase(value);
73
+ }
74
+ return result;
75
+ }
76
+ //# sourceMappingURL=case-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-transform.js","sourceRoot":"","sources":["../../../src/internal/case-transform.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgEH,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAI,GAAY;IAC1C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,GAAuB,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAuB,CAAC;IAChC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAqB,CAAC;IACjE,CAAC;IAED,6DAA6D;IAC7D,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAuB,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAA0B,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAI,GAAY;IAC1C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,GAAuB,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAuB,CAAC;IAChC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAqB,CAAC;IACjE,CAAC;IAED,6DAA6D;IAC7D,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAuB,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAA0B,CAAC;AACnC,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Internal type mappers between SDK types and generated types.
3
+ *
4
+ * Only used for hot-path types (records, append/read responses).
5
+ * Config, info, and metric types are used directly from generated types.
6
+ */
7
+ import * as API from "../generated/types.gen.js";
8
+ import type * as InternalTypes from "../lib/stream/types.js";
9
+ import * as Types from "../types.js";
10
+ /**
11
+ * Convert API StreamPosition to SDK StreamPosition.
12
+ */
13
+ export declare function fromAPIStreamPosition(pos: API.StreamPosition): Types.StreamPosition;
14
+ /**
15
+ * Convert API AppendAck to SDK AppendAck.
16
+ */
17
+ export declare function fromAPIAppendAck(ack: API.AppendAck): Types.AppendAck;
18
+ /**
19
+ * Convert API TailResponse to SDK TailResponse.
20
+ */
21
+ export declare function fromAPITailResponse(res: API.TailResponse): Types.TailResponse;
22
+ /**
23
+ * Convert SDK AppendRecord to API AppendRecord (for JSON/REST API).
24
+ */
25
+ export declare function toAPIAppendRecord(record: Types.AppendRecord): API.AppendRecord;
26
+ /** Input type for read batch mappers - accepts both API and internal types. */
27
+ type ReadBatchInput<Format extends "string" | "bytes"> = API.ReadBatch | InternalTypes.ReadBatch<Format>;
28
+ /**
29
+ * Convert API/internal ReadBatch to SDK ReadBatch (string format).
30
+ */
31
+ export declare function fromAPIReadBatchString<Format extends "string" | "bytes" = "string">(batch: ReadBatchInput<Format>): Types.ReadBatch<"string">;
32
+ /**
33
+ * Convert API/internal ReadBatch to SDK ReadBatch (bytes format).
34
+ */
35
+ export declare function fromAPIReadBatchBytes<Format extends "string" | "bytes" = "bytes">(batch: ReadBatchInput<Format>): Types.ReadBatch<"bytes">;
36
+ /**
37
+ * Convert SDK ReadInput (camelCase) to flat query parameters for the API (snake_case).
38
+ */
39
+ export declare function toAPIReadQuery(input?: Types.ReadInput): {
40
+ seq_num?: number;
41
+ timestamp?: number;
42
+ tail_offset?: number;
43
+ clamp?: boolean;
44
+ count?: number;
45
+ bytes?: number;
46
+ until?: number;
47
+ wait?: number;
48
+ ignore_command_records?: boolean;
49
+ };
50
+ export {};
51
+ //# sourceMappingURL=mappers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/internal/mappers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,GAAG,MAAM,2BAA2B,CAAC;AAEjD,OAAO,KAAK,KAAK,aAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAqCrC;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,GAAG,CAAC,cAAc,GACrB,KAAK,CAAC,cAAc,CAKtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAMpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAI7E;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,KAAK,CAAC,YAAY,GACxB,GAAG,CAAC,YAAY,CAqBlB;AAyED,+EAA+E;AAC/E,KAAK,cAAc,CAAC,MAAM,SAAS,QAAQ,GAAG,OAAO,IAClD,GAAG,CAAC,SAAS,GACb,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAEnC;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAC3C,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAO1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,SAAS,QAAQ,GAAG,OAAO,GAAG,OAAO,EAC1C,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAOzD;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACjC,CAmDA"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Internal type mappers between SDK types and generated types.
3
+ *
4
+ * Only used for hot-path types (records, append/read responses).
5
+ * Config, info, and metric types are used directly from generated types.
6
+ */
7
+ import * as API from "../generated/types.gen.js";
8
+ import { decodeFromBase64, encodeToBase64 } from "../lib/base64.js";
9
+ import * as Types from "../types.js";
10
+ // =============================================================================
11
+ // Utilities
12
+ // =============================================================================
13
+ const textEncoder = new TextEncoder();
14
+ function toBytes(value) {
15
+ return typeof value === "string" ? textEncoder.encode(value) : value;
16
+ }
17
+ function toBase64(value) {
18
+ return encodeToBase64(toBytes(value));
19
+ }
20
+ function fromBase64(value) {
21
+ return decodeFromBase64(value);
22
+ }
23
+ /** Convert milliseconds to Date. */
24
+ function toDate(ms) {
25
+ return new Date(ms);
26
+ }
27
+ /** Convert Date or milliseconds to milliseconds. */
28
+ function toEpochMs(value) {
29
+ if (value === undefined || value === null)
30
+ return undefined;
31
+ return typeof value === "number" ? Math.floor(value) : value.getTime();
32
+ }
33
+ // =============================================================================
34
+ // Stream Position Mapper
35
+ // =============================================================================
36
+ /**
37
+ * Convert API StreamPosition to SDK StreamPosition.
38
+ */
39
+ export function fromAPIStreamPosition(pos) {
40
+ return {
41
+ seqNum: pos.seq_num,
42
+ timestamp: toDate(pos.timestamp),
43
+ };
44
+ }
45
+ /**
46
+ * Convert API AppendAck to SDK AppendAck.
47
+ */
48
+ export function fromAPIAppendAck(ack) {
49
+ return {
50
+ start: fromAPIStreamPosition(ack.start),
51
+ end: fromAPIStreamPosition(ack.end),
52
+ tail: fromAPIStreamPosition(ack.tail),
53
+ };
54
+ }
55
+ /**
56
+ * Convert API TailResponse to SDK TailResponse.
57
+ */
58
+ export function fromAPITailResponse(res) {
59
+ return {
60
+ tail: fromAPIStreamPosition(res.tail),
61
+ };
62
+ }
63
+ // =============================================================================
64
+ // Record Mappers - Append
65
+ // =============================================================================
66
+ /**
67
+ * Convert SDK AppendRecord to API AppendRecord (for JSON/REST API).
68
+ */
69
+ export function toAPIAppendRecord(record) {
70
+ const isStringRecord = "body" in record && typeof record.body === "string";
71
+ if (isStringRecord) {
72
+ const stringRecord = record;
73
+ return {
74
+ body: stringRecord.body,
75
+ headers: stringRecord.headers?.map(([name, value]) => [name, value]),
76
+ timestamp: toEpochMs(stringRecord.timestamp),
77
+ };
78
+ }
79
+ else {
80
+ const bytesRecord = record;
81
+ return {
82
+ body: toBase64(bytesRecord.body),
83
+ headers: bytesRecord.headers?.map(([name, value]) => [
84
+ toBase64(name),
85
+ toBase64(value),
86
+ ]),
87
+ timestamp: toEpochMs(bytesRecord.timestamp),
88
+ };
89
+ }
90
+ }
91
+ // =============================================================================
92
+ // Record Mappers - Read
93
+ // =============================================================================
94
+ /**
95
+ * Convert API SequencedRecord to SDK ReadRecord (string format).
96
+ */
97
+ function fromAPISequencedRecordString(record) {
98
+ let headers = [];
99
+ if (record.headers) {
100
+ if (Array.isArray(record.headers)) {
101
+ headers = record.headers.map(([name, value]) => [name, value]);
102
+ }
103
+ else if (typeof record.headers === "object") {
104
+ headers = Object.entries(record.headers);
105
+ }
106
+ }
107
+ return {
108
+ seqNum: record.seq_num,
109
+ timestamp: toDate(record.timestamp),
110
+ body: record.body ?? "",
111
+ headers,
112
+ };
113
+ }
114
+ /**
115
+ * Convert API SequencedRecord to SDK ReadRecord (bytes format).
116
+ */
117
+ function fromAPISequencedRecordBytes(record) {
118
+ let body;
119
+ if (!record.body) {
120
+ body = new Uint8Array();
121
+ }
122
+ else if (typeof record.body === "string") {
123
+ body = fromBase64(record.body);
124
+ }
125
+ else {
126
+ body = record.body;
127
+ }
128
+ let headers = [];
129
+ if (record.headers) {
130
+ if (Array.isArray(record.headers)) {
131
+ headers = record.headers.map(([name, value]) => {
132
+ const nameBytes = typeof name === "string" ? fromBase64(name) : name;
133
+ const valueBytes = typeof value === "string" ? fromBase64(value) : value;
134
+ return [nameBytes, valueBytes];
135
+ });
136
+ }
137
+ else if (typeof record.headers === "object") {
138
+ headers = Object.entries(record.headers).map(([name, value]) => [fromBase64(name), fromBase64(value)]);
139
+ }
140
+ }
141
+ return {
142
+ seqNum: record.seq_num,
143
+ timestamp: toDate(record.timestamp),
144
+ body,
145
+ headers,
146
+ };
147
+ }
148
+ /**
149
+ * Convert API/internal ReadBatch to SDK ReadBatch (string format).
150
+ */
151
+ export function fromAPIReadBatchString(batch) {
152
+ return {
153
+ records: batch.records.map((r) => fromAPISequencedRecordString(r)),
154
+ tail: batch.tail ? fromAPIStreamPosition(batch.tail) : undefined,
155
+ };
156
+ }
157
+ /**
158
+ * Convert API/internal ReadBatch to SDK ReadBatch (bytes format).
159
+ */
160
+ export function fromAPIReadBatchBytes(batch) {
161
+ return {
162
+ records: batch.records.map((r) => fromAPISequencedRecordBytes(r)),
163
+ tail: batch.tail ? fromAPIStreamPosition(batch.tail) : undefined,
164
+ };
165
+ }
166
+ // =============================================================================
167
+ // Read Input Mapper
168
+ // =============================================================================
169
+ /**
170
+ * Convert SDK ReadInput (camelCase) to flat query parameters for the API (snake_case).
171
+ */
172
+ export function toAPIReadQuery(input) {
173
+ if (!input) {
174
+ return {};
175
+ }
176
+ const query = {};
177
+ if (input.start?.from) {
178
+ const from = input.start.from;
179
+ if ("seqNum" in from) {
180
+ query.seq_num = Math.floor(from.seqNum);
181
+ }
182
+ else if ("timestamp" in from) {
183
+ // Convert Date to milliseconds if needed
184
+ query.timestamp =
185
+ typeof from.timestamp === "number"
186
+ ? Math.floor(from.timestamp)
187
+ : from.timestamp.getTime();
188
+ }
189
+ else if ("tailOffset" in from) {
190
+ query.tail_offset = Math.floor(from.tailOffset);
191
+ }
192
+ }
193
+ if (input.start?.clamp !== undefined) {
194
+ query.clamp = input.start.clamp;
195
+ }
196
+ if (input.stop?.limits) {
197
+ if (input.stop.limits.count !== undefined) {
198
+ query.count = Math.floor(input.stop.limits.count);
199
+ }
200
+ if (input.stop.limits.bytes !== undefined) {
201
+ query.bytes = Math.floor(input.stop.limits.bytes);
202
+ }
203
+ }
204
+ if (input.stop?.untilTimestamp !== undefined) {
205
+ query.until =
206
+ typeof input.stop.untilTimestamp === "number"
207
+ ? Math.floor(input.stop.untilTimestamp)
208
+ : input.stop.untilTimestamp.getTime();
209
+ }
210
+ if (input.stop?.waitSecs !== undefined) {
211
+ query.wait = Math.max(0, Math.floor(input.stop.waitSecs));
212
+ }
213
+ if (input.ignoreCommandRecords !== undefined) {
214
+ query.ignore_command_records = input.ignoreCommandRecords;
215
+ }
216
+ return query;
217
+ }
218
+ //# sourceMappingURL=mappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../../src/internal/mappers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * SDK Types - CamelCase wrappers around generated API types.
3
+ *
4
+ * This module re-exports generated types with all keys transformed from
5
+ * snake_case to camelCase for a more idiomatic JavaScript/TypeScript API.
6
+ */
7
+ import type * as API from "../generated/types.gen.js";
8
+ import type { CamelCaseKeys } from "./case-transform.js";
9
+ /**
10
+ * Access token information.
11
+ *
12
+ * Generated: `auto_prefix_streams`, `expires_at`
13
+ * SDK: `autoPrefixStreams`, `expiresAt`
14
+ */
15
+ export type AccessTokenInfo = CamelCaseKeys<API.AccessTokenInfo>;
16
+ /**
17
+ * Access token scope.
18
+ *
19
+ * Generated: `access_tokens`, `op_groups`
20
+ * SDK: `accessTokens`, `opGroups`
21
+ */
22
+ export type AccessTokenScope = CamelCaseKeys<API.AccessTokenScope>;
23
+ /**
24
+ * Basin configuration.
25
+ *
26
+ * Generated: `create_stream_on_append`, `create_stream_on_read`, `default_stream_config`
27
+ * SDK: `createStreamOnAppend`, `createStreamOnRead`, `defaultStreamConfig`
28
+ */
29
+ export type BasinConfig = CamelCaseKeys<API.BasinConfig>;
30
+ /**
31
+ * Basin information.
32
+ */
33
+ export type BasinInfo = CamelCaseKeys<API.BasinInfo>;
34
+ /**
35
+ * Basin reconfiguration options.
36
+ *
37
+ * Generated: `create_stream_on_append`, `create_stream_on_read`, `default_stream_config`
38
+ * SDK: `createStreamOnAppend`, `createStreamOnRead`, `defaultStreamConfig`
39
+ */
40
+ export type BasinReconfiguration = CamelCaseKeys<API.BasinReconfiguration>;
41
+ /**
42
+ * Stream configuration.
43
+ *
44
+ * Generated: `delete_on_empty`, `retention_policy`, `storage_class`
45
+ * SDK: `deleteOnEmpty`, `retentionPolicy`, `storageClass`
46
+ */
47
+ export type StreamConfig = CamelCaseKeys<API.StreamConfig>;
48
+ /**
49
+ * Stream information.
50
+ *
51
+ * Generated: `created_at`, `deleted_at`
52
+ * SDK: `createdAt`, `deletedAt`
53
+ */
54
+ export type StreamInfo = CamelCaseKeys<API.StreamInfo>;
55
+ /**
56
+ * Stream reconfiguration options.
57
+ *
58
+ * Generated: `delete_on_empty`, `retention_policy`, `storage_class`
59
+ * SDK: `deleteOnEmpty`, `retentionPolicy`, `storageClass`
60
+ */
61
+ export type StreamReconfiguration = CamelCaseKeys<API.StreamReconfiguration>;
62
+ /**
63
+ * Delete-on-empty configuration.
64
+ *
65
+ * Generated: `min_age_secs`
66
+ * SDK: `minAgeSecs`
67
+ */
68
+ export type DeleteOnEmptyConfig = CamelCaseKeys<API.DeleteOnEmptyConfig>;
69
+ /**
70
+ * Delete-on-empty reconfiguration.
71
+ *
72
+ * Generated: `min_age_secs`
73
+ * SDK: `minAgeSecs`
74
+ */
75
+ export type DeleteOnEmptyReconfiguration = CamelCaseKeys<API.DeleteOnEmptyReconfiguration>;
76
+ /**
77
+ * List access tokens response.
78
+ *
79
+ * Generated: `access_tokens`, `has_more`
80
+ * SDK: `accessTokens`, `hasMore`
81
+ */
82
+ export type ListAccessTokensResponse = CamelCaseKeys<API.ListAccessTokensResponse>;
83
+ /**
84
+ * List basins response.
85
+ *
86
+ * Generated: `has_more`
87
+ * SDK: `hasMore`
88
+ */
89
+ export type ListBasinsResponse = CamelCaseKeys<API.ListBasinsResponse>;
90
+ /**
91
+ * List streams response.
92
+ *
93
+ * Generated: `has_more`
94
+ * SDK: `hasMore`
95
+ */
96
+ export type ListStreamsResponse = CamelCaseKeys<API.ListStreamsResponse>;
97
+ /**
98
+ * Accumulation metric with interval.
99
+ *
100
+ * Generated: `interval`
101
+ * SDK: `interval`
102
+ */
103
+ export type AccumulationMetric = CamelCaseKeys<API.AccumulationMetric>;
104
+ /**
105
+ * Sequenced record (read from stream).
106
+ *
107
+ * Generated: `seq_num`
108
+ * SDK: `seqNum`
109
+ */
110
+ export type SequencedRecord = CamelCaseKeys<API.SequencedRecord>;
111
+ /**
112
+ * Timestamping configuration.
113
+ */
114
+ export type TimestampingConfig = CamelCaseKeys<API.TimestampingConfig>;
115
+ /**
116
+ * Timestamping reconfiguration.
117
+ */
118
+ export type TimestampingReconfiguration = CamelCaseKeys<API.TimestampingReconfiguration>;
119
+ /**
120
+ * Issue access token response.
121
+ *
122
+ * Generated: `access_token`
123
+ * SDK: `accessToken`
124
+ */
125
+ export type IssueAccessTokenResponse = CamelCaseKeys<API.IssueAccessTokenResponse>;
126
+ export type { AccessTokenIdStr, AccountMetricSet, BasinMetricSet, BasinScope, BasinState, CreateStreamRequest, FencingToken, GaugeMetric, Header, InfiniteRetention, LabelMetric, Metric, MetricSetResponse, MetricUnit, Operation, PermittedOperationGroups, ReadWritePermissions, ResourceSet, RetentionPolicy, ScalarMetric, StorageClass, StreamMetricSet, TimeseriesInterval, TimestampingMode, } from "../generated/types.gen.js";
127
+ //# sourceMappingURL=sdk-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-types.d.ts","sourceRoot":"","sources":["../../../src/internal/sdk-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,2BAA2B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAMnE;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAM3E;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GACvC,aAAa,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAMjD;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GACnC,aAAa,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAMzE;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAMvE;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,2BAA2B,GACtC,aAAa,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GACnC,aAAa,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAM7C,YAAY,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,MAAM,EACN,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * SDK Types - CamelCase wrappers around generated API types.
3
+ *
4
+ * This module re-exports generated types with all keys transformed from
5
+ * snake_case to camelCase for a more idiomatic JavaScript/TypeScript API.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=sdk-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-types.js","sourceRoot":"","sources":["../../../src/internal/sdk-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Generate a random token of the specified byte length, base64 encoded.
3
+ * Uses crypto.getRandomValues() which is available in browsers and Node.js 19+.
4
+ *
5
+ * @param byteLength Number of random bytes to generate (default: 16)
6
+ * @returns Base64-encoded random string
7
+ */
8
+ export declare const randomToken: (byteLength?: number) => string;
1
9
  export declare const encodeToBase64: (bytes: Uint8Array) => string;
2
10
  export declare const decodeFromBase64: (str: string) => Uint8Array;
3
11
  export declare const stripCrlf: (str: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../../src/lib/base64.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAAW,UAAU,WA6B/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,UAuC9C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAS,MAAM,WAA+B,CAAC"}
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../../src/lib/base64.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,2BAAsB,MAI7C,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,UAAU,WA6B/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,UA+C9C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAS,MAAM,WAA+B,CAAC"}
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Generate a random token of the specified byte length, base64 encoded.
3
+ * Uses crypto.getRandomValues() which is available in browsers and Node.js 19+.
4
+ *
5
+ * @param byteLength Number of random bytes to generate (default: 16)
6
+ * @returns Base64-encoded random string
7
+ */
8
+ export const randomToken = (byteLength = 16) => {
9
+ const bytes = new Uint8Array(byteLength);
10
+ crypto.getRandomValues(bytes);
11
+ return encodeToBase64(bytes);
12
+ };
1
13
  export const encodeToBase64 = (bytes) => {
2
14
  const length = bytes.length;
3
15
  let result = "";
@@ -24,29 +36,36 @@ export const encodeToBase64 = (bytes) => {
24
36
  return result;
25
37
  };
26
38
  export const decodeFromBase64 = (str) => {
27
- const stripped = stripCrlf(str);
28
- const length = stripped.length;
39
+ // Normalize to standard base64:
40
+ // - remove CRLF
41
+ // - allow base64url ("-" and "_")
42
+ // - add missing padding
43
+ const normalized = stripCrlf(str)
44
+ .trim()
45
+ .replace(/-/g, "+")
46
+ .replace(/_/g, "/");
47
+ const padded = normalized + "=".repeat((4 - (normalized.length % 4)) % 4);
48
+ const length = padded.length;
29
49
  if (length % 4 !== 0) {
30
50
  throw new Error(`Length must be a multiple of 4, but is ${length}`);
31
51
  }
32
- const index = stripped.indexOf("=");
52
+ const index = padded.indexOf("=");
33
53
  if (index !== -1 &&
34
- (index < length - 2 ||
35
- (index === length - 2 && stripped[length - 1] !== "="))) {
54
+ (index < length - 2 || (index === length - 2 && padded[length - 1] !== "="))) {
36
55
  throw new Error("Found a '=' character, but it is not at the end");
37
56
  }
38
57
  try {
39
- const missingOctets = stripped.endsWith("==")
58
+ const missingOctets = padded.endsWith("==")
40
59
  ? 2
41
- : stripped.endsWith("=")
60
+ : padded.endsWith("=")
42
61
  ? 1
43
62
  : 0;
44
63
  const result = new Uint8Array(3 * (length / 4) - missingOctets);
45
64
  for (let i = 0, j = 0; i < length; i += 4, j += 3) {
46
- const buffer = (getBase64Code(stripped.charCodeAt(i)) << 18) |
47
- (getBase64Code(stripped.charCodeAt(i + 1)) << 12) |
48
- (getBase64Code(stripped.charCodeAt(i + 2)) << 6) |
49
- getBase64Code(stripped.charCodeAt(i + 3));
65
+ const buffer = (getBase64Code(padded.charCodeAt(i)) << 18) |
66
+ (getBase64Code(padded.charCodeAt(i + 1)) << 12) |
67
+ (getBase64Code(padded.charCodeAt(i + 2)) << 6) |
68
+ getBase64Code(padded.charCodeAt(i + 3));
50
69
  result[j] = buffer >> 16;
51
70
  result[j + 1] = (buffer >> 8) & 0xff;
52
71
  result[j + 2] = buffer & 0xff;