camusdb 0.1.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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +950 -0
  3. package/dist/auth/credentials.d.ts +30 -0
  4. package/dist/auth/credentials.d.ts.map +1 -0
  5. package/dist/auth/credentials.js +23 -0
  6. package/dist/auth/credentials.js.map +1 -0
  7. package/dist/auth/login-client.d.ts +37 -0
  8. package/dist/auth/login-client.d.ts.map +1 -0
  9. package/dist/auth/login-client.js +8 -0
  10. package/dist/auth/login-client.js.map +1 -0
  11. package/dist/auth/rest-login-client.d.ts +17 -0
  12. package/dist/auth/rest-login-client.d.ts.map +1 -0
  13. package/dist/auth/rest-login-client.js +71 -0
  14. package/dist/auth/rest-login-client.js.map +1 -0
  15. package/dist/auth/token-provider.d.ts +123 -0
  16. package/dist/auth/token-provider.d.ts.map +1 -0
  17. package/dist/auth/token-provider.js +209 -0
  18. package/dist/auth/token-provider.js.map +1 -0
  19. package/dist/backup.d.ts +98 -0
  20. package/dist/backup.d.ts.map +1 -0
  21. package/dist/backup.js +153 -0
  22. package/dist/backup.js.map +1 -0
  23. package/dist/cache.d.ts +90 -0
  24. package/dist/cache.d.ts.map +1 -0
  25. package/dist/cache.js +121 -0
  26. package/dist/cache.js.map +1 -0
  27. package/dist/client.d.ts +406 -0
  28. package/dist/client.d.ts.map +1 -0
  29. package/dist/client.js +724 -0
  30. package/dist/client.js.map +1 -0
  31. package/dist/column-type.d.ts +33 -0
  32. package/dist/column-type.d.ts.map +1 -0
  33. package/dist/column-type.js +50 -0
  34. package/dist/column-type.js.map +1 -0
  35. package/dist/column-value.d.ts +77 -0
  36. package/dist/column-value.d.ts.map +1 -0
  37. package/dist/column-value.js +60 -0
  38. package/dist/column-value.js.map +1 -0
  39. package/dist/config.d.ts +181 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +315 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/connection-string.d.ts +45 -0
  44. package/dist/connection-string.d.ts.map +1 -0
  45. package/dist/connection-string.js +170 -0
  46. package/dist/connection-string.js.map +1 -0
  47. package/dist/endpoint-pool.d.ts +70 -0
  48. package/dist/endpoint-pool.d.ts.map +1 -0
  49. package/dist/endpoint-pool.js +120 -0
  50. package/dist/endpoint-pool.js.map +1 -0
  51. package/dist/error-codes.d.ts +44 -0
  52. package/dist/error-codes.d.ts.map +1 -0
  53. package/dist/error-codes.js +43 -0
  54. package/dist/error-codes.js.map +1 -0
  55. package/dist/errors.d.ts +24 -0
  56. package/dist/errors.d.ts.map +1 -0
  57. package/dist/errors.js +33 -0
  58. package/dist/errors.js.map +1 -0
  59. package/dist/hlc.d.ts +19 -0
  60. package/dist/hlc.d.ts.map +1 -0
  61. package/dist/hlc.js +11 -0
  62. package/dist/hlc.js.map +1 -0
  63. package/dist/index.d.ts +55 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +51 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/json.d.ts +41 -0
  68. package/dist/json.d.ts.map +1 -0
  69. package/dist/json.js +345 -0
  70. package/dist/json.js.map +1 -0
  71. package/dist/object-id.d.ts +39 -0
  72. package/dist/object-id.d.ts.map +1 -0
  73. package/dist/object-id.js +99 -0
  74. package/dist/object-id.js.map +1 -0
  75. package/dist/options.d.ts +77 -0
  76. package/dist/options.d.ts.map +1 -0
  77. package/dist/options.js +68 -0
  78. package/dist/options.js.map +1 -0
  79. package/dist/prepared/binder.d.ts +20 -0
  80. package/dist/prepared/binder.d.ts.map +1 -0
  81. package/dist/prepared/binder.js +32 -0
  82. package/dist/prepared/binder.js.map +1 -0
  83. package/dist/prepared/policy.d.ts +81 -0
  84. package/dist/prepared/policy.d.ts.map +1 -0
  85. package/dist/prepared/policy.js +164 -0
  86. package/dist/prepared/policy.js.map +1 -0
  87. package/dist/query-stream.d.ts +55 -0
  88. package/dist/query-stream.d.ts.map +1 -0
  89. package/dist/query-stream.js +94 -0
  90. package/dist/query-stream.js.map +1 -0
  91. package/dist/result-set.d.ts +62 -0
  92. package/dist/result-set.d.ts.map +1 -0
  93. package/dist/result-set.js +100 -0
  94. package/dist/result-set.js.map +1 -0
  95. package/dist/retry.d.ts +38 -0
  96. package/dist/retry.d.ts.map +1 -0
  97. package/dist/retry.js +93 -0
  98. package/dist/retry.js.map +1 -0
  99. package/dist/routing/advice.d.ts +63 -0
  100. package/dist/routing/advice.d.ts.map +1 -0
  101. package/dist/routing/advice.js +61 -0
  102. package/dist/routing/advice.js.map +1 -0
  103. package/dist/routing/route-cache.d.ts +53 -0
  104. package/dist/routing/route-cache.d.ts.map +1 -0
  105. package/dist/routing/route-cache.js +123 -0
  106. package/dist/routing/route-cache.js.map +1 -0
  107. package/dist/routing/router.d.ts +53 -0
  108. package/dist/routing/router.d.ts.map +1 -0
  109. package/dist/routing/router.js +89 -0
  110. package/dist/routing/router.js.map +1 -0
  111. package/dist/row-source.d.ts +48 -0
  112. package/dist/row-source.d.ts.map +1 -0
  113. package/dist/row-source.js +35 -0
  114. package/dist/row-source.js.map +1 -0
  115. package/dist/runtime.d.ts +58 -0
  116. package/dist/runtime.d.ts.map +1 -0
  117. package/dist/runtime.js +137 -0
  118. package/dist/runtime.js.map +1 -0
  119. package/dist/shared-registry.d.ts +32 -0
  120. package/dist/shared-registry.d.ts.map +1 -0
  121. package/dist/shared-registry.js +48 -0
  122. package/dist/shared-registry.js.map +1 -0
  123. package/dist/sql-syntax.d.ts +44 -0
  124. package/dist/sql-syntax.d.ts.map +1 -0
  125. package/dist/sql-syntax.js +83 -0
  126. package/dist/sql-syntax.js.map +1 -0
  127. package/dist/statements.d.ts +15 -0
  128. package/dist/statements.d.ts.map +1 -0
  129. package/dist/statements.js +90 -0
  130. package/dist/statements.js.map +1 -0
  131. package/dist/transaction.d.ts +117 -0
  132. package/dist/transaction.d.ts.map +1 -0
  133. package/dist/transaction.js +204 -0
  134. package/dist/transaction.js.map +1 -0
  135. package/dist/transport/authenticating-transport.d.ts +63 -0
  136. package/dist/transport/authenticating-transport.d.ts.map +1 -0
  137. package/dist/transport/authenticating-transport.js +119 -0
  138. package/dist/transport/authenticating-transport.js.map +1 -0
  139. package/dist/transport/branch-statements.d.ts +39 -0
  140. package/dist/transport/branch-statements.d.ts.map +1 -0
  141. package/dist/transport/branch-statements.js +74 -0
  142. package/dist/transport/branch-statements.js.map +1 -0
  143. package/dist/transport/error-text.d.ts +26 -0
  144. package/dist/transport/error-text.d.ts.map +1 -0
  145. package/dist/transport/error-text.js +75 -0
  146. package/dist/transport/error-text.js.map +1 -0
  147. package/dist/transport/grpc/batcher.d.ts +127 -0
  148. package/dist/transport/grpc/batcher.d.ts.map +1 -0
  149. package/dist/transport/grpc/batcher.js +399 -0
  150. package/dist/transport/grpc/batcher.js.map +1 -0
  151. package/dist/transport/grpc/codec.d.ts +40 -0
  152. package/dist/transport/grpc/codec.d.ts.map +1 -0
  153. package/dist/transport/grpc/codec.js +231 -0
  154. package/dist/transport/grpc/codec.js.map +1 -0
  155. package/dist/transport/grpc/grpc-transport.d.ts +115 -0
  156. package/dist/transport/grpc/grpc-transport.d.ts.map +1 -0
  157. package/dist/transport/grpc/grpc-transport.js +577 -0
  158. package/dist/transport/grpc/grpc-transport.js.map +1 -0
  159. package/dist/transport/grpc/messages.d.ts +221 -0
  160. package/dist/transport/grpc/messages.d.ts.map +1 -0
  161. package/dist/transport/grpc/messages.js +56 -0
  162. package/dist/transport/grpc/messages.js.map +1 -0
  163. package/dist/transport/grpc/proto.d.ts +71 -0
  164. package/dist/transport/grpc/proto.d.ts.map +1 -0
  165. package/dist/transport/grpc/proto.js +67 -0
  166. package/dist/transport/grpc/proto.js.map +1 -0
  167. package/dist/transport/http.d.ts +62 -0
  168. package/dist/transport/http.d.ts.map +1 -0
  169. package/dist/transport/http.js +169 -0
  170. package/dist/transport/http.js.map +1 -0
  171. package/dist/transport/ndjson-row-source.d.ts +38 -0
  172. package/dist/transport/ndjson-row-source.d.ts.map +1 -0
  173. package/dist/transport/ndjson-row-source.js +197 -0
  174. package/dist/transport/ndjson-row-source.js.map +1 -0
  175. package/dist/transport/rest-decode.d.ts +33 -0
  176. package/dist/transport/rest-decode.d.ts.map +1 -0
  177. package/dist/transport/rest-decode.js +162 -0
  178. package/dist/transport/rest-decode.js.map +1 -0
  179. package/dist/transport/rest-prepared-cache.d.ts +50 -0
  180. package/dist/transport/rest-prepared-cache.d.ts.map +1 -0
  181. package/dist/transport/rest-prepared-cache.js +101 -0
  182. package/dist/transport/rest-prepared-cache.js.map +1 -0
  183. package/dist/transport/rest-transport.d.ts +88 -0
  184. package/dist/transport/rest-transport.d.ts.map +1 -0
  185. package/dist/transport/rest-transport.js +388 -0
  186. package/dist/transport/rest-transport.js.map +1 -0
  187. package/dist/transport/transport-pool.d.ts +40 -0
  188. package/dist/transport/transport-pool.d.ts.map +1 -0
  189. package/dist/transport/transport-pool.js +48 -0
  190. package/dist/transport/transport-pool.js.map +1 -0
  191. package/dist/transport/transport.d.ts +199 -0
  192. package/dist/transport/transport.d.ts.map +1 -0
  193. package/dist/transport/transport.js +11 -0
  194. package/dist/transport/transport.js.map +1 -0
  195. package/dist/values/decode.d.ts +39 -0
  196. package/dist/values/decode.d.ts.map +1 -0
  197. package/dist/values/decode.js +75 -0
  198. package/dist/values/decode.js.map +1 -0
  199. package/dist/values/encode.d.ts +45 -0
  200. package/dist/values/encode.d.ts.map +1 -0
  201. package/dist/values/encode.js +271 -0
  202. package/dist/values/encode.js.map +1 -0
  203. package/dist/values/ticks.d.ts +31 -0
  204. package/dist/values/ticks.d.ts.map +1 -0
  205. package/dist/values/ticks.js +52 -0
  206. package/dist/values/ticks.js.map +1 -0
  207. package/dist/values/typed.d.ts +67 -0
  208. package/dist/values/typed.d.ts.map +1 -0
  209. package/dist/values/typed.js +134 -0
  210. package/dist/values/typed.js.map +1 -0
  211. package/dist/values/uuid.d.ts +27 -0
  212. package/dist/values/uuid.d.ts.map +1 -0
  213. package/dist/values/uuid.js +76 -0
  214. package/dist/values/uuid.js.map +1 -0
  215. package/dist/vector.d.ts +26 -0
  216. package/dist/vector.d.ts.map +1 -0
  217. package/dist/vector.js +48 -0
  218. package/dist/vector.js.map +1 -0
  219. package/package.json +86 -0
  220. package/proto/camus_sql.proto +566 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * This file is part of CamusDB
3
+ *
4
+ * For the full copyright and license information, please view the LICENSE.txt
5
+ * file that was distributed with this source code.
6
+ */
7
+ import type { ColumnType } from '../column-type.js';
8
+ import type { ColumnValue } from '../column-value.js';
9
+ import type { CamusRowSource } from '../row-source.js';
10
+ /** The content type the streaming query endpoint serves and expects in `Accept`. */
11
+ export declare const NDJSON_CONTENT_TYPE = "application/x-ndjson";
12
+ /**
13
+ * Rows pulled off the network one line at a time.
14
+ *
15
+ * The streaming query endpoint writes newline-delimited JSON: one header object naming the output
16
+ * columns, then one array per row, then one trailer object. So a result of many thousands of rows
17
+ * never fully materializes on this side — the caller advances, and one more line is read.
18
+ *
19
+ * The trailer is what makes the framing more than a convenience. A conflict that surfaces after
20
+ * the first row has already been sent cannot be reported as an HTTP status, because the status
21
+ * line is long gone. The server reports it in the trailer instead, and this source raises it from
22
+ * the read that reaches it.
23
+ */
24
+ export declare class NdjsonRowSource implements CamusRowSource {
25
+ readonly columnNames: readonly string[];
26
+ readonly columnTypes: readonly ColumnType[];
27
+ readonly recordsAffected = -1;
28
+ private readonly lines;
29
+ private finished;
30
+ private closed;
31
+ private constructor();
32
+ /** Reads the header line and reports a source positioned before the first row. */
33
+ static create(body: ReadableStream<Uint8Array>): Promise<NdjsonRowSource>;
34
+ next(): Promise<readonly ColumnValue[] | undefined>;
35
+ close(): Promise<void>;
36
+ [Symbol.asyncDispose](): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=ndjson-row-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-row-source.d.ts","sourceRoot":"","sources":["../../src/transport/ndjson-row-source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAExC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAE5C,QAAQ,CAAC,eAAe,MAAM;IAE9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IAEnC,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAMP,kFAAkF;WACrE,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAuDzE,IAAI,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,GAAG,SAAS,CAAC;IAkCnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * This file is part of CamusDB
3
+ *
4
+ * For the full copyright and license information, please view the LICENSE.txt
5
+ * file that was distributed with this source code.
6
+ */
7
+ import { NULL_VALUE } from '../column-value.js';
8
+ import { CamusError } from '../errors.js';
9
+ import { CamusErrorCode } from '../error-codes.js';
10
+ import { parseLossless } from '../json.js';
11
+ import { sanitizeErrorText } from './error-text.js';
12
+ import { decodeCell, readSchema } from './rest-decode.js';
13
+ /** The content type the streaming query endpoint serves and expects in `Accept`. */
14
+ export const NDJSON_CONTENT_TYPE = 'application/x-ndjson';
15
+ /**
16
+ * Rows pulled off the network one line at a time.
17
+ *
18
+ * The streaming query endpoint writes newline-delimited JSON: one header object naming the output
19
+ * columns, then one array per row, then one trailer object. So a result of many thousands of rows
20
+ * never fully materializes on this side — the caller advances, and one more line is read.
21
+ *
22
+ * The trailer is what makes the framing more than a convenience. A conflict that surfaces after
23
+ * the first row has already been sent cannot be reported as an HTTP status, because the status
24
+ * line is long gone. The server reports it in the trailer instead, and this source raises it from
25
+ * the read that reaches it.
26
+ */
27
+ export class NdjsonRowSource {
28
+ columnNames;
29
+ columnTypes;
30
+ recordsAffected = -1;
31
+ lines;
32
+ finished = false;
33
+ closed = false;
34
+ constructor(lines, names, types) {
35
+ this.lines = lines;
36
+ this.columnNames = names;
37
+ this.columnTypes = types;
38
+ }
39
+ /** Reads the header line and reports a source positioned before the first row. */
40
+ static async create(body) {
41
+ const lines = new LineReader(body);
42
+ let header;
43
+ try {
44
+ header = await readNonEmptyLine(lines);
45
+ }
46
+ catch (error) {
47
+ await lines.close();
48
+ throw error;
49
+ }
50
+ if (header === undefined) {
51
+ await lines.close();
52
+ throw new CamusError(CamusErrorCode.Generic, 'The streaming query response ended before its schema header.');
53
+ }
54
+ let parsed;
55
+ try {
56
+ parsed = parseLossless(header);
57
+ }
58
+ catch (error) {
59
+ await lines.close();
60
+ throw new CamusError(CamusErrorCode.Generic, 'The streaming query response did not start with a schema header.', { cause: error });
61
+ }
62
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
63
+ await lines.close();
64
+ throw new CamusError(CamusErrorCode.Generic, 'The streaming query response did not start with a schema header.');
65
+ }
66
+ try {
67
+ // A header can already carry a failure. The server writes it before pulling rows, so this is
68
+ // rare, but it is the one place such a failure can appear.
69
+ throwIfFailed(parsed);
70
+ }
71
+ catch (error) {
72
+ await lines.close();
73
+ throw error;
74
+ }
75
+ const { names, types } = readSchema(parsed.columns);
76
+ return new NdjsonRowSource(lines, names, types);
77
+ }
78
+ async next() {
79
+ if (this.finished)
80
+ return undefined;
81
+ const line = await readNonEmptyLine(this.lines);
82
+ if (line === undefined) {
83
+ this.finished = true;
84
+ return undefined;
85
+ }
86
+ const parsed = parseLossless(line);
87
+ if (Array.isArray(parsed)) {
88
+ const cells = new Array(this.columnTypes.length).fill(NULL_VALUE);
89
+ const limit = Math.min(cells.length, parsed.length);
90
+ for (let c = 0; c < limit; c++) {
91
+ cells[c] = decodeCell(parsed[c], this.columnTypes[c]);
92
+ }
93
+ return cells;
94
+ }
95
+ // An object is the trailer. It is the terminal line, and a failed status on it is an error
96
+ // reported in band.
97
+ this.finished = true;
98
+ if (typeof parsed === 'object' && parsed !== null) {
99
+ throwIfFailed(parsed);
100
+ }
101
+ return undefined;
102
+ }
103
+ async close() {
104
+ if (this.closed)
105
+ return;
106
+ this.closed = true;
107
+ this.finished = true;
108
+ await this.lines.close();
109
+ }
110
+ async [Symbol.asyncDispose]() {
111
+ await this.close();
112
+ }
113
+ }
114
+ /**
115
+ * The server writes exactly one record per line, but a blank line is skipped so stray framing
116
+ * never reads as an early end of stream.
117
+ */
118
+ async function readNonEmptyLine(lines) {
119
+ for (;;) {
120
+ const line = await lines.read();
121
+ if (line === undefined)
122
+ return undefined;
123
+ if (line.trim().length > 0)
124
+ return line;
125
+ }
126
+ }
127
+ function throwIfFailed(meta) {
128
+ if (meta.status !== 'failed')
129
+ return;
130
+ const code = typeof meta.code === 'string' ? meta.code : CamusErrorCode.Generic;
131
+ const message = typeof meta.message === 'string' ? meta.message : '';
132
+ throw new CamusError(code, sanitizeErrorText(message));
133
+ }
134
+ /**
135
+ * Splits a byte stream into newline-terminated strings.
136
+ *
137
+ * A JSON line can be split across any number of network reads, so the tail of an incomplete line
138
+ * is held and the search for the next newline resumes where the last one stopped. Without that
139
+ * resume point, a line of N bytes arriving in fragments would be rescanned from its start on every
140
+ * read, which is what short reads from a network stream produce routinely.
141
+ */
142
+ class LineReader {
143
+ reader;
144
+ decoder = new TextDecoder('utf-8');
145
+ buffer = '';
146
+ searched = 0;
147
+ eof = false;
148
+ closed = false;
149
+ constructor(stream) {
150
+ this.reader = stream.getReader();
151
+ }
152
+ /** The next line without its terminator, or `undefined` at the end of the stream. */
153
+ async read() {
154
+ for (;;) {
155
+ const newline = this.buffer.indexOf('\n', this.searched);
156
+ if (newline >= 0) {
157
+ const line = this.buffer.slice(0, newline);
158
+ this.buffer = this.buffer.slice(newline + 1);
159
+ this.searched = 0;
160
+ return line.endsWith('\r') ? line.slice(0, -1) : line;
161
+ }
162
+ // Everything held has now been examined; the next search resumes at what the next read adds.
163
+ this.searched = this.buffer.length;
164
+ if (this.eof)
165
+ return this.takeRemainder();
166
+ const { done, value } = await this.reader.read();
167
+ if (done) {
168
+ this.eof = true;
169
+ this.buffer += this.decoder.decode();
170
+ continue;
171
+ }
172
+ this.buffer += this.decoder.decode(value, { stream: true });
173
+ }
174
+ }
175
+ async close() {
176
+ if (this.closed)
177
+ return;
178
+ this.closed = true;
179
+ try {
180
+ await this.reader.cancel();
181
+ }
182
+ catch {
183
+ // The stream is already gone. Nothing is left to release.
184
+ }
185
+ this.reader.releaseLock();
186
+ }
187
+ /** The unterminated tail after the last newline, taken once at the end of the stream. */
188
+ takeRemainder() {
189
+ if (this.buffer.length === 0)
190
+ return undefined;
191
+ const line = this.buffer;
192
+ this.buffer = '';
193
+ this.searched = 0;
194
+ return line.endsWith('\r') ? line.slice(0, -1) : line;
195
+ }
196
+ }
197
+ //# sourceMappingURL=ndjson-row-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-row-source.js","sourceRoot":"","sources":["../../src/transport/ndjson-row-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * This file is part of CamusDB
3
+ *
4
+ * For the full copyright and license information, please view the LICENSE.txt
5
+ * file that was distributed with this source code.
6
+ */
7
+ import { ColumnType } from '../column-type.js';
8
+ import type { ColumnValue } from '../column-value.js';
9
+ import { CamusResultSet } from '../result-set.js';
10
+ /**
11
+ * Decodes the compact-raw wire form of a query result.
12
+ *
13
+ * The response carries an authoritative `columns` schema plus positional `rows`, where each row is
14
+ * a JSON array aligned to `columns`. Decoding from the schema, rather than by looking at the first
15
+ * row, is what lets a result with no rows still report its column count, names, and types.
16
+ */
17
+ export declare function resultSetFromWire(columns: unknown, rows: unknown): CamusResultSet;
18
+ /** The output column names and declared types of a response's `columns` element. */
19
+ export declare function readSchema(columns: unknown): {
20
+ names: string[];
21
+ types: ColumnType[];
22
+ };
23
+ /**
24
+ * Decodes one positional cell against its declared type.
25
+ *
26
+ * A JSON `null` is the null value for every column type. The types that arrive as a string or an
27
+ * array — `Id`, `Bytes`, `Date`, `DateTime`, `Uuid`, `Array` — rely on the declared type being
28
+ * exact, which it always is for a real column reference. A scalar that arrives as a JSON-native
29
+ * value is read by its token instead, so an over-broad inferred type on an expression column — a
30
+ * numeric projection reported as a string, say — still round-trips.
31
+ */
32
+ export declare function decodeCell(cell: unknown, declared: ColumnType): ColumnValue;
33
+ //# sourceMappingURL=rest-decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-decode.d.ts","sourceRoot":"","sources":["../../src/transport/rest-decode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAgB,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,CA0BjF;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAgBrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW,CAgC3E"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * This file is part of CamusDB
3
+ *
4
+ * For the full copyright and license information, please view the LICENSE.txt
5
+ * file that was distributed with this source code.
6
+ */
7
+ import { ColumnType, isColumnType } from '../column-type.js';
8
+ import { NULL_VALUE } from '../column-value.js';
9
+ import { asBigInt, asNumber } from '../json.js';
10
+ import { CamusResultSet } from '../result-set.js';
11
+ /**
12
+ * Decodes the compact-raw wire form of a query result.
13
+ *
14
+ * The response carries an authoritative `columns` schema plus positional `rows`, where each row is
15
+ * a JSON array aligned to `columns`. Decoding from the schema, rather than by looking at the first
16
+ * row, is what lets a result with no rows still report its column count, names, and types.
17
+ */
18
+ export function resultSetFromWire(columns, rows) {
19
+ const { names, types } = readSchema(columns);
20
+ if (!Array.isArray(rows) || names.length === 0) {
21
+ return new CamusResultSet(names, types, [], 0);
22
+ }
23
+ const columnCount = names.length;
24
+ const rowCount = rows.length;
25
+ const cells = new Array(rowCount * columnCount).fill(NULL_VALUE);
26
+ for (let r = 0; r < rowCount; r++) {
27
+ const row = rows[r];
28
+ if (!Array.isArray(row))
29
+ continue;
30
+ const base = r * columnCount;
31
+ const limit = Math.min(columnCount, row.length);
32
+ for (let c = 0; c < limit; c++) {
33
+ cells[base + c] = decodeCell(row[c], types[c]);
34
+ }
35
+ // Any position the row omitted keeps the null the array was filled with.
36
+ }
37
+ return new CamusResultSet(names, types, cells, rowCount);
38
+ }
39
+ /** The output column names and declared types of a response's `columns` element. */
40
+ export function readSchema(columns) {
41
+ if (!Array.isArray(columns))
42
+ return { names: [], types: [] };
43
+ const names = new Array(columns.length);
44
+ const types = new Array(columns.length);
45
+ for (let i = 0; i < columns.length; i++) {
46
+ const column = columns[i];
47
+ names[i] = typeof column?.name === 'string' ? column.name : '';
48
+ const type = asNumber(column?.type, ColumnType.Null);
49
+ types[i] = isColumnType(type) ? type : ColumnType.Null;
50
+ }
51
+ return { names, types };
52
+ }
53
+ /**
54
+ * Decodes one positional cell against its declared type.
55
+ *
56
+ * A JSON `null` is the null value for every column type. The types that arrive as a string or an
57
+ * array — `Id`, `Bytes`, `Date`, `DateTime`, `Uuid`, `Array` — rely on the declared type being
58
+ * exact, which it always is for a real column reference. A scalar that arrives as a JSON-native
59
+ * value is read by its token instead, so an over-broad inferred type on an expression column — a
60
+ * numeric projection reported as a string, say — still round-trips.
61
+ */
62
+ export function decodeCell(cell, declared) {
63
+ if (cell === null || cell === undefined)
64
+ return NULL_VALUE;
65
+ switch (declared) {
66
+ case ColumnType.Id:
67
+ return { type: ColumnType.Id, strValue: typeof cell === 'string' ? cell : stringifyScalar(cell) };
68
+ case ColumnType.Bytes:
69
+ return { type: ColumnType.Bytes, bytesValue: decodeBase64(cell) };
70
+ case ColumnType.Date:
71
+ return { type: ColumnType.Date, longValue: asBigInt(cell) };
72
+ case ColumnType.DateTime:
73
+ return { type: ColumnType.DateTime, longValue: asBigInt(cell) };
74
+ case ColumnType.Uuid:
75
+ return decodeUuidCell(cell);
76
+ case ColumnType.Array:
77
+ return decodeArrayCell(cell);
78
+ default:
79
+ // A defensive recovery for a gap in the server's type inference: a join projection can
80
+ // report a uuid column's type as a string while still sending the two-int64 wire form. A
81
+ // scalar cell never legitimately arrives as a JSON array, so a two-element array here is
82
+ // that mis-tagged UUID. Decode it structurally rather than trusting the declared type and
83
+ // dropping the value.
84
+ if (Array.isArray(cell) && cell.length === 2)
85
+ return decodeUuidCell(cell);
86
+ return decodeScalarByToken(cell, declared);
87
+ }
88
+ }
89
+ /** A `uuid` is wired as `[high, low]`, two big-endian 64-bit halves. A string is accepted too. */
90
+ function decodeUuidCell(cell) {
91
+ if (Array.isArray(cell) && cell.length === 2) {
92
+ return {
93
+ type: ColumnType.Uuid,
94
+ uuidHigh: asBigInt(cell[0]),
95
+ longValue: asBigInt(cell[1]),
96
+ };
97
+ }
98
+ if (typeof cell === 'string')
99
+ return { type: ColumnType.Uuid, uuidValue: cell };
100
+ return NULL_VALUE;
101
+ }
102
+ /**
103
+ * Decodes an array cell.
104
+ *
105
+ * The wire schema carries no per-element type for an array, so element types are read from the
106
+ * JSON token. That is exact for every element type JSON has a token for. An element type that is
107
+ * itself string-encoded or array-encoded — a uuid, a date, or bytes inside an array — is not
108
+ * reconstructed, and reaches the caller as the string or number the token held.
109
+ */
110
+ function decodeArrayCell(cell) {
111
+ if (!Array.isArray(cell))
112
+ return NULL_VALUE;
113
+ const values = new Array(cell.length);
114
+ let elementType = ColumnType.Null;
115
+ for (let i = 0; i < cell.length; i++) {
116
+ const decoded = decodeScalarByToken(cell[i], ColumnType.Null);
117
+ if (decoded.type !== ColumnType.Null)
118
+ elementType = decoded.type;
119
+ values[i] = decoded;
120
+ }
121
+ return { type: ColumnType.Array, arrayValues: values, arrayElementType: elementType };
122
+ }
123
+ function decodeScalarByToken(cell, declared) {
124
+ switch (typeof cell) {
125
+ case 'string':
126
+ return { type: ColumnType.String, strValue: cell };
127
+ case 'boolean':
128
+ return { type: ColumnType.Bool, boolValue: cell };
129
+ case 'bigint':
130
+ return { type: ColumnType.Integer64, longValue: cell };
131
+ case 'number':
132
+ if (declared === ColumnType.Float64 || declared === ColumnType.Float32) {
133
+ return { type: declared, floatValue: cell };
134
+ }
135
+ return Number.isInteger(cell)
136
+ ? { type: ColumnType.Integer64, longValue: BigInt(cell) }
137
+ : { type: ColumnType.Float64, floatValue: cell };
138
+ default:
139
+ return NULL_VALUE;
140
+ }
141
+ }
142
+ /**
143
+ * An `id` cell that did not arrive as a string. The server always sends one as text, so this is a
144
+ * defence against a malformed reply rather than a path a healthy server takes.
145
+ */
146
+ function stringifyScalar(cell) {
147
+ switch (typeof cell) {
148
+ case 'number':
149
+ case 'bigint':
150
+ case 'boolean':
151
+ return String(cell);
152
+ default:
153
+ return '';
154
+ }
155
+ }
156
+ function decodeBase64(cell) {
157
+ if (typeof cell !== 'string')
158
+ return new Uint8Array(0);
159
+ const buffer = Buffer.from(cell, 'base64');
160
+ return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
161
+ }
162
+ //# sourceMappingURL=rest-decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-decode.js","sourceRoot":"","sources":["../../src/transport/rest-decode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * This file is part of CamusDB
3
+ *
4
+ * For the full copyright and license information, please view the LICENSE.txt
5
+ * file that was distributed with this source code.
6
+ */
7
+ /** A statement the server registered over REST: its handle and its binding order. */
8
+ export interface RestPreparedStatement {
9
+ readonly statementId: string;
10
+ readonly parameterNames: readonly string[];
11
+ }
12
+ interface CacheKey {
13
+ readonly endpoint: string;
14
+ readonly database: string;
15
+ readonly sql: string;
16
+ }
17
+ /**
18
+ * The prepared-statement handles this transport holds, keyed by endpoint, database, and SQL.
19
+ *
20
+ * A REST handle is node-local: the node that minted it is the only one that knows it. So the
21
+ * endpoint is part of the key, and a statement registered on three nodes has three entries.
22
+ *
23
+ * A registration in flight is stored as its promise, so concurrent first calls for the same
24
+ * statement share one registration instead of racing to register it three times. Its result is
25
+ * stored beside the promise once it arrives, so a caller that must drop a dead handle can do it
26
+ * before its own next lookup — reading the promise instead would defer the drop by a microtask,
27
+ * and the retry would then find and re-send the very handle it had just discarded.
28
+ *
29
+ * A registration that fails is dropped, so the next call tries again rather than inheriting a
30
+ * poisoned entry forever.
31
+ */
32
+ export declare class RestPreparedStatementCache {
33
+ private readonly statements;
34
+ /** The registration for a statement, starting one when there is none. */
35
+ getOrAdd(key: CacheKey, register: () => Promise<RestPreparedStatement>): Promise<RestPreparedStatement>;
36
+ /** Drops a registration the server no longer honours, but only if it is still the current one. */
37
+ invalidate(key: CacheKey, stale: RestPreparedStatement): void;
38
+ /**
39
+ * Removes and reports every node's registration of one statement, so the caller can release each
40
+ * handle on the node that minted it. A statement is closed everywhere it was registered, not
41
+ * only where the caller happens to be sending.
42
+ */
43
+ take(database: string, sql: string): Promise<{
44
+ endpoint: string;
45
+ statement: RestPreparedStatement;
46
+ }[]>;
47
+ private remove;
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=rest-prepared-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-prepared-cache.d.ts","sourceRoot":"","sources":["../../src/transport/rest-prepared-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qFAAqF;AACrF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,UAAU,QAAQ;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AASD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IAEvD,yEAAyE;IACnE,QAAQ,CACZ,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,GAC7C,OAAO,CAAC,qBAAqB,CAAC;IAkCjC,kGAAkG;IAClG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAO7D;;;;OAIG;IACG,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,qBAAqB,CAAA;KAAE,EAAE,CAAC;IAoBpE,OAAO,CAAC,MAAM;CAGf"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * This file is part of CamusDB
3
+ *
4
+ * For the full copyright and license information, please view the LICENSE.txt
5
+ * file that was distributed with this source code.
6
+ */
7
+ /**
8
+ * The prepared-statement handles this transport holds, keyed by endpoint, database, and SQL.
9
+ *
10
+ * A REST handle is node-local: the node that minted it is the only one that knows it. So the
11
+ * endpoint is part of the key, and a statement registered on three nodes has three entries.
12
+ *
13
+ * A registration in flight is stored as its promise, so concurrent first calls for the same
14
+ * statement share one registration instead of racing to register it three times. Its result is
15
+ * stored beside the promise once it arrives, so a caller that must drop a dead handle can do it
16
+ * before its own next lookup — reading the promise instead would defer the drop by a microtask,
17
+ * and the retry would then find and re-send the very handle it had just discarded.
18
+ *
19
+ * A registration that fails is dropped, so the next call tries again rather than inheriting a
20
+ * poisoned entry forever.
21
+ */
22
+ export class RestPreparedStatementCache {
23
+ statements = new Map();
24
+ /** The registration for a statement, starting one when there is none. */
25
+ async getOrAdd(key, register) {
26
+ const cacheKey = keyOf(key);
27
+ for (;;) {
28
+ const existing = this.statements.get(cacheKey);
29
+ if (existing !== undefined) {
30
+ try {
31
+ return await existing.pending;
32
+ }
33
+ catch {
34
+ // Whoever started it already reported the failure to its own caller. Drop the poisoned
35
+ // entry and take a fresh turn rather than failing every later execution.
36
+ this.remove(cacheKey, existing);
37
+ continue;
38
+ }
39
+ }
40
+ const pending = register();
41
+ const entry = { pending, resolved: undefined };
42
+ this.statements.set(cacheKey, entry);
43
+ try {
44
+ const statement = await pending;
45
+ entry.resolved = statement;
46
+ return statement;
47
+ }
48
+ catch (error) {
49
+ this.remove(cacheKey, entry);
50
+ throw error;
51
+ }
52
+ }
53
+ }
54
+ /** Drops a registration the server no longer honours, but only if it is still the current one. */
55
+ invalidate(key, stale) {
56
+ const cacheKey = keyOf(key);
57
+ const existing = this.statements.get(cacheKey);
58
+ if (existing?.resolved === stale)
59
+ this.remove(cacheKey, existing);
60
+ }
61
+ /**
62
+ * Removes and reports every node's registration of one statement, so the caller can release each
63
+ * handle on the node that minted it. A statement is closed everywhere it was registered, not
64
+ * only where the caller happens to be sending.
65
+ */
66
+ async take(database, sql) {
67
+ const taken = [];
68
+ for (const [cacheKey, entry] of [...this.statements]) {
69
+ const parsed = parseKey(cacheKey);
70
+ if (parsed.database !== database || parsed.sql !== sql)
71
+ continue;
72
+ this.statements.delete(cacheKey);
73
+ try {
74
+ taken.push({ endpoint: parsed.endpoint, statement: await entry.pending });
75
+ }
76
+ catch {
77
+ // A registration that never succeeded has no handle to release.
78
+ }
79
+ }
80
+ return taken;
81
+ }
82
+ remove(cacheKey, expected) {
83
+ if (this.statements.get(cacheKey) === expected)
84
+ this.statements.delete(cacheKey);
85
+ }
86
+ }
87
+ // A newline cannot appear in an endpoint URL or a database name, so it separates the three parts
88
+ // without ambiguity — and the parts stay recoverable, which `take` needs.
89
+ function keyOf(key) {
90
+ return `${key.endpoint}\n${key.database}\n${key.sql}`;
91
+ }
92
+ function parseKey(cacheKey) {
93
+ const firstBreak = cacheKey.indexOf('\n');
94
+ const secondBreak = cacheKey.indexOf('\n', firstBreak + 1);
95
+ return {
96
+ endpoint: cacheKey.slice(0, firstBreak),
97
+ database: cacheKey.slice(firstBreak + 1, secondBreak),
98
+ sql: cacheKey.slice(secondBreak + 1),
99
+ };
100
+ }
101
+ //# sourceMappingURL=rest-prepared-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-prepared-cache.js","sourceRoot":"","sources":["../../src/transport/rest-prepared-cache.ts"],"names":[],"mappings":"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"}