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,577 @@
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 { CamusProtocol } from '../../config.js';
8
+ import { CamusError } from '../../errors.js';
9
+ import { CamusErrorCode } from '../../error-codes.js';
10
+ import { CamusIsolationLevel, CamusLocking, CamusTransactionMode } from '../../options.js';
11
+ import { bindPositional } from '../../prepared/binder.js';
12
+ import { BufferedRowSource } from '../../row-source.js';
13
+ import { sanitizeErrorText } from '../error-text.js';
14
+ import { createBranchDatabaseSql, createDatabaseSql, dropDatabaseSql, mapBranchRows, showAncestorsSql, showBranchesSql, } from '../branch-statements.js';
15
+ import { hasTransaction } from '../transport.js';
16
+ import { EMPTY_CAUSAL_TOKEN, GrpcBatcher, PreparedStatementStaleError } from './batcher.js';
17
+ import { buildResultSet, encodeValue, fromWire, toWire } from './codec.js';
18
+ import { GrpcIsolationLevel, GrpcLockingMode, GrpcTransactionMode } from './messages.js';
19
+ import { loadGrpc, serviceConstructor } from './proto.js';
20
+ /** How long a channel stays open, and how long an idle one is kept. */
21
+ const KEEPALIVE_TIME_MS = 30_000;
22
+ const KEEPALIVE_TIMEOUT_MS = 10_000;
23
+ const MAX_MESSAGE_BYTES = 64 * 1024 * 1024;
24
+ /**
25
+ * The gRPC transport.
26
+ *
27
+ * Its data plane does not make one call per statement. Statements ride a small pool of long-lived
28
+ * `BatchExecute` duplex streams per endpoint, so many statements — and many concurrent
29
+ * transactions — share one HTTP/2 connection and one set of streams. DDL, ping, the typed row
30
+ * insert, and the credential exchange stay unary, because each is a single call whose reply has
31
+ * nowhere to interleave.
32
+ *
33
+ * The transport also carries the session's causal token. Every reply reports a hybrid-logical-clock
34
+ * instant, the transport keeps the greatest one it has seen, and every request carries it back. That
35
+ * is what makes a read see this session's own earlier writes even when it lands on a different node.
36
+ */
37
+ export class GrpcTransport {
38
+ protocol = CamusProtocol.Grpc;
39
+ auth;
40
+ batchOptions;
41
+ channels = new Map();
42
+ runtime;
43
+ causalToken = EMPTY_CAUSAL_TOKEN;
44
+ closed = false;
45
+ constructor(auth, batchOptions) {
46
+ this.auth = auth;
47
+ this.batchOptions = batchOptions;
48
+ }
49
+ // ─── Transactions ─────────────────────────────────────────────────────────
50
+ async startTransaction(endpoint, database, options, timeoutSeconds, signal) {
51
+ await this.auth.getToken(signal);
52
+ const batcher = await this.batcherFor(endpoint);
53
+ const slot = batcher.reserveSlot();
54
+ // A start reuses the SQL request's database and concurrency fields; its `sql` is ignored.
55
+ const request = { database, ...concurrencyFields(options) };
56
+ return this.withDeadline(timeoutSeconds, signal, async (callSignal) => {
57
+ const handle = await batcher.enqueueStart(request, slot, callSignal);
58
+ this.observeToken({
59
+ n: handle.causalTokenN,
60
+ l: fromWire(handle.causalTokenL),
61
+ c: fromWire(handle.causalTokenC),
62
+ });
63
+ return {
64
+ txnIdPT: fromWire(handle.txnIdPt),
65
+ txnIdCounter: handle.txnIdCounter,
66
+ streamSlot: slot,
67
+ };
68
+ });
69
+ }
70
+ async finalizeTransaction(commit, endpoint, database, txnIdPT, txnIdCounter, streamSlot, timeoutSeconds, signal) {
71
+ await this.auth.getToken(signal);
72
+ const batcher = await this.batcherFor(endpoint);
73
+ const slot = streamSlot ?? batcher.reserveSlot();
74
+ const request = { database, txnHandle: this.buildHandle(txnIdPT, txnIdCounter) };
75
+ await this.withDeadline(timeoutSeconds, signal, async (callSignal) => {
76
+ if (commit) {
77
+ this.observeToken(await batcher.enqueueCommit(request, slot, callSignal));
78
+ return;
79
+ }
80
+ await batcher.enqueueRollback(request, slot, callSignal);
81
+ });
82
+ }
83
+ // ─── Statements ───────────────────────────────────────────────────────────
84
+ async executeQuery(request) {
85
+ await this.auth.getToken(request.signal);
86
+ return this.withDeadline(request.timeoutSeconds, request.signal, async (callSignal) => {
87
+ const batcher = await this.batcherFor(request.endpoint);
88
+ const result = await this.executeBatched(batcher, request, callSignal, (wire, slot, transportId) => batcher.enqueueQuery(wire, slot, callSignal, transportId));
89
+ this.observeToken(result.token);
90
+ return {
91
+ resultSet: buildResultSet(result.schema, result.rows),
92
+ cacheMetadata: result.cacheMetadata,
93
+ routing: result.routing,
94
+ };
95
+ });
96
+ }
97
+ /**
98
+ * The gRPC data plane multiplexes over shared streams that decode a whole result before
99
+ * returning, so this buffers and replays through the same interface. The caller's API is uniform
100
+ * across transports even though only REST is truly incremental; the streaming endpoint this
101
+ * feature targets is REST-only.
102
+ */
103
+ async executeQueryStream(request) {
104
+ const result = await this.executeQuery(request);
105
+ return new BufferedRowSource(result.resultSet);
106
+ }
107
+ async executeNonQuery(request) {
108
+ await this.auth.getToken(request.signal);
109
+ return this.withDeadline(request.timeoutSeconds, request.signal, async (callSignal) => {
110
+ const batcher = await this.batcherFor(request.endpoint);
111
+ const result = await this.executeBatched(batcher, request, callSignal, (wire, slot, transportId) => batcher.enqueueNonQuery(wire, slot, callSignal, transportId));
112
+ this.observeToken(result.token);
113
+ return { affectedRows: result.affectedRows, routing: result.routing };
114
+ });
115
+ }
116
+ // ─── Prepared statements ──────────────────────────────────────────────────
117
+ async prepare(endpoint, database, sql, timeoutSeconds, signal) {
118
+ await this.auth.getToken(signal);
119
+ const batcher = await this.batcherFor(endpoint);
120
+ return this.withDeadline(timeoutSeconds, signal, async (callSignal) => {
121
+ const entry = await batcher.ensurePrepared(batcher.reserveSlot(), database, sql, callSignal);
122
+ return { parameterNames: entry.parameterNames };
123
+ });
124
+ }
125
+ async closePrepared(endpoint, database, sql, signal) {
126
+ // Only a batcher that already exists can hold a registration, and asking for one here would
127
+ // open the whole stream pool just to release nothing.
128
+ const batcher = this.channels.get(endpoint)?.batcher;
129
+ if (batcher === undefined)
130
+ return;
131
+ for (const { slotIndex, entry } of await batcher.takePrepared(database, sql)) {
132
+ await batcher.closePrepared(slotIndex, entry, signal);
133
+ }
134
+ }
135
+ /**
136
+ * Runs one statement over the batcher, as a prepared execution when the request asked for it.
137
+ *
138
+ * A registration that fails at all falls back to running the statement inline. An execution that
139
+ * names a handle the server or the stream no longer has is retried exactly once, after the
140
+ * registration is dropped and made again.
141
+ */
142
+ async executeBatched(batcher, request, signal, send) {
143
+ if (!request.prepared) {
144
+ return send(this.buildSqlRequest(request), request.streamSlot, undefined);
145
+ }
146
+ const slot = request.streamSlot ?? batcher.reserveSlot();
147
+ for (let attempt = 0;; attempt++) {
148
+ let entry;
149
+ let wire;
150
+ try {
151
+ entry = await batcher.ensurePrepared(slot, request.database, request.sql, signal);
152
+ wire = this.buildPreparedSqlRequest(request, entry);
153
+ }
154
+ catch (error) {
155
+ if (!CamusError.is(error))
156
+ throw error;
157
+ return send(this.buildSqlRequest(request), slot, undefined);
158
+ }
159
+ try {
160
+ return await send(wire, slot, entry.transportId);
161
+ }
162
+ catch (error) {
163
+ if (attempt > 0 || !isStaleRegistration(error))
164
+ throw error;
165
+ batcher.invalidatePrepared(slot, request.database, request.sql, entry);
166
+ }
167
+ }
168
+ }
169
+ // ─── Unary calls ──────────────────────────────────────────────────────────
170
+ async executeDdl(request) {
171
+ const reply = await this.unary(request.endpoint, 'sql', 'executeDdl', this.buildSqlRequest(request), request.timeoutSeconds, request.signal);
172
+ this.observeToken({
173
+ n: reply.causalTokenN,
174
+ l: fromWire(reply.causalTokenL),
175
+ c: fromWire(reply.causalTokenC),
176
+ });
177
+ // A DDL reply with no error means success; a failure arrives as a gRPC status instead.
178
+ return true;
179
+ }
180
+ async insert(request) {
181
+ const wire = {
182
+ database: request.database,
183
+ table: request.table,
184
+ values: encodeParameters(request.values),
185
+ };
186
+ if (hasTransaction(request)) {
187
+ wire.txnHandle = this.buildHandle(request.txnIdPT, request.txnIdCounter);
188
+ }
189
+ else {
190
+ wire.causalTokenN = this.causalToken.n;
191
+ wire.causalTokenL = toWire(this.causalToken.l);
192
+ wire.causalTokenC = toWire(this.causalToken.c);
193
+ }
194
+ const reply = await this.unary(request.endpoint, 'rows', 'insertRow', wire, request.timeoutSeconds, request.signal);
195
+ this.observeToken({
196
+ n: reply.causalTokenN,
197
+ l: fromWire(reply.causalTokenL),
198
+ c: fromWire(reply.causalTokenC),
199
+ });
200
+ return reply.affectedRows;
201
+ }
202
+ async ping(endpoint, timeoutSeconds, signal) {
203
+ const reply = await this.unary(endpoint, 'sql', 'ping', {}, timeoutSeconds, signal);
204
+ return reply !== null && reply !== undefined;
205
+ }
206
+ // ─── Database administration, composed as SQL ─────────────────────────────
207
+ createDatabase(endpoint, database, ifNotExists, timeoutSeconds, signal) {
208
+ return this.adminDdl(endpoint, createDatabaseSql(database, ifNotExists), timeoutSeconds, signal);
209
+ }
210
+ createBranchDatabase(endpoint, branchName, sourceDatabaseName, ifNotExists, timeoutSeconds, signal) {
211
+ return this.adminDdl(endpoint, createBranchDatabaseSql(branchName, sourceDatabaseName, ifNotExists), timeoutSeconds, signal);
212
+ }
213
+ dropDatabase(endpoint, database, timeoutSeconds, signal) {
214
+ return this.adminDdl(endpoint, dropDatabaseSql(database), timeoutSeconds, signal);
215
+ }
216
+ async showBranches(endpoint, database, timeoutSeconds, signal) {
217
+ return mapBranchRows(await this.adminQuery(endpoint, database, showBranchesSql(database), timeoutSeconds, signal));
218
+ }
219
+ async showAncestors(endpoint, database, timeoutSeconds, signal) {
220
+ return mapBranchRows(await this.adminQuery(endpoint, database, showAncestorsSql(database), timeoutSeconds, signal));
221
+ }
222
+ adminDdl(endpoint, sql, timeoutSeconds, signal) {
223
+ return this.executeDdl({
224
+ endpoint,
225
+ database: '',
226
+ sql,
227
+ timeoutSeconds,
228
+ prepared: false,
229
+ routingAcceptVersion: 0,
230
+ signal,
231
+ }).then(() => undefined);
232
+ }
233
+ async adminQuery(endpoint, database, sql, timeoutSeconds, signal) {
234
+ const result = await this.executeQuery({
235
+ endpoint,
236
+ database,
237
+ sql,
238
+ timeoutSeconds,
239
+ prepared: false,
240
+ routingAcceptVersion: 0,
241
+ signal,
242
+ });
243
+ return result.resultSet;
244
+ }
245
+ // ─── Credential exchange ──────────────────────────────────────────────────
246
+ async login(endpoint, user, password, timeoutSeconds, signal) {
247
+ const reply = await this.unary(endpoint, 'auth', 'login', { user, password }, timeoutSeconds, signal,
248
+ // The login is the one call that must not present a token: the client has none yet.
249
+ null);
250
+ return { token: reply.token, expiresInMs: readExpiryMs(reply) };
251
+ }
252
+ async logout(endpoint, token, timeoutSeconds, signal) {
253
+ await this.unary(endpoint, 'auth', 'logout', {}, timeoutSeconds, signal, token);
254
+ }
255
+ // ─── Channels and calls ───────────────────────────────────────────────────
256
+ async entryFor(endpoint) {
257
+ const existing = this.channels.get(endpoint);
258
+ if (existing !== undefined)
259
+ return existing;
260
+ const { runtime, definition } = await loadGrpc();
261
+ this.runtime = runtime;
262
+ // A concurrent caller may have finished the load first.
263
+ const raced = this.channels.get(endpoint);
264
+ if (raced !== undefined)
265
+ return raced;
266
+ const { address, credentials } = channelTarget(runtime, endpoint);
267
+ const options = {
268
+ 'grpc.keepalive_time_ms': KEEPALIVE_TIME_MS,
269
+ 'grpc.keepalive_timeout_ms': KEEPALIVE_TIMEOUT_MS,
270
+ 'grpc.keepalive_permit_without_calls': 1,
271
+ 'grpc.max_receive_message_length': MAX_MESSAGE_BYTES,
272
+ 'grpc.max_send_message_length': MAX_MESSAGE_BYTES,
273
+ };
274
+ const entry = {
275
+ sql: new (serviceConstructor(definition, 'CamusSql'))(address, credentials, options),
276
+ auth: new (serviceConstructor(definition, 'CamusAuth'))(address, credentials, options),
277
+ rows: new (serviceConstructor(definition, 'CamusRows'))(address, credentials, options),
278
+ batcher: undefined,
279
+ };
280
+ this.channels.set(endpoint, entry);
281
+ return entry;
282
+ }
283
+ /**
284
+ * The batcher for an endpoint, opening its stream pool on first use.
285
+ *
286
+ * It is built lazily because the pool opens every stream at once: a client that only logs in,
287
+ * pings, or runs DDL never needs them, and — since a stream carries the token it was opened with
288
+ * — opening them before the first login would open them unauthenticated.
289
+ */
290
+ async batcherFor(endpoint) {
291
+ const entry = await this.entryFor(endpoint);
292
+ entry.batcher ??= new GrpcBatcher(this.batchOptions, (id) => this.createBatchStream(id, entry.sql));
293
+ return entry.batcher;
294
+ }
295
+ /**
296
+ * Opens one `BatchExecute` duplex call.
297
+ *
298
+ * The batcher rebuilds a faulted stream on its own, so the token is read here, at open time,
299
+ * rather than captured once. A stream re-opened after a token refresh carries the new token.
300
+ */
301
+ createBatchStream(id, client) {
302
+ const method = client.batchExecute;
303
+ const call = method.call(client, this.buildMetadata(this.auth.currentToken));
304
+ let closed = false;
305
+ return {
306
+ id,
307
+ send(request) {
308
+ call.write(request);
309
+ },
310
+ listen({ onMessage, onClose }) {
311
+ const finish = (error) => {
312
+ if (closed)
313
+ return;
314
+ closed = true;
315
+ onClose(error);
316
+ };
317
+ call.on('data', onMessage);
318
+ call.on('error', (error) => finish(translateStatus(error)));
319
+ call.on('end', () => finish(new CamusError(CamusErrorCode.Generic, 'The gRPC batch stream closed.')));
320
+ },
321
+ close() {
322
+ closed = true;
323
+ try {
324
+ call.end();
325
+ }
326
+ catch {
327
+ // The stream is already broken.
328
+ }
329
+ },
330
+ };
331
+ }
332
+ async unary(endpoint, service, method, request, timeoutSeconds, signal, token) {
333
+ const entry = await this.entryFor(endpoint);
334
+ const client = entry[service];
335
+ // `null` means this call must present no token; `undefined` means take the client's own.
336
+ const bearer = token === null ? undefined : (token ?? (await this.auth.getToken(signal)));
337
+ const metadata = this.buildMetadata(bearer);
338
+ const options = {};
339
+ if (timeoutSeconds > 0) {
340
+ options.deadline = new Date(Date.now() + timeoutSeconds * 1000);
341
+ }
342
+ return new Promise((resolve, reject) => {
343
+ const call = client[method].call(client, request, metadata, options, (error, reply) => {
344
+ signal?.removeEventListener('abort', onAbort);
345
+ if (error !== null && error !== undefined) {
346
+ reject(translateStatus(error));
347
+ return;
348
+ }
349
+ resolve(reply);
350
+ });
351
+ function onAbort() {
352
+ call.cancel();
353
+ }
354
+ if (signal !== undefined) {
355
+ if (signal.aborted) {
356
+ call.cancel();
357
+ reject(signal.reason);
358
+ return;
359
+ }
360
+ signal.addEventListener('abort', onAbort, { once: true });
361
+ }
362
+ });
363
+ }
364
+ /**
365
+ * The call metadata, carrying the bearer token when this client has one.
366
+ *
367
+ * It is always a real `Metadata` instance, even when there is nothing to put in it. A call that
368
+ * passes four arguments — request, metadata, options, callback — is refused outright by grpc-js
369
+ * unless the second one is a `Metadata`, so an unauthenticated client cannot simply leave it out.
370
+ */
371
+ buildMetadata(token) {
372
+ if (this.runtime === undefined) {
373
+ throw new CamusError(CamusErrorCode.Generic, 'The gRPC runtime is not loaded yet.');
374
+ }
375
+ const metadata = new this.runtime.Metadata();
376
+ if (token !== undefined && token.length > 0)
377
+ metadata.set('authorization', `Bearer ${token}`);
378
+ return metadata;
379
+ }
380
+ // ─── Wire building ────────────────────────────────────────────────────────
381
+ buildSqlRequest(request) {
382
+ return this.applyExecutionContext({
383
+ database: request.database,
384
+ sql: request.sql,
385
+ parameters: encodeParameters(request.parameters),
386
+ }, request);
387
+ }
388
+ buildPreparedSqlRequest(request, entry) {
389
+ return this.applyExecutionContext({
390
+ statementId: entry.statementId,
391
+ positionalParameters: bindPositional(entry.parameterNames, request.parameters).map(encodeValue),
392
+ }, request);
393
+ }
394
+ applyExecutionContext(wire, request) {
395
+ if (hasTransaction(request)) {
396
+ wire.txnHandle = this.buildHandle(request.txnIdPT, request.txnIdCounter);
397
+ }
398
+ else {
399
+ if (request.autocommitOptions !== undefined) {
400
+ Object.assign(wire, concurrencyFields(request.autocommitOptions));
401
+ }
402
+ wire.causalTokenN = this.causalToken.n;
403
+ wire.causalTokenL = toWire(this.causalToken.l);
404
+ wire.causalTokenC = toWire(this.causalToken.c);
405
+ }
406
+ // Forwarded for a prepared and an inline request alike: negotiation is a property of the
407
+ // statement's execution, not of how its text travelled. Zero asks for nothing.
408
+ wire.routingAcceptVersion = request.routingAcceptVersion;
409
+ return wire;
410
+ }
411
+ /**
412
+ * A transaction handle carrying this session's latest observed token, so the statements of a
413
+ * resumed transaction keep their causal ordering. All three clock components must travel: the
414
+ * node dimension participates in equality and is the tie-breaker, so a token without it is a
415
+ * lossy copy.
416
+ */
417
+ buildHandle(txnIdPT, txnIdCounter) {
418
+ return {
419
+ txnIdPt: toWire(txnIdPT),
420
+ txnIdCounter,
421
+ causalTokenN: this.causalToken.n,
422
+ causalTokenL: toWire(this.causalToken.l),
423
+ causalTokenC: toWire(this.causalToken.c),
424
+ };
425
+ }
426
+ /**
427
+ * Merges a reply's token, keeping the clock maximum — physical component first, then the logical
428
+ * counter — so the token this session threads advances whatever order replies arrive in.
429
+ */
430
+ observeToken(token) {
431
+ if (token.l === 0n && token.c === 0n)
432
+ return;
433
+ const current = this.causalToken;
434
+ if (token.l < current.l || (token.l === current.l && token.c <= current.c))
435
+ return;
436
+ this.causalToken = token;
437
+ }
438
+ /**
439
+ * Runs one operation under a deadline linked to the caller's own cancellation, so a wedged
440
+ * stream cannot hang a caller forever.
441
+ */
442
+ async withDeadline(timeoutSeconds, signal, operation) {
443
+ if (timeoutSeconds <= 0)
444
+ return operation(signal);
445
+ const controller = new AbortController();
446
+ const timer = setTimeout(() => {
447
+ controller.abort(new CamusError(CamusErrorCode.Generic, `The request timed out after ${String(timeoutSeconds)}s.`));
448
+ }, timeoutSeconds * 1000);
449
+ timer.unref?.();
450
+ const onAbort = () => controller.abort(signal.reason);
451
+ if (signal !== undefined) {
452
+ if (signal.aborted)
453
+ onAbort();
454
+ else
455
+ signal.addEventListener('abort', onAbort, { once: true });
456
+ }
457
+ try {
458
+ return await operation(controller.signal);
459
+ }
460
+ finally {
461
+ clearTimeout(timer);
462
+ signal?.removeEventListener('abort', onAbort);
463
+ }
464
+ }
465
+ async close() {
466
+ if (this.closed)
467
+ return;
468
+ this.closed = true;
469
+ for (const entry of this.channels.values()) {
470
+ if (entry.batcher !== undefined)
471
+ await entry.batcher.dispose();
472
+ entry.sql.close?.();
473
+ entry.auth.close?.();
474
+ entry.rows.close?.();
475
+ }
476
+ this.channels.clear();
477
+ }
478
+ }
479
+ function isStaleRegistration(error) {
480
+ return (error instanceof PreparedStatementStaleError ||
481
+ (CamusError.is(error) && error.code === CamusErrorCode.UnknownPreparedStatement));
482
+ }
483
+ function encodeParameters(parameters) {
484
+ const encoded = {};
485
+ if (parameters !== undefined) {
486
+ for (const [name, value] of parameters)
487
+ encoded[name] = encodeValue(value);
488
+ }
489
+ return encoded;
490
+ }
491
+ function concurrencyFields(options) {
492
+ return {
493
+ isolationLevel: options.isolationLevel === CamusIsolationLevel.ReadCommitted
494
+ ? GrpcIsolationLevel.ReadCommitted
495
+ : options.isolationLevel === CamusIsolationLevel.Serializable
496
+ ? GrpcIsolationLevel.Serializable
497
+ : GrpcIsolationLevel.Unspecified,
498
+ transactionMode: options.mode === CamusTransactionMode.ReadWrite
499
+ ? GrpcTransactionMode.ReadWrite
500
+ : options.mode === CamusTransactionMode.ReadOnly
501
+ ? GrpcTransactionMode.ReadOnly
502
+ : GrpcTransactionMode.Unspecified,
503
+ locking: options.locking === CamusLocking.Pessimistic
504
+ ? GrpcLockingMode.Pessimistic
505
+ : options.locking === CamusLocking.Optimistic
506
+ ? GrpcLockingMode.Optimistic
507
+ : GrpcLockingMode.Unspecified,
508
+ };
509
+ }
510
+ /**
511
+ * Splits an endpoint URL into the `host:port` gRPC dials and the channel credentials its scheme
512
+ * implies. An `https://` endpoint gets TLS; anything else is plaintext.
513
+ */
514
+ function channelTarget(runtime, endpoint) {
515
+ let url;
516
+ try {
517
+ url = new URL(endpoint);
518
+ }
519
+ catch {
520
+ // A bare `host:port` is a valid gRPC target even though it is not a URL.
521
+ return { address: endpoint, credentials: runtime.credentials.createInsecure() };
522
+ }
523
+ const secure = url.protocol === 'https:' || url.protocol === 'grpcs:';
524
+ const port = url.port.length > 0 ? url.port : secure ? '443' : '80';
525
+ return {
526
+ address: `${url.hostname}:${port}`,
527
+ credentials: secure ? runtime.credentials.createSsl() : runtime.credentials.createInsecure(),
528
+ };
529
+ }
530
+ /**
531
+ * Turns a gRPC status into a `CamusError`.
532
+ *
533
+ * The server's `CADBxxxx` code rides the trailing metadata, and that is what the client layer keys
534
+ * its retry and refresh decisions off. A rejection raised before the handler runs — the
535
+ * authentication gate at stream open — can arrive with no trailers at all, so the domain code is
536
+ * recovered from the status itself, and the token-refresh path still triggers.
537
+ */
538
+ function translateStatus(error) {
539
+ const code = readMetadata(error, 'camus-error-code');
540
+ const message = readMetadata(error, 'camus-error-message');
541
+ if (code !== undefined && code.length > 0) {
542
+ return new CamusError(code, sanitizeErrorText(message ?? ''), { cause: error });
543
+ }
544
+ // Sanitized for the same reason a REST body is: this text is written by the far end and is
545
+ // logged by the caller.
546
+ const detail = sanitizeErrorText(error.details ?? error.message);
547
+ switch (error.code) {
548
+ case GRPC_STATUS_UNAUTHENTICATED:
549
+ return new CamusError(CamusErrorCode.AuthenticationFailed, detail, { cause: error });
550
+ case GRPC_STATUS_PERMISSION_DENIED:
551
+ return new CamusError(CamusErrorCode.InsufficientPrivilege, detail, { cause: error });
552
+ default:
553
+ return new CamusError(CamusErrorCode.Generic, detail, { cause: error });
554
+ }
555
+ }
556
+ const GRPC_STATUS_UNAUTHENTICATED = 16;
557
+ const GRPC_STATUS_PERMISSION_DENIED = 7;
558
+ function readMetadata(error, key) {
559
+ const values = error.metadata?.get(key);
560
+ const first = values?.[0];
561
+ if (first === undefined)
562
+ return undefined;
563
+ return typeof first === 'string' ? first : first.toString('utf8');
564
+ }
565
+ function readExpiryMs(reply) {
566
+ const seconds = fromWire(reply.expiresInSeconds);
567
+ if (seconds > 0n)
568
+ return Number(seconds) * 1000;
569
+ const expiresAt = fromWire(reply.expiresAtUnixMs);
570
+ if (expiresAt > 0n) {
571
+ const remaining = Number(expiresAt) - Date.now();
572
+ if (remaining > 0)
573
+ return remaining;
574
+ }
575
+ return undefined;
576
+ }
577
+ //# sourceMappingURL=grpc-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-transport.js","sourceRoot":"","sources":["../../../src/transport/grpc/grpc-transport.ts"],"names":[],"mappings":"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"}