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,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The shapes `@grpc/proto-loader` builds from `camus_sql.proto`.
|
|
9
|
+
*
|
|
10
|
+
* The loader constructs these at run time, so they carry no types of their own. Writing them out
|
|
11
|
+
* here is what keeps the rest of the gRPC transport type-checked: a renamed field is then a
|
|
12
|
+
* compile error in one file rather than an `undefined` at run time.
|
|
13
|
+
*
|
|
14
|
+
* Two loader settings shape every declaration below. A 64-bit field arrives as a decimal string,
|
|
15
|
+
* because a JavaScript number cannot name every 64-bit integer. A `oneof` adds a discriminator
|
|
16
|
+
* field naming the branch that is set.
|
|
17
|
+
*/
|
|
18
|
+
/** A 64-bit field on the wire. The loader writes one as a decimal string. */
|
|
19
|
+
export type Int64Wire = string;
|
|
20
|
+
export declare const GrpcColumnType: {
|
|
21
|
+
readonly Null: 0;
|
|
22
|
+
readonly Id: 1;
|
|
23
|
+
readonly Integer64: 2;
|
|
24
|
+
readonly String: 3;
|
|
25
|
+
readonly Bool: 4;
|
|
26
|
+
readonly Float64: 5;
|
|
27
|
+
readonly Float32: 6;
|
|
28
|
+
readonly Bytes: 7;
|
|
29
|
+
readonly Date: 8;
|
|
30
|
+
readonly DateTime: 9;
|
|
31
|
+
readonly Array: 10;
|
|
32
|
+
readonly Uuid: 11;
|
|
33
|
+
};
|
|
34
|
+
export declare const GrpcIsolationLevel: {
|
|
35
|
+
readonly Unspecified: 0;
|
|
36
|
+
readonly ReadCommitted: 1;
|
|
37
|
+
readonly Serializable: 2;
|
|
38
|
+
};
|
|
39
|
+
export declare const GrpcTransactionMode: {
|
|
40
|
+
readonly Unspecified: 0;
|
|
41
|
+
readonly ReadWrite: 1;
|
|
42
|
+
readonly ReadOnly: 2;
|
|
43
|
+
};
|
|
44
|
+
export declare const GrpcLockingMode: {
|
|
45
|
+
readonly Unspecified: 0;
|
|
46
|
+
readonly Pessimistic: 1;
|
|
47
|
+
readonly Optimistic: 2;
|
|
48
|
+
};
|
|
49
|
+
export declare const GrpcRoutingDisposition: {
|
|
50
|
+
readonly Unspecified: 0;
|
|
51
|
+
readonly Prefer: 1;
|
|
52
|
+
readonly Clear: 2;
|
|
53
|
+
};
|
|
54
|
+
export declare const GrpcRoutingReuseScope: {
|
|
55
|
+
readonly Unspecified: 0;
|
|
56
|
+
readonly StatementParametersIndependent: 1;
|
|
57
|
+
};
|
|
58
|
+
/** Which branch of `Value.kind` is set. It is the field name, as the loader spells it. */
|
|
59
|
+
export type ValueKind = 'nullValue' | 'idValue' | 'int64Value' | 'stringValue' | 'boolValue' | 'float64Value' | 'float32Value' | 'bytesValue' | 'dateValue' | 'datetimeValue' | 'arrayValue' | 'uuidValue';
|
|
60
|
+
export interface GrpcValue {
|
|
61
|
+
kind?: ValueKind | undefined;
|
|
62
|
+
nullValue?: number;
|
|
63
|
+
idValue?: string;
|
|
64
|
+
int64Value?: Int64Wire;
|
|
65
|
+
stringValue?: string;
|
|
66
|
+
boolValue?: boolean;
|
|
67
|
+
float64Value?: number;
|
|
68
|
+
float32Value?: number;
|
|
69
|
+
bytesValue?: Buffer;
|
|
70
|
+
dateValue?: Int64Wire;
|
|
71
|
+
datetimeValue?: Int64Wire;
|
|
72
|
+
arrayValue?: GrpcArrayValue;
|
|
73
|
+
uuidValue?: Buffer;
|
|
74
|
+
}
|
|
75
|
+
export interface GrpcArrayValue {
|
|
76
|
+
elementType: number;
|
|
77
|
+
items: GrpcValue[];
|
|
78
|
+
}
|
|
79
|
+
export interface GrpcColumnSchema {
|
|
80
|
+
name: string;
|
|
81
|
+
type: number;
|
|
82
|
+
}
|
|
83
|
+
export interface GrpcResultSchema {
|
|
84
|
+
columns: GrpcColumnSchema[];
|
|
85
|
+
}
|
|
86
|
+
export interface GrpcResultRow {
|
|
87
|
+
values: GrpcValue[];
|
|
88
|
+
}
|
|
89
|
+
export interface GrpcHlcTimestamp {
|
|
90
|
+
l: Int64Wire;
|
|
91
|
+
c: number;
|
|
92
|
+
}
|
|
93
|
+
export interface GrpcCacheMetadata {
|
|
94
|
+
status: string;
|
|
95
|
+
bypassReason: string;
|
|
96
|
+
name: string;
|
|
97
|
+
cachedAtHlc?: GrpcHlcTimestamp | null;
|
|
98
|
+
ageMs?: Int64Wire | null;
|
|
99
|
+
}
|
|
100
|
+
export interface GrpcRoutingAdviceMessage {
|
|
101
|
+
version: number;
|
|
102
|
+
disposition: number;
|
|
103
|
+
preferredNodeId: string;
|
|
104
|
+
reuseScope: number;
|
|
105
|
+
dependencyToken: string;
|
|
106
|
+
maxAgeMs: number;
|
|
107
|
+
provenance: string;
|
|
108
|
+
reason: string;
|
|
109
|
+
}
|
|
110
|
+
export interface GrpcTxnHandle {
|
|
111
|
+
txnIdPt: Int64Wire;
|
|
112
|
+
txnIdCounter: number;
|
|
113
|
+
causalTokenN: number;
|
|
114
|
+
causalTokenL: Int64Wire;
|
|
115
|
+
causalTokenC: Int64Wire;
|
|
116
|
+
}
|
|
117
|
+
export interface GrpcSqlRequest {
|
|
118
|
+
database?: string;
|
|
119
|
+
sql?: string;
|
|
120
|
+
parameters?: Record<string, GrpcValue>;
|
|
121
|
+
txnHandle?: GrpcTxnHandle | null;
|
|
122
|
+
isolationLevel?: number;
|
|
123
|
+
transactionMode?: number;
|
|
124
|
+
locking?: number;
|
|
125
|
+
causalTokenL?: Int64Wire;
|
|
126
|
+
causalTokenC?: Int64Wire;
|
|
127
|
+
causalTokenN?: number;
|
|
128
|
+
statementId?: number;
|
|
129
|
+
positionalParameters?: GrpcValue[];
|
|
130
|
+
priority?: number;
|
|
131
|
+
routingAcceptVersion?: number;
|
|
132
|
+
}
|
|
133
|
+
export interface GrpcNonQueryReply {
|
|
134
|
+
affectedRows: number;
|
|
135
|
+
causalTokenL: Int64Wire;
|
|
136
|
+
causalTokenC: Int64Wire;
|
|
137
|
+
causalTokenN: number;
|
|
138
|
+
warning: string;
|
|
139
|
+
routing?: GrpcRoutingAdviceMessage | null;
|
|
140
|
+
}
|
|
141
|
+
export interface GrpcDdlReply {
|
|
142
|
+
causalTokenL: Int64Wire;
|
|
143
|
+
causalTokenC: Int64Wire;
|
|
144
|
+
causalTokenN: number;
|
|
145
|
+
affectedRows: number;
|
|
146
|
+
warning: string;
|
|
147
|
+
}
|
|
148
|
+
export interface GrpcCommitReply {
|
|
149
|
+
causalTokenL: Int64Wire;
|
|
150
|
+
causalTokenC: Int64Wire;
|
|
151
|
+
causalTokenN: number;
|
|
152
|
+
}
|
|
153
|
+
export interface GrpcPrepareReply {
|
|
154
|
+
statementId: number;
|
|
155
|
+
parameterNames: string[];
|
|
156
|
+
}
|
|
157
|
+
export interface GrpcQueryComplete {
|
|
158
|
+
total: Int64Wire;
|
|
159
|
+
causalTokenL: Int64Wire;
|
|
160
|
+
causalTokenC: Int64Wire;
|
|
161
|
+
causalTokenN: number;
|
|
162
|
+
cacheMetadata?: GrpcCacheMetadata | null;
|
|
163
|
+
routing?: GrpcRoutingAdviceMessage | null;
|
|
164
|
+
}
|
|
165
|
+
export interface GrpcBatchError {
|
|
166
|
+
code: string;
|
|
167
|
+
message: string;
|
|
168
|
+
}
|
|
169
|
+
/** The statement kinds `BatchExecute` multiplexes over one stream. */
|
|
170
|
+
export declare const GrpcBatchStatementKind: {
|
|
171
|
+
readonly Unspecified: 0;
|
|
172
|
+
readonly Query: 1;
|
|
173
|
+
readonly NonQuery: 2;
|
|
174
|
+
readonly Start: 3;
|
|
175
|
+
readonly Commit: 4;
|
|
176
|
+
readonly Rollback: 5;
|
|
177
|
+
readonly Prepare: 6;
|
|
178
|
+
readonly Close: 7;
|
|
179
|
+
};
|
|
180
|
+
export type GrpcBatchStatementKind = (typeof GrpcBatchStatementKind)[keyof typeof GrpcBatchStatementKind];
|
|
181
|
+
export interface GrpcBatchExecuteRequest {
|
|
182
|
+
requestId: number;
|
|
183
|
+
kind: GrpcBatchStatementKind;
|
|
184
|
+
request: GrpcSqlRequest;
|
|
185
|
+
}
|
|
186
|
+
/** Which branch of `BatchExecuteResponse.payload` is set. */
|
|
187
|
+
export type BatchPayloadCase = 'schema' | 'row' | 'queryComplete' | 'nonQuery' | 'error' | 'startReply' | 'commitReply' | 'rollbackReply' | 'prepareReply' | 'closeReply';
|
|
188
|
+
export interface GrpcBatchExecuteResponse {
|
|
189
|
+
requestId: number;
|
|
190
|
+
payload?: BatchPayloadCase | undefined;
|
|
191
|
+
schema?: GrpcResultSchema;
|
|
192
|
+
row?: GrpcResultRow;
|
|
193
|
+
queryComplete?: GrpcQueryComplete;
|
|
194
|
+
nonQuery?: GrpcNonQueryReply;
|
|
195
|
+
error?: GrpcBatchError;
|
|
196
|
+
startReply?: GrpcTxnHandle;
|
|
197
|
+
commitReply?: GrpcCommitReply;
|
|
198
|
+
rollbackReply?: Record<string, never>;
|
|
199
|
+
prepareReply?: GrpcPrepareReply;
|
|
200
|
+
closeReply?: Record<string, never>;
|
|
201
|
+
}
|
|
202
|
+
export interface GrpcLoginReply {
|
|
203
|
+
token: string;
|
|
204
|
+
expiresAtUnixMs: Int64Wire;
|
|
205
|
+
expiresInSeconds: Int64Wire;
|
|
206
|
+
}
|
|
207
|
+
export interface GrpcPingReply {
|
|
208
|
+
message: string;
|
|
209
|
+
}
|
|
210
|
+
export interface GrpcInsertRowRequest {
|
|
211
|
+
database: string;
|
|
212
|
+
table: string;
|
|
213
|
+
values: Record<string, GrpcValue>;
|
|
214
|
+
txnHandle?: GrpcTxnHandle | null;
|
|
215
|
+
causalTokenL?: Int64Wire;
|
|
216
|
+
causalTokenC?: Int64Wire;
|
|
217
|
+
causalTokenN?: number;
|
|
218
|
+
locking?: number;
|
|
219
|
+
priority?: number;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/transport/grpc/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
export const GrpcColumnType = {
|
|
8
|
+
Null: 0,
|
|
9
|
+
Id: 1,
|
|
10
|
+
Integer64: 2,
|
|
11
|
+
String: 3,
|
|
12
|
+
Bool: 4,
|
|
13
|
+
Float64: 5,
|
|
14
|
+
Float32: 6,
|
|
15
|
+
Bytes: 7,
|
|
16
|
+
Date: 8,
|
|
17
|
+
DateTime: 9,
|
|
18
|
+
Array: 10,
|
|
19
|
+
Uuid: 11,
|
|
20
|
+
};
|
|
21
|
+
export const GrpcIsolationLevel = {
|
|
22
|
+
Unspecified: 0,
|
|
23
|
+
ReadCommitted: 1,
|
|
24
|
+
Serializable: 2,
|
|
25
|
+
};
|
|
26
|
+
export const GrpcTransactionMode = {
|
|
27
|
+
Unspecified: 0,
|
|
28
|
+
ReadWrite: 1,
|
|
29
|
+
ReadOnly: 2,
|
|
30
|
+
};
|
|
31
|
+
export const GrpcLockingMode = {
|
|
32
|
+
Unspecified: 0,
|
|
33
|
+
Pessimistic: 1,
|
|
34
|
+
Optimistic: 2,
|
|
35
|
+
};
|
|
36
|
+
export const GrpcRoutingDisposition = {
|
|
37
|
+
Unspecified: 0,
|
|
38
|
+
Prefer: 1,
|
|
39
|
+
Clear: 2,
|
|
40
|
+
};
|
|
41
|
+
export const GrpcRoutingReuseScope = {
|
|
42
|
+
Unspecified: 0,
|
|
43
|
+
StatementParametersIndependent: 1,
|
|
44
|
+
};
|
|
45
|
+
/** The statement kinds `BatchExecute` multiplexes over one stream. */
|
|
46
|
+
export const GrpcBatchStatementKind = {
|
|
47
|
+
Unspecified: 0,
|
|
48
|
+
Query: 1,
|
|
49
|
+
NonQuery: 2,
|
|
50
|
+
Start: 3,
|
|
51
|
+
Commit: 4,
|
|
52
|
+
Rollback: 5,
|
|
53
|
+
Prepare: 6,
|
|
54
|
+
Close: 7,
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/transport/grpc/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,CAAC;IACP,EAAE,EAAE,CAAC;IACL,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,CAAC;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,CAAC;CACL,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE,CAAC;IACd,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,WAAW,EAAE,CAAC;IACd,8BAA8B,EAAE,CAAC;CACzB,CAAC;AA8IX,sEAAsE;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE,CAAC;IACd,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACA,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Loads the gRPC service definitions from `camus_sql.proto` — the same file that is the server's
|
|
9
|
+
* source of truth, so the REST and gRPC surfaces cannot drift apart.
|
|
10
|
+
*
|
|
11
|
+
* `@grpc/grpc-js` and `@grpc/proto-loader` are optional peer dependencies. A REST client is the
|
|
12
|
+
* common case and must not have to install a gRPC stack it will never open, so both are imported
|
|
13
|
+
* only when a gRPC client is actually built, and a missing one is reported with the command that
|
|
14
|
+
* installs it.
|
|
15
|
+
*/
|
|
16
|
+
/** The generated client stubs, kept as loose shapes because proto-loader builds them at run time. */
|
|
17
|
+
export interface CamusGrpcClients {
|
|
18
|
+
readonly sql: GrpcServiceClient;
|
|
19
|
+
readonly auth: GrpcServiceClient;
|
|
20
|
+
readonly rows: GrpcServiceClient;
|
|
21
|
+
readonly close: () => void;
|
|
22
|
+
}
|
|
23
|
+
/** Enough of a grpc-js client to call it. The method names come from the service definition. */
|
|
24
|
+
export interface GrpcServiceClient {
|
|
25
|
+
[method: string]: unknown;
|
|
26
|
+
close?: () => void;
|
|
27
|
+
}
|
|
28
|
+
/** The subset of `@grpc/grpc-js` this driver uses. */
|
|
29
|
+
export interface GrpcRuntime {
|
|
30
|
+
readonly credentials: {
|
|
31
|
+
createInsecure: () => unknown;
|
|
32
|
+
createSsl: () => unknown;
|
|
33
|
+
};
|
|
34
|
+
readonly Metadata: new () => GrpcMetadata;
|
|
35
|
+
readonly loadPackageDefinition: (definition: unknown) => Record<string, unknown>;
|
|
36
|
+
readonly status: Record<string, number>;
|
|
37
|
+
}
|
|
38
|
+
export interface GrpcMetadata {
|
|
39
|
+
set: (key: string, value: string) => void;
|
|
40
|
+
get: (key: string) => (string | Buffer)[];
|
|
41
|
+
}
|
|
42
|
+
/** A duplex call as grpc-js hands it back. */
|
|
43
|
+
export interface GrpcDuplexCall<TRequest, TResponse> {
|
|
44
|
+
write: (message: TRequest, callback?: (error?: Error | null) => void) => boolean;
|
|
45
|
+
end: () => void;
|
|
46
|
+
cancel: () => void;
|
|
47
|
+
on: ((event: 'data', listener: (message: TResponse) => void) => void) & ((event: 'error', listener: (error: GrpcStatusError) => void) => void) & ((event: 'end' | 'close', listener: () => void) => void);
|
|
48
|
+
once: (event: string, listener: (...args: never[]) => void) => void;
|
|
49
|
+
removeAllListeners: () => void;
|
|
50
|
+
}
|
|
51
|
+
/** A gRPC failure as grpc-js raises it. */
|
|
52
|
+
export interface GrpcStatusError extends Error {
|
|
53
|
+
readonly code?: number;
|
|
54
|
+
readonly details?: string;
|
|
55
|
+
readonly metadata?: GrpcMetadata;
|
|
56
|
+
}
|
|
57
|
+
interface LoadedRuntime {
|
|
58
|
+
readonly runtime: GrpcRuntime;
|
|
59
|
+
readonly definition: Record<string, unknown>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The gRPC runtime and the parsed service definitions, loaded once per process.
|
|
63
|
+
*
|
|
64
|
+
* Parsing the proto file costs real work and the result is immutable, so it is memoized. A failed
|
|
65
|
+
* load is not memoized, so a missing dependency installed later is picked up without a restart.
|
|
66
|
+
*/
|
|
67
|
+
export declare function loadGrpc(): Promise<LoadedRuntime>;
|
|
68
|
+
/** The constructor for one service, taken from the loaded definitions. */
|
|
69
|
+
export declare function serviceConstructor(definition: Record<string, unknown>, serviceName: string): new (address: string, credentials: unknown, options?: unknown) => GrpcServiceClient;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=proto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proto.d.ts","sourceRoot":"","sources":["../../../src/transport/grpc/proto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 { fileURLToPath } from 'node:url';
|
|
8
|
+
import { CamusError } from '../../errors.js';
|
|
9
|
+
import { CamusErrorCode } from '../../error-codes.js';
|
|
10
|
+
let loaded;
|
|
11
|
+
/**
|
|
12
|
+
* The gRPC runtime and the parsed service definitions, loaded once per process.
|
|
13
|
+
*
|
|
14
|
+
* Parsing the proto file costs real work and the result is immutable, so it is memoized. A failed
|
|
15
|
+
* load is not memoized, so a missing dependency installed later is picked up without a restart.
|
|
16
|
+
*/
|
|
17
|
+
export async function loadGrpc() {
|
|
18
|
+
loaded ??= loadOnce().catch((error) => {
|
|
19
|
+
loaded = undefined;
|
|
20
|
+
throw error;
|
|
21
|
+
});
|
|
22
|
+
return loaded;
|
|
23
|
+
}
|
|
24
|
+
async function loadOnce() {
|
|
25
|
+
const runtime = (await importOptional('@grpc/grpc-js'));
|
|
26
|
+
const protoLoader = (await importOptional('@grpc/proto-loader'));
|
|
27
|
+
const packageDefinition = protoLoader.loadSync(protoPath(), {
|
|
28
|
+
keepCase: false,
|
|
29
|
+
// A 64-bit field arrives as a decimal string and is converted to a bigint here. Reading it as
|
|
30
|
+
// a JavaScript number would round any value above 2^53, and this driver's whole int64 contract
|
|
31
|
+
// rests on that not happening.
|
|
32
|
+
longs: String,
|
|
33
|
+
enums: Number,
|
|
34
|
+
bytes: Buffer,
|
|
35
|
+
defaults: true,
|
|
36
|
+
oneofs: true,
|
|
37
|
+
});
|
|
38
|
+
return { runtime, definition: runtime.loadPackageDefinition(packageDefinition) };
|
|
39
|
+
}
|
|
40
|
+
async function importOptional(specifier) {
|
|
41
|
+
try {
|
|
42
|
+
return (await import(specifier));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw new CamusError(CamusErrorCode.Generic, `The gRPC transport needs the optional package '${specifier}'. Install it with ` +
|
|
46
|
+
"'npm install @grpc/grpc-js @grpc/proto-loader', or use the REST protocol.", { cause: error });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Where `camus_sql.proto` lives, relative to this module.
|
|
51
|
+
*
|
|
52
|
+
* The path holds for both the compiled layout (`dist/transport/grpc/`) and the source layout
|
|
53
|
+
* (`src/transport/grpc/`), because both sit three levels below the package root, and `proto/` is
|
|
54
|
+
* listed in the package's published files.
|
|
55
|
+
*/
|
|
56
|
+
function protoPath() {
|
|
57
|
+
return fileURLToPath(new URL('../../../proto/camus_sql.proto', import.meta.url));
|
|
58
|
+
}
|
|
59
|
+
/** The constructor for one service, taken from the loaded definitions. */
|
|
60
|
+
export function serviceConstructor(definition, serviceName) {
|
|
61
|
+
const service = definition[serviceName];
|
|
62
|
+
if (typeof service !== 'function') {
|
|
63
|
+
throw new CamusError(CamusErrorCode.Generic, `camus_sql.proto declares no service named '${serviceName}'.`);
|
|
64
|
+
}
|
|
65
|
+
return service;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=proto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proto.js","sourceRoot":"","sources":["../../../src/transport/grpc/proto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkEtD,IAAI,MAA0C,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,KAAK,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC7C,MAAM,GAAG,SAAS,CAAC;QACnB,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,OAAO,GAAG,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,CAAgB,CAAC;IACvE,MAAM,WAAW,GAAG,CAAC,MAAM,cAAc,CAAC,oBAAoB,CAAC,CAE9D,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE;QAC1D,QAAQ,EAAE,KAAK;QACf,8FAA8F;QAC9F,+FAA+F;QAC/F,+BAA+B;QAC/B,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC7C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAY,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,OAAO,EACtB,kDAAkD,SAAS,qBAAqB;YAC9E,2EAA2E,EAC7E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS;IAChB,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAChC,UAAmC,EACnC,WAAmB;IAEnB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,OAAO,EACtB,8CAA8C,WAAW,IAAI,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,OAA8F,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 { CamusEndpointPool } from '../endpoint-pool.js';
|
|
8
|
+
import { CamusError } from '../errors.js';
|
|
9
|
+
/** How one HTTP call is made. */
|
|
10
|
+
export interface HttpRequestInit {
|
|
11
|
+
/** The base URL of the node to call. */
|
|
12
|
+
readonly endpoint: string;
|
|
13
|
+
/** Path segments appended to the base URL. */
|
|
14
|
+
readonly path: readonly string[];
|
|
15
|
+
readonly method: 'GET' | 'POST';
|
|
16
|
+
/** The body, serialized with `stringifyLossless` so a 64-bit value stays exact. */
|
|
17
|
+
readonly body?: unknown;
|
|
18
|
+
/** Query string values. */
|
|
19
|
+
readonly query?: Readonly<Record<string, string>> | undefined;
|
|
20
|
+
/** The bearer token to present, when the client has one. */
|
|
21
|
+
readonly token?: string | undefined;
|
|
22
|
+
/** The `Accept` header. Defaults to `application/json`. */
|
|
23
|
+
readonly accept?: string | undefined;
|
|
24
|
+
/** How long to wait before giving up. Zero or less means no deadline. */
|
|
25
|
+
readonly timeoutSeconds: number;
|
|
26
|
+
/** The caller's own cancellation. */
|
|
27
|
+
readonly signal?: AbortSignal | undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* An HTTP response whose body has not been read yet. The streaming query endpoint needs the raw
|
|
31
|
+
* body, and every other route reads it as JSON.
|
|
32
|
+
*/
|
|
33
|
+
export interface HttpResponse {
|
|
34
|
+
readonly status: number;
|
|
35
|
+
readonly response: Response;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Sends one request and reports the response, whatever its status.
|
|
39
|
+
*
|
|
40
|
+
* A failure to reach the node at all — a refused connection, a DNS failure, a deadline — is turned
|
|
41
|
+
* into a `CamusError` here, and the endpoint is set aside in the pool. A non-2xx status is left to
|
|
42
|
+
* the caller, because only the caller knows whether the route treats one as an error.
|
|
43
|
+
*
|
|
44
|
+
* A cancellation the caller asked for is re-thrown as it is. It is not a database failure, the
|
|
45
|
+
* node is not unreachable, and turning it into a `CamusError` would hide the caller's own intent.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sendHttp(pool: CamusEndpointPool | undefined, init: HttpRequestInit): Promise<HttpResponse>;
|
|
48
|
+
/** Sends a request and reads a JSON body. A non-2xx status becomes a `CamusError`. */
|
|
49
|
+
export declare function sendJson<T>(pool: CamusEndpointPool | undefined, init: HttpRequestInit): Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Turns a failed HTTP call into a `CamusError`.
|
|
52
|
+
*
|
|
53
|
+
* The server's `{status, code, message}` body is preferred — it carries the `CADBxxxx` code the
|
|
54
|
+
* client layer keys its retry and refresh decisions off — falling back to the raw response text
|
|
55
|
+
* and finally to the status line. Every message the far end supplied goes through
|
|
56
|
+
* `sanitizeErrorText` first: the text ends in an exception that applications log verbatim, and
|
|
57
|
+
* none of it is this driver's.
|
|
58
|
+
*/
|
|
59
|
+
export declare function translateErrorBody(status: number, text: string): CamusError;
|
|
60
|
+
/** Reads a body as text, reporting an empty string when it cannot be read. */
|
|
61
|
+
export declare function readBody(response: Response): Promise<string>;
|
|
62
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjC,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAEhC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAExB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAE9D,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEpC,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAED,sFAAsF;AACtF,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAgBxG;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAuB3E;AAED,8EAA8E;AAC9E,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlE"}
|
|
@@ -0,0 +1,169 @@
|
|
|
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 { CamusError } from '../errors.js';
|
|
8
|
+
import { CamusErrorCode } from '../error-codes.js';
|
|
9
|
+
import { parseLossless, stringifyLossless } from '../json.js';
|
|
10
|
+
import { sanitizeErrorText } from './error-text.js';
|
|
11
|
+
/**
|
|
12
|
+
* Sends one request and reports the response, whatever its status.
|
|
13
|
+
*
|
|
14
|
+
* A failure to reach the node at all — a refused connection, a DNS failure, a deadline — is turned
|
|
15
|
+
* into a `CamusError` here, and the endpoint is set aside in the pool. A non-2xx status is left to
|
|
16
|
+
* the caller, because only the caller knows whether the route treats one as an error.
|
|
17
|
+
*
|
|
18
|
+
* A cancellation the caller asked for is re-thrown as it is. It is not a database failure, the
|
|
19
|
+
* node is not unreachable, and turning it into a `CamusError` would hide the caller's own intent.
|
|
20
|
+
*/
|
|
21
|
+
export async function sendHttp(pool, init) {
|
|
22
|
+
const url = buildUrl(init.endpoint, init.path, init.query);
|
|
23
|
+
const headers = { Accept: init.accept ?? 'application/json' };
|
|
24
|
+
let body;
|
|
25
|
+
if (init.body !== undefined) {
|
|
26
|
+
headers['Content-Type'] = 'application/json';
|
|
27
|
+
body = stringifyLossless(init.body);
|
|
28
|
+
}
|
|
29
|
+
if (init.token !== undefined && init.token.length > 0) {
|
|
30
|
+
headers.Authorization = `Bearer ${init.token}`;
|
|
31
|
+
}
|
|
32
|
+
const { signal, dispose } = combineSignals(init.timeoutSeconds, init.signal);
|
|
33
|
+
try {
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method: init.method,
|
|
36
|
+
headers,
|
|
37
|
+
...(body === undefined ? {} : { body }),
|
|
38
|
+
signal: signal ?? null,
|
|
39
|
+
// A driver must never follow a redirect: a redirected statement would leave the endpoint the
|
|
40
|
+
// operator configured, taking its bearer token with it.
|
|
41
|
+
redirect: 'error',
|
|
42
|
+
});
|
|
43
|
+
return { status: response.status, response };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
// The caller ended the request. That is not a transport failure and the node is fine.
|
|
47
|
+
if (init.signal?.aborted === true)
|
|
48
|
+
throw error;
|
|
49
|
+
pool?.markUnreachable(init.endpoint);
|
|
50
|
+
throw new CamusError(CamusErrorCode.Generic, describeTransportFailure(url, error), { cause: error });
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
dispose();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Sends a request and reads a JSON body. A non-2xx status becomes a `CamusError`. */
|
|
57
|
+
export async function sendJson(pool, init) {
|
|
58
|
+
const { response } = await sendHttp(pool, init);
|
|
59
|
+
const text = await readBody(response);
|
|
60
|
+
if (!response.ok)
|
|
61
|
+
throw translateErrorBody(response.status, text);
|
|
62
|
+
if (text.length === 0) {
|
|
63
|
+
throw new CamusError(CamusErrorCode.Generic, 'Empty result returned');
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
return parseLossless(text);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new CamusError(CamusErrorCode.Generic, 'Empty result returned', { cause: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Turns a failed HTTP call into a `CamusError`.
|
|
74
|
+
*
|
|
75
|
+
* The server's `{status, code, message}` body is preferred — it carries the `CADBxxxx` code the
|
|
76
|
+
* client layer keys its retry and refresh decisions off — falling back to the raw response text
|
|
77
|
+
* and finally to the status line. Every message the far end supplied goes through
|
|
78
|
+
* `sanitizeErrorText` first: the text ends in an exception that applications log verbatim, and
|
|
79
|
+
* none of it is this driver's.
|
|
80
|
+
*/
|
|
81
|
+
export function translateErrorBody(status, text) {
|
|
82
|
+
if (text.length > 0) {
|
|
83
|
+
try {
|
|
84
|
+
const body = parseLossless(text);
|
|
85
|
+
if (typeof body === 'object' && body !== null) {
|
|
86
|
+
const record = body;
|
|
87
|
+
if (typeof record.code === 'string' || typeof record.message === 'string') {
|
|
88
|
+
return new CamusError(typeof record.code === 'string' ? record.code : CamusErrorCode.Generic, sanitizeErrorText(typeof record.message === 'string' ? record.message : ''));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Not a JSON error envelope. The raw text is the next best diagnosis.
|
|
94
|
+
}
|
|
95
|
+
return new CamusError(CamusErrorCode.Generic, sanitizeErrorText(text));
|
|
96
|
+
}
|
|
97
|
+
return new CamusError(CamusErrorCode.Generic, `The server answered HTTP ${String(status)} with no body.`);
|
|
98
|
+
}
|
|
99
|
+
/** Reads a body as text, reporting an empty string when it cannot be read. */
|
|
100
|
+
export async function readBody(response) {
|
|
101
|
+
try {
|
|
102
|
+
return await response.text();
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function buildUrl(endpoint, path, query) {
|
|
109
|
+
let base = endpoint.trim();
|
|
110
|
+
if (!base.endsWith('/'))
|
|
111
|
+
base += '/';
|
|
112
|
+
const url = new URL(path.map((segment) => encodeURIComponent(segment)).join('/'), base);
|
|
113
|
+
if (query !== undefined) {
|
|
114
|
+
for (const [key, value] of Object.entries(query))
|
|
115
|
+
url.searchParams.set(key, value);
|
|
116
|
+
}
|
|
117
|
+
return url.toString();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* One signal that ends the request when either the deadline passes or the caller cancels.
|
|
121
|
+
*
|
|
122
|
+
* `AbortSignal.any` keeps a strong reference to its inputs, and a timeout signal keeps a timer
|
|
123
|
+
* alive, so both are released once the request settles.
|
|
124
|
+
*/
|
|
125
|
+
function combineSignals(timeoutSeconds, callerSignal) {
|
|
126
|
+
const hasTimeout = timeoutSeconds > 0;
|
|
127
|
+
if (!hasTimeout)
|
|
128
|
+
return { signal: callerSignal, dispose: () => undefined };
|
|
129
|
+
const controller = new AbortController();
|
|
130
|
+
const timer = setTimeout(() => {
|
|
131
|
+
controller.abort(new CamusError(CamusErrorCode.Generic, `The request timed out after ${String(timeoutSeconds)}s.`));
|
|
132
|
+
}, timeoutSeconds * 1000);
|
|
133
|
+
// Node keeps the process alive for a pending timer; a driver's deadline must not do that.
|
|
134
|
+
timer.unref?.();
|
|
135
|
+
if (callerSignal === undefined) {
|
|
136
|
+
return { signal: controller.signal, dispose: () => clearTimeout(timer) };
|
|
137
|
+
}
|
|
138
|
+
const onAbort = () => controller.abort(callerSignal.reason);
|
|
139
|
+
if (callerSignal.aborted)
|
|
140
|
+
onAbort();
|
|
141
|
+
else
|
|
142
|
+
callerSignal.addEventListener('abort', onAbort, { once: true });
|
|
143
|
+
return {
|
|
144
|
+
signal: controller.signal,
|
|
145
|
+
dispose: () => {
|
|
146
|
+
clearTimeout(timer);
|
|
147
|
+
callerSignal.removeEventListener('abort', onAbort);
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function describeTransportFailure(url, error) {
|
|
152
|
+
// The URL is this driver's own, not the far end's, so it is safe to name. The error text is not:
|
|
153
|
+
// fetch puts the request URL, and sometimes headers, in its own message.
|
|
154
|
+
const detail = error instanceof Error ? sanitizeErrorText(error.message) : '';
|
|
155
|
+
const cause = error?.cause?.code;
|
|
156
|
+
const host = safeHost(url);
|
|
157
|
+
if (cause !== undefined)
|
|
158
|
+
return `Cannot reach ${host}: ${cause}`;
|
|
159
|
+
return detail.length > 0 ? `Cannot reach ${host}: ${detail}` : `Cannot reach ${host}.`;
|
|
160
|
+
}
|
|
161
|
+
function safeHost(url) {
|
|
162
|
+
try {
|
|
163
|
+
return new URL(url).origin;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return 'the CamusDB endpoint';
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=http.js.map
|