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.
- package/LICENSE +21 -0
- package/README.md +950 -0
- package/dist/auth/credentials.d.ts +30 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +23 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/login-client.d.ts +37 -0
- package/dist/auth/login-client.d.ts.map +1 -0
- package/dist/auth/login-client.js +8 -0
- package/dist/auth/login-client.js.map +1 -0
- package/dist/auth/rest-login-client.d.ts +17 -0
- package/dist/auth/rest-login-client.d.ts.map +1 -0
- package/dist/auth/rest-login-client.js +71 -0
- package/dist/auth/rest-login-client.js.map +1 -0
- package/dist/auth/token-provider.d.ts +123 -0
- package/dist/auth/token-provider.d.ts.map +1 -0
- package/dist/auth/token-provider.js +209 -0
- package/dist/auth/token-provider.js.map +1 -0
- package/dist/backup.d.ts +98 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +153 -0
- package/dist/backup.js.map +1 -0
- package/dist/cache.d.ts +90 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +121 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +406 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +724 -0
- package/dist/client.js.map +1 -0
- package/dist/column-type.d.ts +33 -0
- package/dist/column-type.d.ts.map +1 -0
- package/dist/column-type.js +50 -0
- package/dist/column-type.js.map +1 -0
- package/dist/column-value.d.ts +77 -0
- package/dist/column-value.d.ts.map +1 -0
- package/dist/column-value.js +60 -0
- package/dist/column-value.js.map +1 -0
- package/dist/config.d.ts +181 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +315 -0
- package/dist/config.js.map +1 -0
- package/dist/connection-string.d.ts +45 -0
- package/dist/connection-string.d.ts.map +1 -0
- package/dist/connection-string.js +170 -0
- package/dist/connection-string.js.map +1 -0
- package/dist/endpoint-pool.d.ts +70 -0
- package/dist/endpoint-pool.d.ts.map +1 -0
- package/dist/endpoint-pool.js +120 -0
- package/dist/endpoint-pool.js.map +1 -0
- package/dist/error-codes.d.ts +44 -0
- package/dist/error-codes.d.ts.map +1 -0
- package/dist/error-codes.js +43 -0
- package/dist/error-codes.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +33 -0
- package/dist/errors.js.map +1 -0
- package/dist/hlc.d.ts +19 -0
- package/dist/hlc.d.ts.map +1 -0
- package/dist/hlc.js +11 -0
- package/dist/hlc.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +41 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +345 -0
- package/dist/json.js.map +1 -0
- package/dist/object-id.d.ts +39 -0
- package/dist/object-id.d.ts.map +1 -0
- package/dist/object-id.js +99 -0
- package/dist/object-id.js.map +1 -0
- package/dist/options.d.ts +77 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +68 -0
- package/dist/options.js.map +1 -0
- package/dist/prepared/binder.d.ts +20 -0
- package/dist/prepared/binder.d.ts.map +1 -0
- package/dist/prepared/binder.js +32 -0
- package/dist/prepared/binder.js.map +1 -0
- package/dist/prepared/policy.d.ts +81 -0
- package/dist/prepared/policy.d.ts.map +1 -0
- package/dist/prepared/policy.js +164 -0
- package/dist/prepared/policy.js.map +1 -0
- package/dist/query-stream.d.ts +55 -0
- package/dist/query-stream.d.ts.map +1 -0
- package/dist/query-stream.js +94 -0
- package/dist/query-stream.js.map +1 -0
- package/dist/result-set.d.ts +62 -0
- package/dist/result-set.d.ts.map +1 -0
- package/dist/result-set.js +100 -0
- package/dist/result-set.js.map +1 -0
- package/dist/retry.d.ts +38 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +93 -0
- package/dist/retry.js.map +1 -0
- package/dist/routing/advice.d.ts +63 -0
- package/dist/routing/advice.d.ts.map +1 -0
- package/dist/routing/advice.js +61 -0
- package/dist/routing/advice.js.map +1 -0
- package/dist/routing/route-cache.d.ts +53 -0
- package/dist/routing/route-cache.d.ts.map +1 -0
- package/dist/routing/route-cache.js +123 -0
- package/dist/routing/route-cache.js.map +1 -0
- package/dist/routing/router.d.ts +53 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/router.js +89 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/row-source.d.ts +48 -0
- package/dist/row-source.d.ts.map +1 -0
- package/dist/row-source.js +35 -0
- package/dist/row-source.js.map +1 -0
- package/dist/runtime.d.ts +58 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +137 -0
- package/dist/runtime.js.map +1 -0
- package/dist/shared-registry.d.ts +32 -0
- package/dist/shared-registry.d.ts.map +1 -0
- package/dist/shared-registry.js +48 -0
- package/dist/shared-registry.js.map +1 -0
- package/dist/sql-syntax.d.ts +44 -0
- package/dist/sql-syntax.d.ts.map +1 -0
- package/dist/sql-syntax.js +83 -0
- package/dist/sql-syntax.js.map +1 -0
- package/dist/statements.d.ts +15 -0
- package/dist/statements.d.ts.map +1 -0
- package/dist/statements.js +90 -0
- package/dist/statements.js.map +1 -0
- package/dist/transaction.d.ts +117 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +204 -0
- package/dist/transaction.js.map +1 -0
- package/dist/transport/authenticating-transport.d.ts +63 -0
- package/dist/transport/authenticating-transport.d.ts.map +1 -0
- package/dist/transport/authenticating-transport.js +119 -0
- package/dist/transport/authenticating-transport.js.map +1 -0
- package/dist/transport/branch-statements.d.ts +39 -0
- package/dist/transport/branch-statements.d.ts.map +1 -0
- package/dist/transport/branch-statements.js +74 -0
- package/dist/transport/branch-statements.js.map +1 -0
- package/dist/transport/error-text.d.ts +26 -0
- package/dist/transport/error-text.d.ts.map +1 -0
- package/dist/transport/error-text.js +75 -0
- package/dist/transport/error-text.js.map +1 -0
- package/dist/transport/grpc/batcher.d.ts +127 -0
- package/dist/transport/grpc/batcher.d.ts.map +1 -0
- package/dist/transport/grpc/batcher.js +399 -0
- package/dist/transport/grpc/batcher.js.map +1 -0
- package/dist/transport/grpc/codec.d.ts +40 -0
- package/dist/transport/grpc/codec.d.ts.map +1 -0
- package/dist/transport/grpc/codec.js +231 -0
- package/dist/transport/grpc/codec.js.map +1 -0
- package/dist/transport/grpc/grpc-transport.d.ts +115 -0
- package/dist/transport/grpc/grpc-transport.d.ts.map +1 -0
- package/dist/transport/grpc/grpc-transport.js +577 -0
- package/dist/transport/grpc/grpc-transport.js.map +1 -0
- package/dist/transport/grpc/messages.d.ts +221 -0
- package/dist/transport/grpc/messages.d.ts.map +1 -0
- package/dist/transport/grpc/messages.js +56 -0
- package/dist/transport/grpc/messages.js.map +1 -0
- package/dist/transport/grpc/proto.d.ts +71 -0
- package/dist/transport/grpc/proto.d.ts.map +1 -0
- package/dist/transport/grpc/proto.js +67 -0
- package/dist/transport/grpc/proto.js.map +1 -0
- package/dist/transport/http.d.ts +62 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +169 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/ndjson-row-source.d.ts +38 -0
- package/dist/transport/ndjson-row-source.d.ts.map +1 -0
- package/dist/transport/ndjson-row-source.js +197 -0
- package/dist/transport/ndjson-row-source.js.map +1 -0
- package/dist/transport/rest-decode.d.ts +33 -0
- package/dist/transport/rest-decode.d.ts.map +1 -0
- package/dist/transport/rest-decode.js +162 -0
- package/dist/transport/rest-decode.js.map +1 -0
- package/dist/transport/rest-prepared-cache.d.ts +50 -0
- package/dist/transport/rest-prepared-cache.d.ts.map +1 -0
- package/dist/transport/rest-prepared-cache.js +101 -0
- package/dist/transport/rest-prepared-cache.js.map +1 -0
- package/dist/transport/rest-transport.d.ts +88 -0
- package/dist/transport/rest-transport.d.ts.map +1 -0
- package/dist/transport/rest-transport.js +388 -0
- package/dist/transport/rest-transport.js.map +1 -0
- package/dist/transport/transport-pool.d.ts +40 -0
- package/dist/transport/transport-pool.d.ts.map +1 -0
- package/dist/transport/transport-pool.js +48 -0
- package/dist/transport/transport-pool.js.map +1 -0
- package/dist/transport/transport.d.ts +199 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +11 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/values/decode.d.ts +39 -0
- package/dist/values/decode.d.ts.map +1 -0
- package/dist/values/decode.js +75 -0
- package/dist/values/decode.js.map +1 -0
- package/dist/values/encode.d.ts +45 -0
- package/dist/values/encode.d.ts.map +1 -0
- package/dist/values/encode.js +271 -0
- package/dist/values/encode.js.map +1 -0
- package/dist/values/ticks.d.ts +31 -0
- package/dist/values/ticks.d.ts.map +1 -0
- package/dist/values/ticks.js +52 -0
- package/dist/values/ticks.js.map +1 -0
- package/dist/values/typed.d.ts +67 -0
- package/dist/values/typed.d.ts.map +1 -0
- package/dist/values/typed.js +134 -0
- package/dist/values/typed.js.map +1 -0
- package/dist/values/uuid.d.ts +27 -0
- package/dist/values/uuid.d.ts.map +1 -0
- package/dist/values/uuid.js +76 -0
- package/dist/values/uuid.js.map +1 -0
- package/dist/vector.d.ts +26 -0
- package/dist/vector.d.ts.map +1 -0
- package/dist/vector.js +48 -0
- package/dist/vector.js.map +1 -0
- package/package.json +86 -0
- 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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"}
|