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,88 @@
|
|
|
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 { CamusTokenProvider } from '../auth/token-provider.js';
|
|
8
|
+
import type { CamusEndpointPool } from '../endpoint-pool.js';
|
|
9
|
+
import type { CamusTransactionOptions } from '../options.js';
|
|
10
|
+
import { CamusResultSet } from '../result-set.js';
|
|
11
|
+
import type { CamusRowSource } from '../row-source.js';
|
|
12
|
+
import type { CamusBranchRow, CamusTransport, NonQueryTransportResult, PreparedStatementInfo, QueryTransportResult, StartTransactionResult, TransportInsertRequest, TransportSqlRequest } from './transport.js';
|
|
13
|
+
/**
|
|
14
|
+
* The REST and JSON transport, and the default.
|
|
15
|
+
*
|
|
16
|
+
* Each call is one HTTP request to an `execute-sql-*` or admin route, with JSON in and out. It is
|
|
17
|
+
* the only transport that streams rows incrementally, and the only one the backup admin API is
|
|
18
|
+
* reachable over.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RestTransport implements CamusTransport {
|
|
21
|
+
readonly protocol: "rest";
|
|
22
|
+
private readonly pool;
|
|
23
|
+
private readonly auth;
|
|
24
|
+
private readonly prepared;
|
|
25
|
+
constructor(pool: CamusEndpointPool, auth: CamusTokenProvider);
|
|
26
|
+
startTransaction(endpoint: string, database: string, options: CamusTransactionOptions, timeoutSeconds: number, signal?: AbortSignal): Promise<StartTransactionResult>;
|
|
27
|
+
finalizeTransaction(commit: boolean, endpoint: string, database: string, txnIdPT: bigint, txnIdCounter: number, _streamSlot: number | undefined, timeoutSeconds: number, signal?: AbortSignal): Promise<void>;
|
|
28
|
+
executeQuery(request: TransportSqlRequest): Promise<QueryTransportResult>;
|
|
29
|
+
private executeQueryCore;
|
|
30
|
+
executeQueryStream(request: TransportSqlRequest): Promise<CamusRowSource>;
|
|
31
|
+
private executeQueryStreamCore;
|
|
32
|
+
executeNonQuery(request: TransportSqlRequest): Promise<NonQueryTransportResult>;
|
|
33
|
+
private executeNonQueryCore;
|
|
34
|
+
insert(request: TransportInsertRequest): Promise<number>;
|
|
35
|
+
executeDdl(request: TransportSqlRequest): Promise<boolean>;
|
|
36
|
+
ping(endpoint: string, timeoutSeconds: number, signal?: AbortSignal): Promise<boolean>;
|
|
37
|
+
createDatabase(endpoint: string, database: string, ifNotExists: boolean, timeoutSeconds: number, signal?: AbortSignal): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Creates a copy-on-write branch.
|
|
40
|
+
*
|
|
41
|
+
* Branching has no REST route of its own: the server implements it only as SQL, so the statement
|
|
42
|
+
* is composed and sent down the ordinary DDL route — which is what the gRPC transport does too.
|
|
43
|
+
*/
|
|
44
|
+
createBranchDatabase(endpoint: string, branchName: string, sourceDatabaseName: string, ifNotExists: boolean, timeoutSeconds: number, signal?: AbortSignal): Promise<void>;
|
|
45
|
+
dropDatabase(endpoint: string, database: string, timeoutSeconds: number, signal?: AbortSignal): Promise<void>;
|
|
46
|
+
/** See `createBranchDatabase`: a branch listing is a SQL statement, not a route. */
|
|
47
|
+
showBranches(endpoint: string, database: string, timeoutSeconds: number, signal?: AbortSignal): Promise<CamusBranchRow[]>;
|
|
48
|
+
/** See `createBranchDatabase`. */
|
|
49
|
+
showAncestors(endpoint: string, database: string, timeoutSeconds: number, signal?: AbortSignal): Promise<CamusBranchRow[]>;
|
|
50
|
+
/** Runs a composed administration statement on the DDL route. */
|
|
51
|
+
private adminDdl;
|
|
52
|
+
/** Runs a composed administration query on the ordinary query route. */
|
|
53
|
+
private adminQuery;
|
|
54
|
+
prepare(endpoint: string, database: string, sql: string, timeoutSeconds: number, signal?: AbortSignal): Promise<PreparedStatementInfo>;
|
|
55
|
+
private register;
|
|
56
|
+
closePrepared(_endpoint: string, database: string, sql: string, signal?: AbortSignal): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Runs one statement, as a prepared execution when the request asked for it.
|
|
59
|
+
*
|
|
60
|
+
* Two failures are absorbed rather than reported, because preparing is an optimization and must
|
|
61
|
+
* never be the reason a working statement fails.
|
|
62
|
+
*
|
|
63
|
+
* A registration that fails at all — no server support for the route, a statement kind that may
|
|
64
|
+
* not be prepared, a full server-side cap — falls back to running the statement inline, which is
|
|
65
|
+
* what it would have done anyway.
|
|
66
|
+
*
|
|
67
|
+
* An execution refused with `CADB0520` means the handle is gone: it idled out, the node
|
|
68
|
+
* restarted, or the request landed on another node. That is routine by contract, so the
|
|
69
|
+
* registration is dropped and the statement is prepared and replayed exactly once. One replay,
|
|
70
|
+
* not a loop: a second unknown-statement failure means something is wrong beyond a stale handle
|
|
71
|
+
* — a load balancer sending every request to a different node, say — and spinning there would
|
|
72
|
+
* turn a slow path into an endless one.
|
|
73
|
+
*/
|
|
74
|
+
private withPrepared;
|
|
75
|
+
close(): Promise<void>;
|
|
76
|
+
private post;
|
|
77
|
+
/**
|
|
78
|
+
* The bearer token to present, if this client has one.
|
|
79
|
+
*
|
|
80
|
+
* Every route goes through here, so none can accidentally be built unauthenticated. With no
|
|
81
|
+
* credentials configured there is no token and no `Authorization` header at all, which is what a
|
|
82
|
+
* server with authentication off expects.
|
|
83
|
+
*/
|
|
84
|
+
private token;
|
|
85
|
+
}
|
|
86
|
+
/** Re-exported so a caller that only imports this module can still build an empty result. */
|
|
87
|
+
export declare const EMPTY_RESULT_SET: CamusResultSet;
|
|
88
|
+
//# sourceMappingURL=rest-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-transport.d.ts","sourceRoot":"","sources":["../../src/transport/rest-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,388 @@
|
|
|
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 { makeCacheMetadata } from '../cache.js';
|
|
8
|
+
import { columnValueToJson } from '../column-value.js';
|
|
9
|
+
import { CamusProtocol } from '../config.js';
|
|
10
|
+
import { CamusError } from '../errors.js';
|
|
11
|
+
import { CamusErrorCode } from '../error-codes.js';
|
|
12
|
+
import { asBigInt, asNumber, parseLossless } from '../json.js';
|
|
13
|
+
import { bindPositional } from '../prepared/binder.js';
|
|
14
|
+
import { CamusResultSet } from '../result-set.js';
|
|
15
|
+
import { routingAdviceFromJson } from '../routing/advice.js';
|
|
16
|
+
import { createBranchDatabaseSql, mapBranchRows, showAncestorsSql, showBranchesSql, } from './branch-statements.js';
|
|
17
|
+
import { readBody, sendHttp, sendJson, translateErrorBody } from './http.js';
|
|
18
|
+
import { NDJSON_CONTENT_TYPE, NdjsonRowSource } from './ndjson-row-source.js';
|
|
19
|
+
import { resultSetFromWire } from './rest-decode.js';
|
|
20
|
+
import { RestPreparedStatementCache } from './rest-prepared-cache.js';
|
|
21
|
+
import { hasTransaction } from './transport.js';
|
|
22
|
+
/**
|
|
23
|
+
* The REST and JSON transport, and the default.
|
|
24
|
+
*
|
|
25
|
+
* Each call is one HTTP request to an `execute-sql-*` or admin route, with JSON in and out. It is
|
|
26
|
+
* the only transport that streams rows incrementally, and the only one the backup admin API is
|
|
27
|
+
* reachable over.
|
|
28
|
+
*/
|
|
29
|
+
export class RestTransport {
|
|
30
|
+
protocol = CamusProtocol.Rest;
|
|
31
|
+
pool;
|
|
32
|
+
auth;
|
|
33
|
+
prepared = new RestPreparedStatementCache();
|
|
34
|
+
constructor(pool, auth) {
|
|
35
|
+
this.pool = pool;
|
|
36
|
+
this.auth = auth;
|
|
37
|
+
}
|
|
38
|
+
// ─── Transactions ─────────────────────────────────────────────────────────
|
|
39
|
+
async startTransaction(endpoint, database, options, timeoutSeconds, signal) {
|
|
40
|
+
const body = await this.post(endpoint, ['start-transaction'], {
|
|
41
|
+
databaseName: database,
|
|
42
|
+
...concurrencyFields(options),
|
|
43
|
+
}, timeoutSeconds, signal);
|
|
44
|
+
if (body.status !== 'ok') {
|
|
45
|
+
throw new CamusError(body.code ?? CamusErrorCode.Generic, body.message ?? 'Empty result returned');
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
txnIdPT: asBigInt(body.txnIdPT),
|
|
49
|
+
txnIdCounter: asNumber(body.txnIdCounter),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async finalizeTransaction(commit, endpoint, database, txnIdPT, txnIdCounter, _streamSlot, timeoutSeconds, signal) {
|
|
53
|
+
// REST does not pin a transaction to a stream, so the slot means nothing here.
|
|
54
|
+
const path = commit ? 'commit-transaction' : 'rollback-transaction';
|
|
55
|
+
const body = await this.post(endpoint, [path], { databaseName: database, txnIdPT, txnIdCounter }, timeoutSeconds, signal);
|
|
56
|
+
if (body.status !== 'ok') {
|
|
57
|
+
throw new CamusError(body.code ?? CamusErrorCode.Generic, body.message ?? (commit ? 'Commit failed' : 'Rollback failed'));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ─── Statements ───────────────────────────────────────────────────────────
|
|
61
|
+
executeQuery(request) {
|
|
62
|
+
return this.withPrepared(request, (binding) => this.executeQueryCore(request, binding));
|
|
63
|
+
}
|
|
64
|
+
async executeQueryCore(request, binding) {
|
|
65
|
+
const { response } = await sendHttp(this.pool, {
|
|
66
|
+
endpoint: request.endpoint,
|
|
67
|
+
path: ['execute-sql-query'],
|
|
68
|
+
method: 'POST',
|
|
69
|
+
body: buildQueryBody(request, binding),
|
|
70
|
+
token: await this.token(request.signal),
|
|
71
|
+
timeoutSeconds: request.timeoutSeconds,
|
|
72
|
+
signal: request.signal,
|
|
73
|
+
});
|
|
74
|
+
const text = await readBody(response);
|
|
75
|
+
if (!response.ok)
|
|
76
|
+
throw translateErrorBody(response.status, text);
|
|
77
|
+
let body;
|
|
78
|
+
try {
|
|
79
|
+
body = parseLossless(text);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new CamusError(CamusErrorCode.Generic, 'Empty result returned', { cause: error });
|
|
83
|
+
}
|
|
84
|
+
if (typeof body !== 'object' || body === null || Array.isArray(body)) {
|
|
85
|
+
throw new CamusError(CamusErrorCode.Generic, 'Empty result returned');
|
|
86
|
+
}
|
|
87
|
+
const record = body;
|
|
88
|
+
return {
|
|
89
|
+
resultSet: resultSetFromWire(record.columns, record.rows),
|
|
90
|
+
cacheMetadata: cacheMetadataFromJson(record),
|
|
91
|
+
routing: routingAdviceFromJson(record),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
executeQueryStream(request) {
|
|
95
|
+
return this.withPrepared(request, (binding) => this.executeQueryStreamCore(request, binding));
|
|
96
|
+
}
|
|
97
|
+
async executeQueryStreamCore(request, binding) {
|
|
98
|
+
const { response } = await sendHttp(this.pool, {
|
|
99
|
+
endpoint: request.endpoint,
|
|
100
|
+
path: ['execute-sql-query-stream'],
|
|
101
|
+
method: 'POST',
|
|
102
|
+
body: buildQueryBody(request, binding),
|
|
103
|
+
token: await this.token(request.signal),
|
|
104
|
+
accept: NDJSON_CONTENT_TYPE,
|
|
105
|
+
timeoutSeconds: request.timeoutSeconds,
|
|
106
|
+
signal: request.signal,
|
|
107
|
+
});
|
|
108
|
+
// A failure to set the statement up — bad SQL, an unknown database — arrives as a non-2xx
|
|
109
|
+
// before the first line. A conflict that surfaces after rows start flowing is reported by the
|
|
110
|
+
// NDJSON trailer instead, and raised from the read that reaches it.
|
|
111
|
+
if (!response.ok)
|
|
112
|
+
throw translateErrorBody(response.status, await readBody(response));
|
|
113
|
+
if (response.body === null) {
|
|
114
|
+
throw new CamusError(CamusErrorCode.Generic, 'The streaming query response carried no body.');
|
|
115
|
+
}
|
|
116
|
+
return NdjsonRowSource.create(response.body);
|
|
117
|
+
}
|
|
118
|
+
executeNonQuery(request) {
|
|
119
|
+
return this.withPrepared(request, (binding) => this.executeNonQueryCore(request, binding));
|
|
120
|
+
}
|
|
121
|
+
async executeNonQueryCore(request, binding) {
|
|
122
|
+
const body = await this.post(request.endpoint, ['execute-sql-non-query'], buildNonQueryBody(request, binding), request.timeoutSeconds, request.signal);
|
|
123
|
+
return {
|
|
124
|
+
affectedRows: asNumber(body.rows),
|
|
125
|
+
routing: routingAdviceFromJson(body),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async insert(request) {
|
|
129
|
+
const body = {
|
|
130
|
+
databaseName: request.database,
|
|
131
|
+
tableName: request.table,
|
|
132
|
+
values: parametersToJson(request.values),
|
|
133
|
+
};
|
|
134
|
+
if (hasTransaction(request)) {
|
|
135
|
+
body.txnIdPT = request.txnIdPT;
|
|
136
|
+
body.txnIdCounter = request.txnIdCounter;
|
|
137
|
+
}
|
|
138
|
+
const reply = await this.post(request.endpoint, ['insert'], body, request.timeoutSeconds, request.signal);
|
|
139
|
+
return asNumber(reply.rows);
|
|
140
|
+
}
|
|
141
|
+
async executeDdl(request) {
|
|
142
|
+
const body = {
|
|
143
|
+
databaseName: request.database,
|
|
144
|
+
sql: request.sql,
|
|
145
|
+
};
|
|
146
|
+
if (hasTransaction(request)) {
|
|
147
|
+
body.txnIdPT = request.txnIdPT;
|
|
148
|
+
body.txnIdCounter = request.txnIdCounter;
|
|
149
|
+
}
|
|
150
|
+
else if (request.autocommitOptions !== undefined) {
|
|
151
|
+
Object.assign(body, concurrencyFields(request.autocommitOptions));
|
|
152
|
+
}
|
|
153
|
+
const reply = await this.post(request.endpoint, ['execute-sql-ddl'], body, request.timeoutSeconds, request.signal);
|
|
154
|
+
return reply.status === 'ok';
|
|
155
|
+
}
|
|
156
|
+
async ping(endpoint, timeoutSeconds, signal) {
|
|
157
|
+
const body = await sendJson(this.pool, {
|
|
158
|
+
endpoint,
|
|
159
|
+
path: ['ping'],
|
|
160
|
+
method: 'GET',
|
|
161
|
+
token: await this.token(signal),
|
|
162
|
+
timeoutSeconds,
|
|
163
|
+
signal,
|
|
164
|
+
});
|
|
165
|
+
return body.status === 'ok';
|
|
166
|
+
}
|
|
167
|
+
// ─── Database administration ──────────────────────────────────────────────
|
|
168
|
+
async createDatabase(endpoint, database, ifNotExists, timeoutSeconds, signal) {
|
|
169
|
+
const body = await this.post(endpoint, ['create-db'], { databaseName: database, ifNotExists }, timeoutSeconds, signal);
|
|
170
|
+
if (body.status !== 'ok') {
|
|
171
|
+
throw new CamusError(body.code ?? CamusErrorCode.Generic, body.message ?? 'Create database failed');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Creates a copy-on-write branch.
|
|
176
|
+
*
|
|
177
|
+
* Branching has no REST route of its own: the server implements it only as SQL, so the statement
|
|
178
|
+
* is composed and sent down the ordinary DDL route — which is what the gRPC transport does too.
|
|
179
|
+
*/
|
|
180
|
+
async createBranchDatabase(endpoint, branchName, sourceDatabaseName, ifNotExists, timeoutSeconds, signal) {
|
|
181
|
+
await this.adminDdl(endpoint, createBranchDatabaseSql(branchName, sourceDatabaseName, ifNotExists), timeoutSeconds, signal);
|
|
182
|
+
}
|
|
183
|
+
async dropDatabase(endpoint, database, timeoutSeconds, signal) {
|
|
184
|
+
const body = await this.post(endpoint, ['drop-db'], { databaseName: database }, timeoutSeconds, signal);
|
|
185
|
+
if (body.status !== 'ok') {
|
|
186
|
+
throw new CamusError(body.code ?? CamusErrorCode.Generic, body.message ?? 'Drop database failed');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** See `createBranchDatabase`: a branch listing is a SQL statement, not a route. */
|
|
190
|
+
async showBranches(endpoint, database, timeoutSeconds, signal) {
|
|
191
|
+
return mapBranchRows(await this.adminQuery(endpoint, database, showBranchesSql(database), timeoutSeconds, signal));
|
|
192
|
+
}
|
|
193
|
+
/** See `createBranchDatabase`. */
|
|
194
|
+
async showAncestors(endpoint, database, timeoutSeconds, signal) {
|
|
195
|
+
return mapBranchRows(await this.adminQuery(endpoint, database, showAncestorsSql(database), timeoutSeconds, signal));
|
|
196
|
+
}
|
|
197
|
+
/** Runs a composed administration statement on the DDL route. */
|
|
198
|
+
async adminDdl(endpoint, sql, timeoutSeconds, signal) {
|
|
199
|
+
await this.executeDdl({
|
|
200
|
+
endpoint,
|
|
201
|
+
database: '',
|
|
202
|
+
sql,
|
|
203
|
+
timeoutSeconds,
|
|
204
|
+
prepared: false,
|
|
205
|
+
routingAcceptVersion: 0,
|
|
206
|
+
signal,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/** Runs a composed administration query on the ordinary query route. */
|
|
210
|
+
async adminQuery(endpoint, database, sql, timeoutSeconds, signal) {
|
|
211
|
+
const result = await this.executeQueryCore({
|
|
212
|
+
endpoint,
|
|
213
|
+
database,
|
|
214
|
+
sql,
|
|
215
|
+
timeoutSeconds,
|
|
216
|
+
prepared: false,
|
|
217
|
+
routingAcceptVersion: 0,
|
|
218
|
+
signal,
|
|
219
|
+
}, undefined);
|
|
220
|
+
return result.resultSet;
|
|
221
|
+
}
|
|
222
|
+
// ─── Prepared statements ──────────────────────────────────────────────────
|
|
223
|
+
async prepare(endpoint, database, sql, timeoutSeconds, signal) {
|
|
224
|
+
const statement = await this.prepared.getOrAdd({ endpoint, database, sql }, () => this.register(endpoint, database, sql, timeoutSeconds, signal));
|
|
225
|
+
return { parameterNames: statement.parameterNames };
|
|
226
|
+
}
|
|
227
|
+
async register(endpoint, database, sql, timeoutSeconds, signal) {
|
|
228
|
+
const body = await this.post(endpoint, ['prepare-sql-statement'], { databaseName: database, sql }, timeoutSeconds, signal);
|
|
229
|
+
if (body.status !== 'ok' || body.statementId === undefined || body.statementId.length === 0) {
|
|
230
|
+
throw new CamusError(body.code ?? CamusErrorCode.Generic, body.message ?? 'Prepare statement failed');
|
|
231
|
+
}
|
|
232
|
+
return { statementId: body.statementId, parameterNames: body.parameterNames ?? [] };
|
|
233
|
+
}
|
|
234
|
+
async closePrepared(_endpoint, database, sql, signal) {
|
|
235
|
+
// A statement is closed on every node it was registered on, not only the one the caller is
|
|
236
|
+
// sending to, so the endpoint argument is not the one used here.
|
|
237
|
+
for (const { endpoint: registeredOn, statement } of await this.prepared.take(database, sql)) {
|
|
238
|
+
try {
|
|
239
|
+
await this.post(registeredOn, ['close-sql-statement'], { statementId: statement.statementId }, 10, signal);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Best effort: a node that is gone, or a handle it already reclaimed, needs nothing here.
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Runs one statement, as a prepared execution when the request asked for it.
|
|
248
|
+
*
|
|
249
|
+
* Two failures are absorbed rather than reported, because preparing is an optimization and must
|
|
250
|
+
* never be the reason a working statement fails.
|
|
251
|
+
*
|
|
252
|
+
* A registration that fails at all — no server support for the route, a statement kind that may
|
|
253
|
+
* not be prepared, a full server-side cap — falls back to running the statement inline, which is
|
|
254
|
+
* what it would have done anyway.
|
|
255
|
+
*
|
|
256
|
+
* An execution refused with `CADB0520` means the handle is gone: it idled out, the node
|
|
257
|
+
* restarted, or the request landed on another node. That is routine by contract, so the
|
|
258
|
+
* registration is dropped and the statement is prepared and replayed exactly once. One replay,
|
|
259
|
+
* not a loop: a second unknown-statement failure means something is wrong beyond a stale handle
|
|
260
|
+
* — a load balancer sending every request to a different node, say — and spinning there would
|
|
261
|
+
* turn a slow path into an endless one.
|
|
262
|
+
*/
|
|
263
|
+
async withPrepared(request, send) {
|
|
264
|
+
if (!request.prepared)
|
|
265
|
+
return send(undefined);
|
|
266
|
+
const key = { endpoint: request.endpoint, database: request.database, sql: request.sql };
|
|
267
|
+
for (let attempt = 0;; attempt++) {
|
|
268
|
+
let statement;
|
|
269
|
+
let values;
|
|
270
|
+
try {
|
|
271
|
+
statement = await this.prepared.getOrAdd(key, () => this.register(request.endpoint, request.database, request.sql, request.timeoutSeconds, request.signal));
|
|
272
|
+
values = bindPositional(statement.parameterNames, request.parameters);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (!CamusError.is(error))
|
|
276
|
+
throw error;
|
|
277
|
+
// Either the server would not register the statement, or the caller has not bound every
|
|
278
|
+
// placeholder it declares. Both run inline: the first because preparing is an
|
|
279
|
+
// optimization, the second so an unbound parameter is reported by the engine exactly as it
|
|
280
|
+
// would be for a statement that was never prepared.
|
|
281
|
+
return send(undefined);
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
return await send({ statementId: statement.statementId, values });
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
if (attempt > 0 || !CamusError.is(error) || error.code !== CamusErrorCode.UnknownPreparedStatement) {
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
this.prepared.invalidate(key, statement);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async close() {
|
|
295
|
+
// The REST transport holds no socket of its own; the global fetch agent owns the connections.
|
|
296
|
+
}
|
|
297
|
+
async post(endpoint, path, body, timeoutSeconds, signal) {
|
|
298
|
+
return sendJson(this.pool, {
|
|
299
|
+
endpoint,
|
|
300
|
+
path,
|
|
301
|
+
method: 'POST',
|
|
302
|
+
body,
|
|
303
|
+
token: await this.token(signal),
|
|
304
|
+
timeoutSeconds,
|
|
305
|
+
signal,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* The bearer token to present, if this client has one.
|
|
310
|
+
*
|
|
311
|
+
* Every route goes through here, so none can accidentally be built unauthenticated. With no
|
|
312
|
+
* credentials configured there is no token and no `Authorization` header at all, which is what a
|
|
313
|
+
* server with authentication off expects.
|
|
314
|
+
*/
|
|
315
|
+
token(signal) {
|
|
316
|
+
return this.auth.getToken(signal);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function buildQueryBody(request, binding) {
|
|
320
|
+
const body = binding === undefined
|
|
321
|
+
? {
|
|
322
|
+
databaseName: request.database,
|
|
323
|
+
sql: request.sql,
|
|
324
|
+
parameters: parametersToJson(request.parameters),
|
|
325
|
+
}
|
|
326
|
+
: {
|
|
327
|
+
statementId: binding.statementId,
|
|
328
|
+
positionalParameters: binding.values.map(columnValueToJson),
|
|
329
|
+
};
|
|
330
|
+
if (hasTransaction(request)) {
|
|
331
|
+
body.txnIdPT = request.txnIdPT;
|
|
332
|
+
body.txnIdCounter = request.txnIdCounter;
|
|
333
|
+
}
|
|
334
|
+
if (request.routingAcceptVersion > 0)
|
|
335
|
+
body.routingAcceptVersion = request.routingAcceptVersion;
|
|
336
|
+
return body;
|
|
337
|
+
}
|
|
338
|
+
function buildNonQueryBody(request, binding) {
|
|
339
|
+
const body = buildQueryBody(request, binding);
|
|
340
|
+
if (!hasTransaction(request) && request.autocommitOptions !== undefined) {
|
|
341
|
+
Object.assign(body, concurrencyFields(request.autocommitOptions));
|
|
342
|
+
}
|
|
343
|
+
return body;
|
|
344
|
+
}
|
|
345
|
+
/** The `isolationLevel`, `transactionMode`, and `locking` fields, omitting every unset knob. */
|
|
346
|
+
function concurrencyFields(options) {
|
|
347
|
+
const fields = {};
|
|
348
|
+
if (options.isolationLevel !== undefined)
|
|
349
|
+
fields.isolationLevel = options.isolationLevel;
|
|
350
|
+
if (options.mode !== undefined)
|
|
351
|
+
fields.transactionMode = options.mode;
|
|
352
|
+
if (options.locking !== undefined)
|
|
353
|
+
fields.locking = options.locking;
|
|
354
|
+
return fields;
|
|
355
|
+
}
|
|
356
|
+
function parametersToJson(parameters) {
|
|
357
|
+
if (parameters === undefined || parameters.size === 0)
|
|
358
|
+
return undefined;
|
|
359
|
+
const json = {};
|
|
360
|
+
for (const [name, value] of parameters)
|
|
361
|
+
json[name] = columnValueToJson(value);
|
|
362
|
+
return json;
|
|
363
|
+
}
|
|
364
|
+
function cacheMetadataFromJson(body) {
|
|
365
|
+
const status = readString(body.cacheStatus);
|
|
366
|
+
const name = readString(body.cacheName);
|
|
367
|
+
if (status === undefined && name === undefined)
|
|
368
|
+
return undefined;
|
|
369
|
+
let cachedAtHlc;
|
|
370
|
+
const hlc = body.cachedAtHlc;
|
|
371
|
+
if (typeof hlc === 'object' && hlc !== null) {
|
|
372
|
+
const record = hlc;
|
|
373
|
+
cachedAtHlc = { l: asBigInt(record.l), c: asNumber(record.c) };
|
|
374
|
+
}
|
|
375
|
+
return makeCacheMetadata({
|
|
376
|
+
rawStatus: status,
|
|
377
|
+
bypassReason: readString(body.cacheBypassReason),
|
|
378
|
+
name,
|
|
379
|
+
cachedAtHlc,
|
|
380
|
+
ageMs: body.ageMs === undefined || body.ageMs === null ? undefined : asNumber(body.ageMs),
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
function readString(value) {
|
|
384
|
+
return typeof value === 'string' ? value : undefined;
|
|
385
|
+
}
|
|
386
|
+
/** Re-exported so a caller that only imports this module can still build an empty result. */
|
|
387
|
+
export const EMPTY_RESULT_SET = CamusResultSet.EMPTY;
|
|
388
|
+
//# sourceMappingURL=rest-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-transport.js","sourceRoot":"","sources":["../../src/transport/rest-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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 { CamusTransport } from './transport.js';
|
|
8
|
+
/**
|
|
9
|
+
* The transports in use, one per deployment and identity rather than one per client object.
|
|
10
|
+
*
|
|
11
|
+
* A transport owns server-side state that outlives the request that created it:
|
|
12
|
+
* prepared-statement registrations above all, and for gRPC a pool of long-lived streams and their
|
|
13
|
+
* channels. An application that builds a client per request would otherwise get a fresh
|
|
14
|
+
* registration cache every time — while the prepare policy, which is shared, reports a hot
|
|
15
|
+
* statement as already registered. Each new transport would then register that statement again,
|
|
16
|
+
* and nothing would close the ones it replaced, until the server's per-principal cap refused them
|
|
17
|
+
* and every statement quietly fell back to inline execution.
|
|
18
|
+
*
|
|
19
|
+
* Sharing puts the registration cache on the same lifetime as the decision to prepare, which is
|
|
20
|
+
* what the policy always assumed: one registration per statement per deployment, evicted by the
|
|
21
|
+
* policy's own bound.
|
|
22
|
+
*
|
|
23
|
+
* A shared transport lives as long as the process. That is bounded by how many distinct
|
|
24
|
+
* deployments and identities a process talks to, not by how many clients it opens.
|
|
25
|
+
*/
|
|
26
|
+
export declare class CamusTransportPool {
|
|
27
|
+
private static readonly shared;
|
|
28
|
+
/** The transport for a key, built once per process. */
|
|
29
|
+
static forKey(key: string, factory: () => CamusTransport): CamusTransport;
|
|
30
|
+
/**
|
|
31
|
+
* Closes every shared transport and drops them.
|
|
32
|
+
*
|
|
33
|
+
* Call it when a process is shutting down and wants its gRPC channels released promptly. A later
|
|
34
|
+
* client rebuilds whatever it needs, so this is never required for correctness.
|
|
35
|
+
*/
|
|
36
|
+
static closeAll(): Promise<void>;
|
|
37
|
+
/** @internal Test hook: drops every shared transport without closing it. */
|
|
38
|
+
static resetShared(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=transport-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-pool.d.ts","sourceRoot":"","sources":["../../src/transport/transport-pool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAEtE,uDAAuD;IACvD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,GAAG,cAAc;IAIzE;;;;;OAKG;WACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtC,4EAA4E;IAC5E,MAAM,CAAC,WAAW,IAAI,IAAI;CAG3B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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 { SharedRegistry } from '../shared-registry.js';
|
|
8
|
+
/**
|
|
9
|
+
* The transports in use, one per deployment and identity rather than one per client object.
|
|
10
|
+
*
|
|
11
|
+
* A transport owns server-side state that outlives the request that created it:
|
|
12
|
+
* prepared-statement registrations above all, and for gRPC a pool of long-lived streams and their
|
|
13
|
+
* channels. An application that builds a client per request would otherwise get a fresh
|
|
14
|
+
* registration cache every time — while the prepare policy, which is shared, reports a hot
|
|
15
|
+
* statement as already registered. Each new transport would then register that statement again,
|
|
16
|
+
* and nothing would close the ones it replaced, until the server's per-principal cap refused them
|
|
17
|
+
* and every statement quietly fell back to inline execution.
|
|
18
|
+
*
|
|
19
|
+
* Sharing puts the registration cache on the same lifetime as the decision to prepare, which is
|
|
20
|
+
* what the policy always assumed: one registration per statement per deployment, evicted by the
|
|
21
|
+
* policy's own bound.
|
|
22
|
+
*
|
|
23
|
+
* A shared transport lives as long as the process. That is bounded by how many distinct
|
|
24
|
+
* deployments and identities a process talks to, not by how many clients it opens.
|
|
25
|
+
*/
|
|
26
|
+
export class CamusTransportPool {
|
|
27
|
+
static shared = new SharedRegistry();
|
|
28
|
+
/** The transport for a key, built once per process. */
|
|
29
|
+
static forKey(key, factory) {
|
|
30
|
+
return CamusTransportPool.shared.get(key, factory);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Closes every shared transport and drops them.
|
|
34
|
+
*
|
|
35
|
+
* Call it when a process is shutting down and wants its gRPC channels released promptly. A later
|
|
36
|
+
* client rebuilds whatever it needs, so this is never required for correctness.
|
|
37
|
+
*/
|
|
38
|
+
static async closeAll() {
|
|
39
|
+
const transports = [...CamusTransportPool.shared.values()];
|
|
40
|
+
CamusTransportPool.shared.clear();
|
|
41
|
+
await Promise.allSettled(transports.map((transport) => transport.close()));
|
|
42
|
+
}
|
|
43
|
+
/** @internal Test hook: drops every shared transport without closing it. */
|
|
44
|
+
static resetShared() {
|
|
45
|
+
CamusTransportPool.shared.clear();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=transport-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-pool.js","sourceRoot":"","sources":["../../src/transport/transport-pool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAU,MAAM,GAAG,IAAI,cAAc,EAAkB,CAAC;IAEtE,uDAAuD;IACvD,MAAM,CAAC,MAAM,CAAC,GAAW,EAAE,OAA6B;QACtD,OAAO,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ;QACnB,MAAM,UAAU,GAAG,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAE3D,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAC,WAAW;QAChB,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC"}
|